【sklearn的一般流程】sklearn的一般流程,以鸢尾花分类为例

1. 数据的获取

sklearn是个非常强大的工具库,它自带了很多数据集,我们用iris(鸢尾花)作为本次的数据集。
sklearn自带的数据集
我们先把标准库导入,再调用sklearn的datasets函数导入iris数据集

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# 1.get the dataset
from sklearn import datasets
iris = datasets.load_iris()
X = iris.data
y = iris.target

iris:我们获取到的iris数据集是一个bunch格式(可以直接理解为字典)
【sklearn的一般流程】sklearn的一般流程,以鸢尾花分类为例
X:特征值,共4种样例:sepal length (cm),sepal width (cm),petal length (cm),petal width (cm)。其值均为数字。
【sklearn的一般流程】sklearn的一般流程,以鸢尾花分类为例
y:标签,共有3种分类:setosa,versicolor,virginica。其值分别以0,1,2表示。
如图所示:
【sklearn的一般流程】sklearn的一般流程,以鸢尾花分类为例

2. 数据预处理

特征缩放

我们可以观察到X的值之间相差比较大,为了能够得到更好的分类效果,我们采用特征缩放对数据进行处理。这里用到的是MinMaxScaler特征缩放的其他方式

from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler(feature_range=(0,1))
X = scaler.fit_transform(X)

缩放后的特征值:
【sklearn的一般流程】sklearn的一般流程,以鸢尾花分类为例

切割训练集和测试集

将1/3作为测试集,2/3作为训练集

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 1/3, random_state = 0)

切割后的数据集
【sklearn的一般流程】sklearn的一般流程,以鸢尾花分类为例
可以看到分为了50个测试集和100个训练集

3.训练模型

这里用了SVC分类器,核函数为线性核函数。这里记得设置probability = True,这样才能用predict_proba()函数查看每种类别的概率。

from sklearn.svm import SVC
classifier = SVC(kernel = "linear", probability = True)
classifier.fit(X_train, y_train)
# predict the result
y_pred = classifier.predict(X_test)
# 查看每种类别的概率
y_pred_proba = classifier.predict_proba(X_test)

来看看分类的结果:
【sklearn的一般流程】sklearn的一般流程,以鸢尾花分类为例

4.模型的评估

模型的评估和模型的优化相关功能在sklearn.model_select中,
除了使用extimator的score函数简单粗略地评估模型之外,
在sklearn.metrics针对不同的问题类型提供了各种评估指标并且可以创建用户自定义的评估指标。
可以采用交叉验证的方法评估模型的泛化能力,并且能够有效避免过拟合。

查看参数 get_params()

params = classifier.get_params()

【sklearn的一般流程】sklearn的一般流程,以鸢尾花分类为例

查看模型评分 score(X_test, y_test)

score = classifier.score(X_test, y_test)   

其评分结果为:96%,分类效果算很好的了。

查看分类模型的评分报告 classification_report()

from sklearn.metrics import classification_report
report = classification_report(y_test, y_pred)

生成的报告非常详细,包括三个分类的precision(准确率),recall(召回率),f1-score(f1分数),support(支持率)
【sklearn的一般流程】sklearn的一般流程,以鸢尾花分类为例

用交叉验证评分 cross_val_score

设置cv = 5,即分为5份进行分割

from sklearn.cross_validation import cross_val_score
scores = cross_val_score(classifier ,X, y, cv = 5)

其评分结果分别为:96.7%,96.7%,96.7%,93.3%,100%

5.模型的优化

优化模型的方法包括:网格搜索法、随机搜索法、模型特定交叉验证,信息准则优化。
网格搜索法在指定的超参数空间中对每一种可能的情况进行交叉验证评分并选出最好的超参数模型。

from sklearn.model_selection import GridSearchCV
# 估计器
svc = SVC()
# 超参数空间
param_grid = [{'C':[0.1, 1, 10, 100, 1000], 'kernel':['linear']},
               {'C':[0.1, 1, 10, 100, 1000], 'kernel':['rbf'], 'gamma':[0.001, 0.01]}]
# 一共15种情况

# 评分函数
scoring = 'accuracy'

# 指定采样方法, clf即最佳模型
clf = GridSearchCV(svc, param_grid, scoring= scoring, cv = 10) # 返回最佳模型
clf.fit(X_train, y_train)
y_pred_best = clf.predict(X_test) 

score_best = clf.score(X_test, y_pred_best)  # 100%
params_best = clf.get_params()   # 最优模型的参数

最优模型的参数:
【sklearn的一般流程】sklearn的一般流程,以鸢尾花分类为例

6.模型持久化

可以使用python内置的pickle模块,或将训练好的模型保存到磁盘或字符串,以便将来使用,而不用重新训练。对于sklearn,使用joblib会更有效,但是只能保存到磁盘而不能保存成字符串。

pickle

python自带的pickle模块实现了基本的数据序列和反序列化。
具体使用可以参考菜鸟教程

import pickle
with open('clf.pkl', 'wb') as f:
    pickle.dump(clf, f)    # 存

with open('clf.pkl','rb') as f:
    clf2 = pickle.load(f)  # 取

y2_pred = clf2.predict(X_test)

joblib

from sklearn.externals import joblib
joblib.dump(clf, 'clf_joblib.pkl')  # 与pickle用法非常类似
clf3 = joblib.load('clf_joblib.pkl')
y3_pred = clf3.predict(X_test)

本节代码