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