我在比较Perceptron单次运行给出的准确率和使用Perceptron作为分类器的虹膜数据集的cross_val_score()给出的准确率。
我不确定这个问题。在单次运行中,Perceptron希望用X_train_std和y_train作为参数进行拟合,然后用X_test和y_test计算精度。在使用cross_val_score()时,我应该把X_train_std还是整个X_std放进去?(也就是前面提到的train+test).在使用cross_val_core()时,我应该把X_train_std还是整个X_std放进去?代码如下图所示。预处理:
from sklearn import datasets
import numpy as np
from sklearn.linear_model import Perceptron
from sklearn.model_selection import cross_val_score
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
iris = datasets.load_iris()
X = iris.data[:, [2, 3]]
y = iris.target
print('Class labels:', np.unique(y))
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.3, random_state=1, stratify=y)
sc = StandardScaler()
sc.fit(X_train)
X_train_std = sc.transform(X_train)
X_test_std = sc.transform(X_test)
X_std = sc.transform(X)
使用Perceptron进行单次测试:
#One-Shot
ppn = Perceptron(eta0=0.1, random_state=1).fit(X_train_std, y_train)
print('Accuracy test-set: %.3f' % ppn.score(X_test_std, y_test))
产出:
Accuracy test-set: 0.978
Cross_val_score()使用Perceptron运行。
#Cross-Validation
ppn = Perceptron(eta0=0.1, random_state=1)
scores = cross_val_score(ppn, X_std, y, cv=5)
print(scores)
输出:
[1. 0.93333333 0.83333333 0.66666667 0.96666667]
Accuracy: 0.88 (+/- 0.24)
通常最推荐的做法是 始终 为了测试的目的,留下一部分数据。
虽然 cross_val_score
是否 应用k-fold交叉验证,更准确地说,默认情况下是5倍交叉验证,这意味着在每个 对折 迭代时,模型是在未见数据上进行预测的,毕竟模型是在所有现有数据上进行训练的。当k-fold交叉验证伴随着参数调整时,这一点尤为重要,在这种情况下,你需要另一个独立于调整的验证步骤。