python k折交叉驗證 機器學習之K折交叉驗證

2021-10-17 03:03:35 字數 4165 閱讀 2539

本文主題:使用 train/test split 進行模型評估的缺點

k-fold cross-validation 如何克服這些缺點

k-fold cross-validation 如何用於引數調優以及選擇模型和特徵

k-fold cross-validation 可能的改進措施

1. 使用 train/test split 進行模型評估的缺點

train/test split 是將原始資料集劃分為訓練集/測試集,避免了為了追求高準確率而在訓練集上產生過擬合,從而使得模型在樣本外的資料上**準確率高。

# 使用 train/test split, random_state=4

x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=4)

# 評估模型的分類準確率

knn = kneighborsclassifier(n_neighbors=5)

knn.fit(x_train, y_train)

print(knn.score(x_test, y_test))

0.973684210526

# 改變 random_state=3

x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=3)

# 評估模型的分類準確率

knn = kneighborsclassifier(n_neighbors=5)

knn.fit(x_train, y_train)

print(knn.score(x_test, y_test))

0.947368421053

為了消除這一變化因素,我們可以建立一系列訓練集/測試集,計算模型在每個測試集上的準確率,然後計算平均值。

這就是 k-fold cross-validation 的本質。

2. k-fold cross-validation 如何克服這些缺點

k-fold cross-validation的步驟:將原始資料集劃分為相等的k部分(「折」)

將第1部分作為測試集,其餘作為訓練集

訓練模型,計算模型在測試集上的準確率

每次用不同的部分作為測試集,重複步驟2和3 k次

將平均準確率作為最終的模型準確率

模擬5-fold cross-validation:

from sklearn.cross_validation import kfold

kf = kfold(25, n_folds=5, shuffle=false)

# 列印每個訓練集和測試集

print('{} {}'.format('iteration', 'training set observations', 'testing set observations'))

for iteration, data in enumerate(kf, start=1):

print(' {} '.format(iteration, str(data[0]), str(data[1])))

5折交叉驗證執行了5次迭代

每次迭代,每個樣本只在訓練集中或者測試集中

每個樣本只在測試集**現一次

對比 cross-validation 和 train/test split 可以發現:cross-validation 對於樣本外資料有更高的準確率

cross-validation 更有效的發揮樣本的作用

3. k-fold cross-validation 如何用於引數調優以及選擇模型和特徵

以 knn 模型為例,當 knn 的 k=5 時, 10-fold cross-validation (k-fold cross-validation 的 k 可以選擇任意整數,但通常選擇10,這是實踐中效果最好的值)過程如下:

from sklearn.neighbors import kneighborsclassifier

from sklearn.cross_validation import cross_val_score

# 例項化knn模型,knn的k=5

knn = kneighborsclassifier(n_neighbors=5)

# 10-fold cross-validation,cv=10

scores = cross_val_score(knn, x, y, cv=10, scoring='accuracy')

print(scores)

[ 1. 0.93333333 1. 1. 0.86666667 0.93333333

0.93333333 1. 1. 1. ]

# 計算平均值

print(scores.mean())

0.966666666667

```注意:cross_val_score() 傳入的 x 和 y 是原始特徵和標籤,而非經過 train/test split 的訓練集。劃分過程由 cross_val_score() 函式內完成。

利用 10-fold cross-validation 尋找 knn 模型中效果最好的 k:

k_range = list(range(1, 31)) # k的範圍[1, 30]

k_scores = # 存放每個k的評價結果

for k in k_range:

knn = kneighborsclassifier(n_neighbors=k)

scores = cross_val_score(knn, x, y, cv=10, scoring='accuracy')

print(k_scores)

[0.95999999999999996, 0.95333333333333337, 0.96666666666666656,

0.96666666666666656, 0.96666666666666679, 0.96666666666666679,

0.96666666666666679, 0.96666666666666679, 0.97333333333333338,

0.96666666666666679, 0.96666666666666679, 0.97333333333333338,

0.98000000000000009, 0.97333333333333338, 0.97333333333333338,

0.97333333333333338, 0.97333333333333338, 0.98000000000000009,

0.97333333333333338, 0.98000000000000009, 0.96666666666666656,

0.96666666666666656, 0.97333333333333338, 0.95999999999999996,

0.96666666666666656, 0.95999999999999996, 0.96666666666666656,

0.95333333333333337, 0.95333333333333337, 0.95333333333333337]

# 將結果視覺化

import matplotlib.pyplot as plt

%matplotlib inline

# plot the value of k for knn (x-axis) versus the cross-validated accuracy (y-axis)

plt.plot(k_range, k_scores)

plt.xlabel('value of k for knn')

plt.ylabel('cross-validated accuracy')

準確率最高的 knn 的 k的範圍是[13, 20],整個曲線的形狀是倒u形。考慮偏差方差平衡,偏低的k值產生低偏差和高方差,較高的k值產生高偏差和低方差,最好的模型k值應折中,以平衡偏差和方差。

在 knn 模型中,通常建議選擇使得模型最簡單的k值,越高的k會使模型複雜性越低,因此此例中選擇 k=20 作為最好的 knn 模型。

4. k-fold cross-validation 可能的改進措施重複利用不同的隨機分組資料進行交叉驗證

降低交叉驗證單一方案的方差來提高樣本外的**準確率

將原始資料中的一部分資料設定為 "hold-out set",在其餘部分進行 cv 的整個過程,但模型最終準確率為模型在 hold-out set 上的準確率,因為 hold-out set 相當於樣本外的資料

k折交叉驗證

在做機器學習這方面研究的時候,例如pcr和pls等演算法時常會遇到最佳潛變數的選取,神經元個數的選取 這些引數的選取對模型的質量產生極大的影響。如果人為選取,這樣是十分不可靠的也是不現實的。進行交叉驗證是乙個優秀模型形成必不可少的過程。交叉驗證的目的是為了得到更為穩健可靠的模型。交叉驗證的方法有許多...

K折交叉驗證

k 層交叉檢驗之後,我們得到 k 個不同的模型誤差估算值 e1,e2 ek 理想的情況是,這些誤差值相加得 0 要計算模型的偏誤,我們把所有這些誤差值相加。平均值越低,模型越優秀。模型表現變化程度的計算與之類似。取所有誤差值的標準差,標準差越 明模型隨訓練資料的變化越小。from sklearn i...

十折交叉驗證

交叉驗證主要分成以下幾類 1 k folder cross validation k個子集,每個子集均做一次測試集,其餘的作為訓練集。交叉驗證重複k次,每次選擇乙個子集作為測試集,並將k次的平均交叉驗證識別正確率作為結果。優點 所有的樣本都被作為了訓練集和測試集,每個樣本都被驗證一次。10 fold...