Python 重复多次随机培训是一种不好的做法吗;测试集拆分,直到达到高精度?
假设我使用以下代码进行迭代,直到获得满意的精度:Python 重复多次随机培训是一种不好的做法吗;测试集拆分,直到达到高精度?,python,machine-learning,Python,Machine Learning,假设我使用以下代码进行迭代,直到获得满意的精度: 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
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\u state
,所以测试集真的是一个验证集吗?我不知道为什么,但我认为声称第一个模型的准确率为96%是不正确的。我应该做些什么来正确声明模型的准确性
重复多次随机训练和测试集分割,直到达到高精度,这是一种不好的做法吗
是的,这是个坏习惯。您应该根据您的模型从未接受过培训的数据进行评估,如果您多次培训以找到最佳的培训/测试分割,情况就不会如此了
在训练模型之前,可以将测试集放在一边。然后,您可以创建任意数量的训练/验证拆分,并多次训练模型。您将在测试集上进行评估,模型从未在测试集上进行过训练
你也可以看看。有点。交叉验证与您所描述的类似。在这里,列车/试验分离是随机的,并且每次都对模型进行训练。除此之外,引用的最终值是平均测试精度,而不仅仅是最好的。这类工作是在复杂的情况下完成的,例如使用非常小的数据集
就大局而言,测试数据应该代表训练数据,反之亦然。当然,你可以这样做,但是如果你的训练集中隐藏了非典型的“怪异”案例,而测试集中只有很多简单的案例(例如,MNIST只有数字0),那么你就没有真正实现任何目标。你只是在欺骗自己。似乎你刚刚重新发明了一种非常有效的工具,可以使用,但值得一读,了解如何正确实施。由于堆栈溢出更多的是针对特定的编码问题,而不是理论问题,因此对于嵌套CV或关于嵌套CV,这可能是一个更好的问题,这听起来是否正确:一次执行K-fold交叉验证会使用相同的超参数评估K个模型。如果有L个不同的超参数组合,那么为整个训练集寻找最优超参数需要训练K*L模型。这构成了整个内循环。我们这样做了M次,每次都有不同的训练/测试集分割(即M次折叠,外循环)。在训练了K*L*M模型之后,我们得到了超参数选择过程和一组超参数本身的平均性能。