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])

 

posted @ 2020-07-27 17:28  做梦当财神  阅读(4978)  评论(0编辑  收藏  举报