在sklearn中,model.fit和model.predict的区别及用法

7

我是一名初学者,想通过教程学习Python中的机器学习。在这个教程中,有一些代码让我难以理解它们是如何相互作用的。

第一段代码是数据分割,具体如下:

train_x, val_x, train_y, val_y = train_test_split(X, y,test_size=0.3)

我的第一个问题:为什么要使用验证数据而不是测试数据?为什么不使用全部的训练、验证和测试数据?对于何种情况应该使用哪种组合呢?

下一节详细说明了机器学习模型和预测。

model = DecisionTreeRegressor() 
model.fit(train_x, train_y)
val_predictions = model.predict(val_x)

我的第二个问题:对于model.predict()语句,为什么我们要把val_x放进去?难道我们不是想预测val_y吗?

额外问题:在许多教程中,我看到如何应用StandardScaler。但是,在本教程中似乎没有这样做,或者有其他函数已经自动缩放了它而不必明确说明吗?请帮忙。

2个回答

5

问题 1.1:为什么我们在上述情况下使用验证数据而不是测试数据?

train_x, val_x, train_y, val_y = train_test_split(X, y,test_size=0.3)

首先,在许多教程中,“验证集”和“测试集”这两个术语使用得非常松散,有时甚至可以互换使用。上述的"val_x, val_y"也可以称为"test_x, test_y"。
Q 1.2: 为什么要将数据分成"全部"、"训练"、"验证"和"测试"四部分呢?(为什么要分割数据?)
我们所有的机器学习算法都会用到一些实际的数据(指真实的测试数据)。然而,在设计出算法之后,我们想要“测试”它的表现如何,精度如何等等。
实际上,我们目前并没有真实世界中的数据!对吧?但是我们有训练数据!所以我们聪明地将其中一部分留出来(分割),以便在模型准备好后进行测试。测试数据用于评估模型的性能。
model = DecisionTreeRegressor() 
model.fit(train_x, train_y)
val_predictions = model.predict(val_x) # contains y values predicted by the model
score = model.score(val_x, val_y) # evaluates predicted y against actual y of test data
print(score)
Q 2.:在model.predict()语句中,为什么要放val_x?我们不是想预测val_y吗?
绝对正确,我们想要预测val_y,但模型需要val_x来预测y。这正是我们将其作为predict函数的参数传递的原因。

我理解看到 model predict val_x 可能会感到困惑。

所以更好的方式是将其解释为,“model”你能否请“从val_x中预测”,并返回“predicted_y”。

我说“predicted_y”而不是“val_y”,因为它们两者不会完全相同。它们有多大差异?score给出了答案。 一些术语
  • Data Set :手头数据。稍后将将其划分
  • Train Set :模型学习的数据集的一部分。通常很大,约70-80%。通常用train_x和train_y表示。
  • Test Set :我们留出的Data Set的一部分,以评估模型的性能。这“测试”模型,因此得名。由test_x和test_y表示。
  • Validation Set :如果我们想要在学习过程中得出无偏差的精度估计,我们使用另一种划分Data Set的方法。通常用于查找超参数等。通常用于
    • 选择最佳性能算法(NB vs DT vs…)
    • 微调参数(树深度、kNN中的k、SVM中的c)
Q 1.3 :什么是使用组合的用例?

您始终会有train和test,或者全部三个。但在您的情况下test只是被称为val。

BONUS问题 :在许多教程中,我看到了如何应用StandardScalers。然而,在这个教程中,它似乎没有这样做,还是其他函数已经缩放了它,而不需要明确说明吗?

这完全取决于你的数据。如果数据已经预处理并且以正确的方式缩放,则不需要应用StandardScalers。本教程只是暗示数据已按照要求进行了标准化。


@tini 这完全取决于你的数据。如果数据已经预处理并且所有比例都正确,那么就不需要应用StandardScalers。这个特定的教程只是暗示数据已经相应地被归一化了。 - arjnt

2

1) 验证集通常用于帮助您相应地调整超参数。因为您可能会根据验证集上的表现对模型进行微调,即使模型没有直接在该数据上进行训练,它也可能略微偏向于验证数据,这就是为什么我们将其与测试集分开的原因。一旦您根据验证集将模型调整到您喜欢的程度,您可以在测试集上评估它的泛化能力。

2) 调用model.predict(val_x)将基于给定的x值返回预测的y值。然后,您可以使用某些损失函数将那些预测值与val_y进行比较,以评估模型在验证集上的性能。

注意:Original Answer翻译成“最初的回答”。


我最好的猜测是,如果你想标准化特征,你仍然需要在预处理期间调用 StandardScaler.fit() 来处理你的数据。这不是让你的模型运行所必需的步骤;然而,如果你发现你的数据需要标准化,那么这一步骤肯定会有所帮助,并且值得测试,以确定如果没有它,你的模型结果是否不佳。 - JTunis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接