cross_val_score


使用交叉檢驗最簡單的方法是在估計器上調用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])

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM