Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 重复多次随机培训是一种不好的做法吗;测试集拆分,直到达到高精度?_Python_Machine Learning - Fatal编程技术网

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模型之后,我们得到了超参数选择过程和一组超参数本身的平均性能。