train_test_split 是二进制分类所必需的吗?为啥会有 4 个结果?
Posted
技术标签:
【中文标题】train_test_split 是二进制分类所必需的吗?为啥会有 4 个结果?【英文标题】:Is train_test_split necessary for binary classification? And why are there 4 outcomes?train_test_split 是二进制分类所必需的吗?为什么会有 4 个结果? 【发布时间】:2019-10-12 11:09:59 【问题描述】:为什么在 sklearn 中 train_test_split 有 4 个结果?如果测试数据没有y_data,为什么还有y_test?
【问题讨论】:
如果你有可用的训练和测试数据,那么我很困惑为什么你需要使用train_test_split
。 train_test_split
是获取一个数据矩阵,并有目的地将它们拆分为训练和测试集。如果您已经拥有它们,则无需这样做?
我的意思是 train_test_split 的结果是 x_train、y_train、x_test、y_test,而我只有训练和测试数据。 4 个结果的需求是什么?
我的意思是你甚至不需要使用它,因此你不需要四个结果。这四种结果是当您尚未将数据拆分为训练和测试时。它只是一个数据矩阵,您想要从中获得训练和测试。因为这项工作已经为您完成,您甚至不需要使用它。
好的,那为什么 train_test_split 有 4 个结果,而不是简单地分成 2 个呢?
我认为您没有理解我的回答。您为 train_test_split
提供 one 数据矩阵和 one 标签向量。此数据矩阵和标签向量尚未分为训练和测试。工作就是这样做。所以现在,你只有两件事——数据矩阵和标签向量。我们得到四个因为我们将数据矩阵分成训练和测试集。因此,我们得到一个分割数据矩阵和标签向量作为训练集,测试集也是如此(因此 2 + 2 = 4)。我真的不知道该怎么解释。
【参考方案1】:
您获得 4 个结果的原因是因为您获得了:train_features、test_features、train_labels 和 test_labels (X_train, X_test, y_train, y_test
)。因此,它不仅将数据集拆分为训练集和测试集,还拆分了标签。 (所以 2 + 2 = 4 个结果)。
【讨论】:
由于测试数据不包含当前的二进制标签,这是否意味着 y_test 为空? 如果没有标签,您将如何训练(和测试)? train_test_split 仅在您有标签时才有用。你可以对未标记的数据进行分类,但是你如何测试分类的性能(你使用 train_test_split 的东西)? 我的错误是混淆了验证集和测试集。【参考方案2】:查看documentation,您可以看到第一个参数是
*arrays
,这意味着您可以在其中放置任意数量的数组。现在,它返回了什么?
Returns: splitting : list, length=2 * len(arrays)
这意味着它返回的数组数量是 train_test_split 函数中传递的数组数量的两倍。
因此,如果您已经有一个训练集和一个测试集,那么拆分训练集才有意义,这样您就可以拥有一个验证集来检查模型性能。
例如:
train_data, validation_data, train_label, validation_label= train_test_split(original_train_data, original_train_label)
请注意,如果您将数据和标签放在分离的向量中,您还必须拆分标签。
【讨论】:
【参考方案3】:因为您已将原始数据拆分为训练和测试部分。所以会有四种结果。
1 (X_train, Y_train) 其中 X_train 是训练点,而 Y_train 是它们各自的类标签。现在这是您的训练数据,将用于使用任何经典模型(如 K-NN、逻辑回归、决策树)训练您的模型。
2 (X_test,Y_test) 其中 X_test 代表您的测试数据点,y_train 是这些测试点各自的类标签。现在,一旦您训练了模型并计算了训练误差/准确度,您就可以使用这些点来查看经过训练的模型是否正确预测数据。训练和测试误差之间的差异越小越好。
这就是为什么你会得到 4 个结果,每个结果对 2 个。
希望这会有所帮助。
【讨论】:
以上是关于train_test_split 是二进制分类所必需的吗?为啥会有 4 个结果?的主要内容,如果未能解决你的问题,请参考以下文章
何时使用 scikit learn 的 train_test_split