假设我使用以下代码反复迭代,直到获得满意的准确率:
from sklearn.model_selection import train_test_split x, y = # ... 读取某个数据集 ... c = 3000 # 在某个任意范围内迭代 for i in range(c): x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=i) model = # ... 初始化某个选择的分类器 ... model.fit(x_train, y_train) p = model.predict(x_test) p = np.round(p).reshape(-1) test_accuracy = np.mean(p == y_test) * 100
对于特定的数据集和范围,假设我构建了一个分类器,其训练准确率为97%,测试准确率为96%。我能否真正声称该模型的准确率为96%?在相同的数据集和范围内,我也能够构建一个分类器,其训练准确率和测试准确率分别低至99%和70%。
由于我根据测试集的准确率选择了random_state
,这里的测试集真的可以视为验证集吗?我不知道为什么,但我认为声称第一个模型的准确率为96%是不正确的。为了正确地声称模型的准确率,我应该做些什么呢?
回答:
反复迭代多个随机训练与测试集分割直到达到高准确率,这是一种不良做法吗?
是的,这是一种不良做法。你应该在模型从未训练过的数据上进行评估,如果你多次训练以找到最佳的训练/测试分割,这实际上就不是这种情况了。
你可以在训练模型之前预留一个测试集。然后你可以创建任意数量的训练/验证分割,并多次训练模型。你会在模型从未训练过的测试集上进行评估。
你还可以查看嵌套交叉验证。