注:本文是人工智能研究網的學習筆記
模型驗證方法一覽
| 名稱 | 模塊 |
|---|---|
| 通過交叉驗證計算得分 | model_selection.cross_val_score(estimator, X) |
| 對每個輸入點產生交叉驗證估計 | model_selection.cross_val_predict(estimator, X) |
| 計算並繪制模型的學習率曲線 | model_selection.learning_curve(estimator, X, y) |
| 計算並繪制模型的驗證曲線 | model_selection.validation_curve(estimator, ...) |
| 通過排序評估交叉驗證defender重要性 | model_selection.permutation_test_score(...) |
通過交叉驗證計算得分
cross_val_score(estimator, X, y=None, groups=None, scoring=None, cv=None, n_jobs=1, verbose=0, fit_params=None, pre_dispatch='2*n_jobs')
參數:
- estimator: 實現了'fit'函數的學習器
- X: array-like,需要學習的數據,可以是列表或者2d數組
- y: 可選的,默認是None,監督學習中樣本特征向量的真實目標值
- scroing: srting,callable or None,可選的,默認是None,
一個字符串或者一個scorer可調用對象或者函數,必須實現scorer(estimator, X, y) - cv: int,交叉驗證生成器或者一個迭代器,可選的,默認是None,決定交叉驗證划分策略
cv的可選項有以下的幾種
- None: 使用默認的3-fold交叉驗證
- Interger:指定在(Stratified)kfold中使用的‘折’的數量
- 可以用作交叉驗證生成器的一個對象
- 一個能夠產生train/test划分的迭代器對象
對於integer/None類型的輸入,如果estimator是一個分類器並且y是對應的類標簽,則默認使用StratifiedKFold,其他的情況默認使用kfold
返回值:
- scores:浮點數組, shape=(len(list(cv)),)每一次交叉驗證得分弄成一個數組,默認是三次,三個得分。
from sklearn.model_selection import cross_val_score
import numpy as np
from sklearn import datasets, svm
digits = datasets.load_digits()
X = digits.data
y = digits.target
svc = svm.SVC(kernel='linear') # C 結構因子最小化因子
C_s = np.logspace(-10, 0, 10)
print('參數列表長度:', len(C_s))
scores = list()
scores_std = list()
for C in C_s:
svc.C = C
this_scores = cross_val_score(svc, X, y, n_jobs=4) # 指定並行數量
scores.append(np.mean(this_scores))
scores_std.append(np.std(this_scores))
# 繪制交叉驗證曲線
import matplotlib.pyplot as plt
plt.figure(1, figsize=(4,3))
plt.clf()
plt.semilogx(C_s, scores)
plt.semilogx(C_s, np.array(scores) + np.array(scores_std) , 'b--')
plt.semilogx(C_s, np.array(scores) - np.array(scores_std) , 'b--')
locs, labels= plt.yticks()
plt.yticks(locs, list(map(lambda x: "%g" %x, locs)))
plt.ylabel('CV score')
plt.xlabel('Parameter C')
plt.ylim(0, 1.1)
plt.show()

對每個輸入點產生交叉驗證估計
cross_val_predict(estimator, X, y=None, groups=None, cv=None, n_jobs=1, verbose=0, fit_params=None, pre_dispatch='2*n_jobs', method='predict')
參數:
- method 字符串,可選,默認是'predict'
返回值:
- predictions: ndarray 預測結果
計算並繪制模型的學習率曲線
learning_curve(estimator, X, y, groups=None, train_sizes=array([ 0.1 , 0.325, 0.55 , 0.775, 1. ]), cv=None, scoring=None, exploit_incremental_learning=False, n_jobs=1, pre_dispatch='all', verbose=0)
參數:
- train_sizes: array-like, shape(n_ticks,), dtype=float or int 用於指定訓練樣本子集的相對數量或者絕對數量,如果是浮點數,將會被視作整體訓練集最大數量的百分比,所以必須在(0,1)之間,如果是int整型,就是絕對的數量,不能超過整體訓練集的樣本量。對於分類問題,訓練子集的大小必須能夠保證每個類至少有一個樣本。
返回值:
- train_sizes_abs
- train_scores
- test_scores
學習率曲線:
計算指定的學習器模型在不同大小的訓練集上經過交叉驗證的訓練得分和測試得分。
首先,用一個交叉驗證生成器划分整體數據集K次,每一次都有一個訓練集和測試集,然后從第k次的訓練集中拿出若干個數量不斷增長的子集,在這些子訓練集上訓練模型。然后在計算模型在對應的子訓練集和測試集上的得分。最后,對於在每種子訓練集大小下,將K次訓練集和測試集得分分別進行平均。

計算並繪制模型的驗證曲線
validation_curve(estimator, X, y, param_name, param_range, groups=None, cv=None, scoring=None, n_jobs=1, pre_dispatch='all', verbose=0)
返回值:
- train_scores array.shape(n_ticks, n_cv_folds)
- test_scores
驗證曲線:
當某個參數不斷變化的時候,在每一個取值上計算出的模型在訓練集和測試集上得分,在一個不斷變化的參數上計算學習器模型的得分。這類似於只有一個參數的網格搜索。但是這個函數也會計算訓練集上的得分。
