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