【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格式(可以直接理解爲字典)
X:特徵值,共4種樣例:sepal length (cm),sepal width (cm),petal length (cm),petal width (cm)。其值均爲數字。
y:標籤,共有3種分類:setosa,versicolor,virginica。其值分別以0,1,2表示。
如圖所示:
2. 數據預處理
特徵縮放
我們可以觀察到X的值之間相差比較大,爲了能夠得到更好的分類效果,我們採用特徵縮放對數據進行處理。這裏用到的是MinMaxScaler,特徵縮放的其他方式。
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler(feature_range=(0,1))
X = scaler.fit_transform(X)
縮放後的特徵值:
切割訓練集和測試集
將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)
切割後的數據集
可以看到分爲了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)
來看看分類的結果:
4.模型的評估
模型的評估和模型的優化相關功能在sklearn.model_select中,
除了使用extimator的score函數簡單粗略地評估模型之外,
在sklearn.metrics針對不同的問題類型提供了各種評估指標並且可以創建用戶自定義的評估指標。
可以採用交叉驗證的方法評估模型的泛化能力,並且能夠有效避免過擬合。
查看參數 get_params()
params = classifier.get_params()
查看模型評分 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(支持率)
用交叉驗證評分 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() # 最優模型的參數
最優模型的參數:
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)