问题 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)
score = model.score(val_x, val_y)
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。本教程只是暗示数据已按照要求进行了标准化。