1. 程式人生 > >sklearn交叉驗證-【老魚學sklearn】

sklearn交叉驗證-【老魚學sklearn】

logs 數值 可視化 tar [] spl img mode ear

交叉驗證(Cross validation),有時亦稱循環估計, 是一種統計學上將數據樣本切割成較小子集的實用方法。於是可以先在一個子集上做分析, 而其它子集則用來做後續對此分析的確認及驗證。 一開始的子集被稱為訓練集。而其它的子集則被稱為驗證集或測試集。交叉驗證是一種評估統計分析、機器學習算法對獨立於訓練數據的數據集的泛化能力(generalize)。

我們以分類花的例子來看下:

# 加載iris數據集
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from
sklearn.neighbors import KNeighborsClassifier iris = load_iris() X = iris.data y = iris.target # 分割訓練集和測試集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3) # 建立模型 model = KNeighborsClassifier() # 訓練模型 model.fit(X_train, y_train) # 將準確率打印出 print(model.score(X_test, y_test))

這樣這個模型的得分為:
0.911111111111

但是如果我再運行一下,這個得分又會變成:
0.955555555556

如果再進行多次運行,這個得分的結果就又會不一樣。
為了能夠得出一個相對比較準確的得分,一般是進行多次試驗,並且是用不同的訓練集和測試集進行。

這個叫做交叉驗證,一般有留一法,也就是把原始數據分成十份,其中一份作為測試,其它的作為訓練集,並且可以循環來選取其中的一份作為測試集,剩下的作為訓練集。
當然,這裏只是提供一個基本思想,具體你要分成幾份可以自己來定義。

比如,下面的代碼我們定義了5份並做了5次實驗:

# 加載iris數據集
from sklearn.datasets import
load_iris from sklearn.model_selection import train_test_split, cross_val_score from sklearn.neighbors import KNeighborsClassifier iris = load_iris() X = iris.data y = iris.target # 建立模型 model = KNeighborsClassifier() # 使用K折交叉驗證模塊 scores = cross_val_score(model, X, y, cv=5) # 將5次的預測準確率打印出 print(scores)

輸出為:

[ 0.96666667  1.          0.93333333  0.96666667  1.        ]

對這幾次實驗結果進行一下平均作為本次實驗的最終得分:

# 將5次的預測準確平均率打印出
print(scores.mean())

結果為:
0.973333333333

在KNN算法中,其中有個neighbors參數,我們可以修改此參數的值:

model = KNeighborsClassifier(n_neighbors=5)

但這個參數值選擇哪個數字為最佳呢?
我們可以通過程序來不停選擇這個值並看在不同數值下其對應的得分情況,最終可以選擇得分較好對應的參數值:

# 加載iris數據集
from sklearn.datasets import load_iris
from sklearn.model_selection import cross_val_score
from sklearn.neighbors import KNeighborsClassifier
# 可視化模塊
import matplotlib.pyplot as plt

iris = load_iris()
X = iris.data
y = iris.target

# 建立測試參數集
k_range = range(1, 31)
k_scores = []

for k in k_range:
    # 建立模型
    model = KNeighborsClassifier(n_neighbors=k)

    # 使用K折交叉驗證模塊
    scores = cross_val_score(model, X, y, cv=10)

    # 計算10次的預測準確平均率
    k_scores.append(scores.mean())

# 可視化數據
plt.plot(k_range, k_scores)
plt.show()

顯示的圖形為:
技術分享圖片

從這個結果圖上看,n_neighbors太小或太大其精確度都會下降,因此比較好的取值是5-20之間。

另外對於回歸算法,需要用損失函數來進行評估:

loss = -cross_val_score(model, data_X, data_y, cv=10, scoring=‘neg_mean_squared_error‘)

sklearn交叉驗證-【老魚學sklearn】