model.fit 与 model.predict - sklearn 中的差异和用法

ee8*_*291 5 python machine-learning scikit-learn

我是 Python ML 的新手,正在通过教程尝试我的第一次尝试。在那个教程中,有一些代码行我很难理解它们是如何相互交互的。

第一个代码是发生的数据拆分如下:

train_x, val_x, train_y, val_y = train_test_split(X, y,test_size=0.3)
Run Code Online (Sandbox Code Playgroud)

我的第一个问题:为什么我们使用验证数据而不是测试数据?为什么不是全部,train、val 和 test?使用哪种组合的用例是什么?

下一节详细说明 ML 模型和预测。

model = DecisionTreeRegressor() 
model.fit(train_x, train_y)
val_predictions = model.predict(val_x)
Run Code Online (Sandbox Code Playgroud)

我的第二个问题:对于 model.predict() 语句,为什么我们将 val_x 放在那里?我们不想预测 val_y 吗?

附加问题:此外,在许多教程中,我看到了如何应用 StandardScalers。但是,在本教程中,它并没有出现,或者其他一些函数是否已经对其进行了缩放而无需明确说明?请帮忙。

arj*_*thn 5

问 1.1:为什么我们使用验证数据而不是测试数据?(在上述场景中)

train_x, val_x, train_y, val_y = train_test_split(X, y,test_size=0.3)
Run Code Online (Sandbox Code Playgroud)

首先,术语验证集和测试集在许多教程中使用得非常宽松,有时甚至可以互换。很可能将上面的内容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)
Run Code Online (Sandbox Code Playgroud)

Q 2. : 对于 model.predict() 语句,为什么我们要把 val_x 放在那里?我们不想预测 val_y 吗?

我们想要预测 绝对正确val_y,但模型需要val_x预测 y。这正是我们作为参数传递给预测函数的内容。

我知道阅读起来可能会令人困惑model predict val_x

所以更好的方法是解释它,model你可以predictval_x,然后返回predicted_y

我说predicted_y不是val_y因为两者不会完全相同。他们有多少不同?这就是分数给出的。

一些术语

  • 数据集:手中的数据。稍后分割的就是这些数据
  • 训练集:它是我们的模型学习的数据集的一部分。通常较大,约70-80%。通常用 train_x 和 train_y 表示。
  • 测试集:我们留出用于评估模型性能的数据集的一部分。这“测试”模型因此得名。由test_x和test_y表示。
  • 验证集:如果我们想要在学习过程中对准确性进行无偏估计,我们可以使用数据集的另一个分割。通常是为了找到超参数等。通常是为了
    • 选择性能最佳的算法(NB vs DT vs..)
    • 微调参数(树深度,kNN 中的 k,SVM 中的 c)

问 1.3:使用哪种组合的用例是什么?

你总是会进行训练和测试,或者三者兼而有之。但是,在您的情况下,测试仅命名为 val。

额外问题:在许多教程中我看到了如何应用 StandardScalers。然而,在本教程中它并没有这样出现,或者其他一些函数是否已经对其进行了缩放而无需明确说明?

这一切都取决于您的数据。如果数据经过预处理并且全部缩放正确,则不需要应用 StandardScalers。这个特定的教程只是意味着数据已经相应地标准化。