我刚开始学习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吗?
附加问题: 此外,我在许多教程中看到如何应用StandardScalers。然而,在这个教程中似乎没有这样做,或者是否有其他函数已经在不明确声明的情况下对其进行了缩放?请帮助解答。
回答:
Q 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) # 包含模型预测的y值score = model.score(val_x, val_y) # 评估预测的y与测试数据的实际yprint(score)
Q 2. : 对于model.predict()语句,为什么我们要在其中放入val_x?我们不是想要预测val_y吗?
绝对正确,我们想要预测val_y
,但模型需要val_x
来预测y。这正是我们传递给预测函数的参数。
我理解阅读
model
predict
val_x
可能会让人感到困惑。所以更好的解释方式是,
model
你能请predict
从val_x
中,并返回predicted_y
吗?
我说predicted_y
而不是val_y
,因为这两者不会完全相同。它们有多大差异?这就是score给出的信息。
一些术语
- 数据集 : 手头的数据。后来会将这些数据进行分割
- 训练集 : 数据集的一部分,我们的模型从中学习。通常较大,约70-80%。通常用train_x和train_y表示。
- 测试集 : 数据集的一部分,我们将其留出来评估模型的表现。这“测试”了模型,因此得名。用test_x和test_y表示。
- 验证集 : 如果我们在学习过程中想要无偏见的准确率估计,我们使用数据集的另一个分割。通常用于寻找超参数等。典型的用途包括
- 选择表现最佳的算法(NB vs DT vs..)
- 微调参数(树的深度,kNN中的k,SVM中的c)
Q 1.3 : 使用哪种组合的用例是什么?
你总是会有训练与测试,或三者都有。然而在你的案例中,测试只是被命名为val。
附加问题 : 在许多教程中我看到如何应用StandardScalers。然而,在这个教程中似乎没有这样做,或者是否有其他函数已经在不明确声明的情况下对其进行了缩放?
这完全取决于你的数据。如果数据已经被预处理且适当缩放,则无需应用StandardScalers。这个特定的教程只是暗示数据已经相应地进行了归一化处理。