P38 模型的保存与加载

 

 保存模型主要指:保存模型训练好的权重。

 

 以房价预测的岭回归为例:

#load_boston里面的数值都是连续的
import math
from sklearn.datasets import load_boston
#从sklearn中的线性模型导入线性回归,SGD随机梯度下降
from sklearn.linear_model import LinearRegression,SGDRegressor,Ridge
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error
from sklearn.externals import joblib #模型的保存与加载模块

def mylinear():
    """
    线性回归预测房子价格
    :return:
    """
    # 获取数据
    lb=load_boston()
    # 分割数据集到训练集和测试集
    x_train,x_test,y_train,y_test=train_test_split(lb.data,lb.target,test_size=0.25)

    #print(y_train) #打印训练样本
    #print("\n")
    #print(y_test) #打印测试样本
    # 对特征值进行标准化处理,目标值要不要进行标准化处理?答:也要标准化,因为特征值标准化之后,乘以小权重之后,得到
    # 的值肯定也很小,这与原本的目标值相差会很大
    # 特征值和目标值都必须进行标准化处理,实例化两个标准化API
    std_x=StandardScaler()

    x_train=std_x.fit_transform(x_train)
    x_test=std_x.fit_transform(x_test)

    # 对目标值进行标准化
    std_y=StandardScaler()

    y_train=std_y.fit_transform(y_train.reshape(-1,1)) #样本训练标签y_train源程序提供的是1维数据,
    # 这里要做一个维度的形状转换,1维->2维,不知道有多少个样本,所以第一个参数是"-1",但是每个样本都只有一个目标值
    y_test=std_y.transform(y_test.reshape(-1,1))

    #y_train=std_y.fit_transform(y_train) #样本训练标签y_train源程序提供的是1维数据,
    # 这里要做一个维度的形状转换,1维->2维,不知道有多少个样本,所以第一个参数是"-1",但是每个样本都只有一个目标值
    #x_test=std_y.transform(y_test)




    #estimator预测


    # 通过岭回归的方式进行房价预测:
    sgd_Ridge=Ridge(alpha=1.0) #alpha是回归力度参数
    sgd_Ridge.fit(x_train,y_train)
    sgd_Ridge.coef_=sgd_Ridge.coef_.reshape(1,-1)
    #print("通过岭回归的方法迭代求解的回归方程的系数是:\n",sgd_Ridge.coef_) # 打印出求解的权重参数

    # 保存训练好的模型
    joblib.dump(sgd_Ridge,"./tmp/test.pkl")


    # 之前标准化了,现在转化回去,不然预测的都是小值
    #sgd_Ridge_predict = std_y.inverse_transform(sgd_Ridge.predict(x_test))  # 这个是根据测试样本预测的价格
    #sgd_Ridge_predict=sgd_Ridge_predict.reshape(-1,1)
    #print("岭回归的方法,测试集里面每个测试样本中房子的预测价格是:\n",sgd_Ridge_predict) #打印出预测价格
    #jfwc=mean_squared_error(std_y.inverse_transform(y_test), sgd_Ridge_predict)
    #print("岭回归的均方误差是:","%.1f"%jfwc ,"\n        标准差是:","%.1f"%math.sqrt(jfwc),"单位是:万元")


    return None





if __name__=="__main__":
    mylinear()

运行的结果是在写的文件夹中生成一个.pkl文件,如下:

 

 下面利用保存的模型进行预测:

#load_boston里面的数值都是连续的
import math
from sklearn.datasets import load_boston
#从sklearn中的线性模型导入线性回归,SGD随机梯度下降
from sklearn.linear_model import LinearRegression,SGDRegressor,Ridge
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error
from sklearn.externals import joblib #模型的保存与加载模块

def mylinear():
    """
    线性回归预测房子价格
    :return:
    """
    # 获取数据
    lb=load_boston()
    # 分割数据集到训练集和测试集
    x_train,x_test,y_train,y_test=train_test_split(lb.data,lb.target,test_size=0.25)

    #print(y_train) #打印训练样本
    #print("\n")
    #print(y_test) #打印测试样本
    # 对特征值进行标准化处理,目标值要不要进行标准化处理?答:也要标准化,因为特征值标准化之后,乘以小权重之后,得到
    # 的值肯定也很小,这与原本的目标值相差会很大
    # 特征值和目标值都必须进行标准化处理,实例化两个标准化API
    std_x=StandardScaler()

    x_train=std_x.fit_transform(x_train)
    x_test=std_x.fit_transform(x_test)

    # 对目标值进行标准化
    std_y=StandardScaler()

    y_train=std_y.fit_transform(y_train.reshape(-1,1)) #样本训练标签y_train源程序提供的是1维数据,
    # 这里要做一个维度的形状转换,1维->2维,不知道有多少个样本,所以第一个参数是"-1",但是每个样本都只有一个目标值
    y_test=std_y.transform(y_test.reshape(-1,1))

    #y_train=std_y.fit_transform(y_train) #样本训练标签y_train源程序提供的是1维数据,
    # 这里要做一个维度的形状转换,1维->2维,不知道有多少个样本,所以第一个参数是"-1",但是每个样本都只有一个目标值
    #x_test=std_y.transform(y_test)




    #estimator预测


    # 通过岭回归的方式进行房价预测:
    sgd_Ridge=Ridge(alpha=1.0) #alpha是回归力度参数
    sgd_Ridge.fit(x_train,y_train)
    sgd_Ridge.coef_=sgd_Ridge.coef_.reshape(1,-1)
    #print("通过岭回归的方法迭代求解的回归方程的系数是:\n",sgd_Ridge.coef_) # 打印出求解的权重参数

    # 保存训练好的模型
    joblib.dump(sgd_Ridge,"./tmp/test.pkl")

    #使用预训练后保存的模型进行房价预测
    model=joblib.load("./tmp/test.pkl")
    y_perdict=std_y.inverse_transform(model.predict(x_test))
    print("使用保存的模型进行预测,结果是:\n",y_perdict)


    return None





if __name__=="__main__":
    mylinear()

运行结果:

使用保存的模型进行预测,结果是:
[[22.73744592]
[25.6768729 ]
[12.80263561]
[12.20050118]
...

[13.79863196]
[ 6.12208385]

[12.87330096]
[13.1674153 ]]

Process finished with exit code 0

 

posted on 2020-12-24 15:34  一杯明月  阅读(188)  评论(0编辑  收藏  举报