使用交叉檢驗最簡單的方法是在估計器上調用cross_val_score函數。
下面示例展示如何通過分割數據,擬合模型和計算連續5次的分數(每次不同分割)來估計linear Kernel支持向量機在iris數據集上的精度:
from sklearn.model_selection import cross_val_score from sklearn import svm from sklearn import datasets clf = svm.SVC(kernel='linear', C=1) iris = datasets.load_iris() scores = cross_val_score(clf, iris.data, iris.target, cv=5) print(scores)
[0.96666667 1. 0.96666667 0.96666667 1. ]
評分估計的平均得分和95%置信區間由此給出:
print('Accuracy: %0.2f (+/- %0.2f)' % (scores.mean(), scores.std()*2))
Accuracy: 0.98 (+/- 0.03)
scoring參數:
默認情況下,每個CV迭代計算的分數是score方法。可以通過scoring參數改變計算方式:scoring參數:定義模型評估規則
from sklearn import metrics scores = cross_val_score(clf, iris.data, iris.target, cv=5, scoring='f1_macro') print(scores)
[0.96658312 1. 0.96658312 0.96658312 1. ]
在Iris數據集上,樣本在各個目標類別之間是平衡的,因此准確度和F1-score幾乎相等。
CV參數:
當CV是整數時,cross_val_score默認使用KFold或StratifiedKFold策略,后者會在估計器派生ClassifierMixin時使用。
也可以通過傳入一個交叉驗證迭代器來使用其他交叉驗證策略,比如:
from sklearn.model_selection import ShuffleSplit n_samples = iris.data.shape[0] cv = ShuffleSplit(n_splits=5, test_size=0.3, random_state=0) scores = cross_val_score(clf, iris.data, iris.target, cv=cv) print(scores)
[0.97777778 0.97777778 1. 0.95555556 1. ]
還可以使用一個可迭代生成器作為索引數組產生(train,test)划分,比如:
def custom_cv_2folds(X): n = X.shape[0] i = 1 while i <= 2: idx = np.arange(n * (i - 1) / 2, n * i / 2, dtype=int) yield idx, idx i += 1 custom_cv = custom_cv_2folds(iris.data) cross_val_score(clf, iris.data, iris.target, cv=custom_cv)
array([1. , 0.97333333])
保留數據的數據轉換
正如在訓練集中保留的數據上測試一個predictor(預測器)是很重要的一樣,預處理(標准化、特征選擇等)和類似的 data transformations也可以從訓練集中學習,並應用預測數據以進行預測:
from sklearn import preprocessing from sklearn.cross_validation import train_test_split X_train, X_test, y_train, y_test = train_test_split( iris.data, iris.target, test_size=0.4, random_state=0) scaler = preprocessing.StandardScaler().fit(X_train) X_train_transformed = scaler.transform(X_train) clf = svm.SVC(C=1).fit(X_train_transformed, y_train) X_test_transformed = scaler.transform(X_test) clf.score(X_test_transformed, y_test)0.9333333333333333
Pipeline可以更容易地組合估計器,在交叉驗證下使用如下:
from sklearn.pipeline import make_pipeline clf = make_pipeline(preprocessing.StandardScaler(), svm.SVC(C=1)) cross_val_score(clf, iris.data, iris.target, cv=cv)array([0.97777778, 0.93333333, 0.95555556, 0.93333333, 0.97777778])