sklearn机器学习的一般流程为:数据获取——>数据预处理——>模型训练——>模型评估——>模型优化——>模型持久化
( 以鸢尾花数据集为例)
数据获取
可导入内部数据集,计算机生成的数据集,网络上的数据集,文件中的数据集等。
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from sklearn import datasets
iris=datasets.load_iris()#导入鸢尾花数据集
iris.data #数据集
iris['target'] #标签
# 利用dataframe做可视化分析
df=pd.DataFrame(iris.data,columns=iris.feature_names)#用鸢尾花的特征做列名
df['target']=iris.target#把标签集插入最后一列
print(df.head())#显示数据前五行
把表格绘制成折线图
df.plot(figsize=(12,8))#把表格绘制成折线图
plt.show()
可以明显看出鸢尾花的特征和它所属类别的相关性大小。
数据预处理
预处理数据包括:数据的标准化,数据的归一化,数据的二值化,非线性转换,数据特征编码,处理缺失值等。
from sklearn import preprocessing
scaler=preprocessing.MinMaxScaler()#MinMaxScaler把样本缩放到0~1之间
scaler.fit(iris.data)#fit函数可以找到数据的整体指标,如平均值,方差等
data=scaler.transform(iris.data)#transform根据数据的整体指标对数据进行归一化
print(data)
模型的训练
根据问题特点选择适当的估计器estimater模型:
分类(SVC,KNN,LR,NaiveBayes,…)
回归(Lasso,ElasticNet,SVR,…)
聚类(KMeans,…)
降维(PCA,…)
如图为sklearn使用地图
我们当前的问题是根据特征预测鸢尾花的类型,属于带标签的分类问题,并且samples个数为150个小于100K,所以根据sklearn使用地图我们选择Linear_SVC模型进行分类。
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test=train_test_split(data,target,test_size=1/3)#把样本划分为训练集和测试集
#print(len(X_train))
#print(len(X_test))#查看训练集和测试集的样本数量
from sklearn import svm
clf=svm.SVC(kernel='linear',C=1.0,probability=True)#linear表示线性核函数,probability表示是否采用概率估计
clf.fit(X_train,y_train)#用训练集训练模型
clf.predict(X_test)#预测训练集
#查看参数
clf.get_params()
clf.predict_proba(X_test)#查看样本属于每个类型的概率
print(clf.score(X_test,y_test))#查看模型预测的准确率
#对不同类型的模型有不同的评分算法,由score方法内部定义
模型的评估
模型的评估和模型的优化相关功能在sklearn.model_selection中。
除了使用estimator的score函数简单粗略地评估模型的质量之外,在sklearn.metrics模块针对不同的问题类型提供了各种评估指标并且可以创建用户自定义的评估指标。
可以采用交叉验证方法评估模型的泛化能力,有效的避免过度拟合。
k折交叉验证(k=10)示意图:
使用sklearn.metrics模块评估
# 分类模型评估报告
from sklearn.metrics import classification_report
print(classification_report(target,clf.predict(data),
target_names=iris.target_names))#对全体数据集进行评估
使用k折交叉验证
from sklearn.model_selection import cross_val_score#cross_val_score可以用来做交叉验证
scores=cross_val_score(clf,data,target,cv=5)#采用五折交叉验证
print(scores)#输出每次评分
模型的优化
优化模型的方法包括:网格搜索法,随机搜索法,模型特定交叉验证,信息准则优化
网格搜索法在指定的超参数空间中对每一种可能的情况进行交叉验证评分并选出最好的超参数组合
from sklearn import svm
from sklearn.model_selection import GridSearchCV
# 估计器
svc=svm.SVC()
#超参数空间
param_grid=[{'C':[0.1,1,10,100,1000],'kernel':['linear']},
{'C':[0.1,1,10,100,1000],'gamma':[0.001,0.01],'kernel':['rbf']}]
#打分函数
scoring='accuracy'
#指定采样方法
clf=GridSearchCV(svc,param_grid,scoring=scoring,cv=10)#得到一个优化后的分类器
clf.fit(X_train,y_train)#用数据训练分类器
print(clf.best_score_)#查看最优得分
模型持久化
可以使用python内置的pickie模块获奖训练好的模型保存到磁盘,以便将来直接使用。对于sklearn来说,使用oblib会更有效
import pickle
s=pickle.dumps(clf)#把模型保存成字符串
clf2=pickle.loads(s)#从字符串加载模型
clf2.predict(data)#用加载出来的模型进行预测
from sklearn.externals import joblib
joblib.dump(clf,'filename.pkl')#把模型保存到文件,filename为文件名,前提是必须有这个文件存在
clf3=joblib.load('filename.pkl')#加载模型