结果部署是机器学习的最后一步。
选定算法之后,对算法训练生成模型,并部署到生产环境上,以便利用机器学习解决实际问题。
模型生成之后,也需要定期对模型进行更行,是模型处于最新,最有效的状态,通常建议3-6月更新一次模型。
生成的模型序列化之后,当有新的数据出现时,需要反序列化已保存的模型,然后用其预测新的数据。
接下来介绍在Python中如何序列化和反序列化scikit-learn的模型。包括:
- 通过pickle来序列化和反序列化机器学习模型
- 通过joblib来序列化和反序列化机器学习模型
pickle序列化和反序列化机器学习模型
pickle是标准的Python序列化方法,可以通过它来序列化机器学习算法生成的模型,并将其保存到文件中。
当需要对新数据进行预测时,将保存在文件中的模型反序列化,并用其来预测新的数据。
1 #pickle的使用 2 from pandas import read_csv 3 from sklearn.model_selection import train_test_split 4 from sklearn.linear_model import LogisticRegression 5 from pickle import dump 6 from pickle import load 7 8 filename=‘/home/aistudio/work/pima_data1.csv‘ 9 names=[‘preg‘,‘plas‘,‘pres‘,‘skin‘,‘test‘,‘mass‘,‘pedi‘,‘age‘,‘class‘] 10 data=read_csv(filename,names=names) 11 #将数据分为输入数据和输出数据 12 array=data.values 13 x=array[:,0:8] 14 y=array[:,8] 15 test_size=0.33 16 seed=4 17 x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=test_size,random_state=seed) 18 #训练模型 19 model=LogisticRegression() 20 model.fit(x_train,y_train) 21 22 #保存模型 23 model_file=‘finalzied_model.sav‘ 24 with open(model_file,‘wb‘) as model_f: 25 #模型序列化 26 dump(model,model_f) 27 28 #加载模型 29 with open(model_file,‘rb‘) as model_f: 30 #模型反序列化 31 loaded_model=load(model_f) 32 result=loaded_model.score(x_test,y_test) 33 print(‘算法评估结果:%.3f%%‘ % (result * 100))
算法评估结果:80.315%
通过Joblib序列化与反序列化
joblib是Scipy生态环境的一部分,提供了通用的工具来序列化python的对象和反序列化python的对象。
通过joblib序列化对象时会采用Numpy的格式保存数据,这对某些保存数据到模型的算法非常有效,如K近邻算法。
1 #joblib的使用 2 from pandas import read_csv 3 from sklearn.model_selection import train_test_split 4 from sklearn.linear_model import LogisticRegression 5 from sklearn.externals.joblib import dump 6 from sklearn.externals.joblib import load 7 8 filename=‘/home/aistudio/work/pima_data1.csv‘ 9 names=[‘preg‘,‘plas‘,‘pres‘,‘skin‘,‘test‘,‘mass‘,‘pedi‘,‘age‘,‘class‘] 10 data=read_csv(filename,names=names) 11 #将数据分为输入数据和输出数据 12 array=data.values 13 x=array[:,0:8] 14 y=array[:,8] 15 test_size=0.33 16 seed=4 17 x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=test_size,random_state=seed) 18 #训练模型 19 model=LogisticRegression() 20 model.fit(x_train,y_train) 21 22 #保存模型 23 model_file=‘finalzied_model_joblib.sav‘ 24 with open(model_file,‘wb‘) as model_f: 25 #模型序列化 26 dump(model,model_f) 27 28 #加载模型 29 with open(model_file,‘rb‘) as model_f: 30 #模型反序列化 31 loaded_model=load(model_f) 32 result=loaded_model.score(x_test,y_test) 33 print(‘算法评估结果:%.3f%%‘ % (result * 100))
算法评估结果:80.315%
生成模型的技巧
在生成机器学习模型时,需要考虑以下几个问题:
- python版本:要记录python的版本,大部分情况下,在序列化和反序列化模型时,需要使用相同的python版本。
- 类库版本:同样需要记录所有主要类库的版本,因为在序列化模型和反序列化模型时需要使用相同版本的类库,不仅需要scipy和scikit-learn版本一致,其他类库版本也需要一致。
- 手动序列化:有时需要手动序列化算法,这样可以直接在scikit-learn中或其它平台重现这个模型。我们通常会花费大量的时间在选择算法和参数调整上,将这个过程手动记录下来比仅序列化模型更有价值。