为了账号安全,请及时绑定邮箱和手机立即绑定

迭代许多随机训练和测试集分割直到达到高精度是一种不好的做法吗?

迭代许多随机训练和测试集分割直到达到高精度是一种不好的做法吗?

慕码人8056858 2023-07-11 16:43:58
假设我迭代以下代码,直到获得满意的准确性:  from sklearn.model_selection import train_test_split  x, y = # ... read in some data set ...  c = 3000 # iterate over some arbitrary range  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 = # ... initialize some classifier of choice ...    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% 是不正确的。为了对模型的准确性做出正确的声明,我应该做什么?
查看完整描述

2 回答

?
慕容3067478

TA贡献1773条经验 获得超3个赞

迭代许多随机训练和测试集分割直到达到高精度是一种不好的做法吗?

是的,这是不好的做法。您应该评估您的模型从未训练过的数据,如果您多次训练以找到最佳的训练/测试分割,情况就不会如此。

您可以在训练模型之前放置测试集。然后,您可以根据需要创建任意数量的训练/验证分割,并多次训练模型。您将在测试集上进行评估,而模型从未在该测试集上进行过训练。

您还可以研究嵌套交叉验证。


查看完整回答
反对 回复 2023-07-11
?
拉丁的传说

TA贡献1789条经验 获得超8个赞

有点。有交叉验证,与您所描述的类似。这是训练/测试分割被随机化并且模型每次都被训练的地方。除了引用的最终值是平均测试精度 - 而不仅仅是最好的。这类事情是在棘手的情况下完成的,例如数据集非常小的情况。

从更大的角度来看,测试数据应该代表训练数据,反之亦然。当然你可以这样干,但是如果你的训练集中隐藏着非典型的“怪异”案例,而测试集充满了简单的案例(例如 MNIST 只有数字 0),那么你就没有真正取得任何成果。你只是在欺骗自己。


查看完整回答
反对 回复 2023-07-11
  • 2 回答
  • 0 关注
  • 92 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信