sklearn交叉驗證 老魚學sklearn

2022-02-10 04:38:28 字數 2911 閱讀 4459

交叉驗證(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次的**準確平均率

# 視覺化資料

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交叉驗證3 老魚學sklearn

在上乙個博文中,我們用learning curve函式來確定應該擁有多少的訓練集能夠達到效果,就像乙個人進行學習時需要做多少題目就能擁有較好的考試成績了。本次我們來看下如何調整學習中的引數,類似乙個人是在早上7點鐘開始讀書好還是晚上8點鐘讀書好。資料仍然利用手寫數字識別作為訓練資料 from skl...

sklearn資料庫 老魚學sklearn

在做機器學習時需要有資料進行訓練,幸好sklearn提供了很多已經標註好的資料集供我們進行訓練。本節就來看看sklearn提供了哪些可供訓練的資料集。這些資料位於datasets中,為 載入波士頓房價資料,可以用於線性回歸用 sklearn.datasets.load boston 載入方式為 fr...

sklearn儲存模型 老魚學sklearn

訓練好了乙個model 以後總需要儲存和再次 所以儲存和讀取我們的sklearn model也是同樣重要的一步。比如,我們根據 樣本資料訓練了一下房價模型,當使用者輸入自己的房子後,我們就需要根據訓練好的房價模型來 使用者房子的 這樣就需要在訓練模型後把模型儲存起來,在使用模型時把模型讀取出來對輸入...