构建模型

您将使用 scikit-learn 库来创建模型。在编码时,这个库被写成sklearn,正如您在示例代码中所看到的。Scikit-learn很容易成为存储在DataFrames中的数据类型建模的最流行的库。

建立和使用模型的步骤是:

  • 定义: 它将是什么类型的模型?决策树?其他类型的模型?模型类型的其他参数也被指定了。
  • 拟合: 从提供的数据中捕获模式。这是建模的核心。
  • 预测: 字面意思。
  • 评估: 确定模型预测的准确性。

这里是一个使用scikit-learn定义决策树模型并用特征和目标变量进行拟合的示例。

from sklearn.tree import DecisionTreeRegressor

# 定义 model。为 Random_state 指定一个数字,以确保每次运行都得到相同的结果
melbourne_model = DecisionTreeRegressor(random_state=1)

# 拟合 model
melbourne_model.fit(X, y)
DecisionTreeRegressor(random_state=1)

许多机器学习模型在模型训练中允许一些随机性。为 Random_state 指定一个数字可以确保每次运行都得到相同的结果。这被认为是一种好的做法。您可以使用任何数字,模型的质量并不完全取决于您所选择的值。

我们现在有一个拟合好的模型,我们可以用来做出预测。

在实践中,你会想要预测即将上市的新房子,而不是我们已经有价格的房子。但是我们将对训练数据的前几行进行预测,看看预测函数是如何工作的。

print("Making predictions for the following 5 houses:")
print(X.head())
print("The predictions are")
print(melbourne_model.predict(X.head()))
Making predictions for the following 5 houses:
   Rooms  Bathroom  Landsize  Lattitude  Longtitude
1      2       1.0     156.0   -37.8079    144.9934
2      3       2.0     134.0   -37.8093    144.9944
4      4       1.0     120.0   -37.8072    144.9941
6      3       2.0     245.0   -37.8024    144.9993
7      2       1.0     256.0   -37.8060    144.9954
The predictions are
[1035000. 1465000. 1600000. 1876000. 1636000.]

什么是模型验证?

您几乎需要评估您构建的每个模型。在大多数(但不是全部)应用程序中,模型质量的相关度量标准是预测准确性。换句话说,模型的预测是否接近实际发生的情况。

许多人在测量预测准确性时犯了一个严重的错误。他们使用 训练数据 进行预测,并将这些预测与 训练数据 中的目标值进行比较。您将在接下来的内容中了解到这种方法的问题以及如何解决问题,但首先让我们考虑如何进行评估。

您首先需要将模型质量概括成一个可理解的指标。如果您比较了10,000个房屋的预测和实际价值,您可能会发现好的和坏的预测混杂在一起。查看10,000个预测和实际值的列表是没有意义的。我们需要将其总结为单一指标。

有许多评估模型质量的指标,但我们将从一个称为 平均绝对误差(也称为 MAE)的指标开始。让我们从最后一个单词“误差”开始解释这个指标。

每个房屋的预测误差是:

error=actual−predicted

因此,如果一栋房子的成本为150,000美元,而预测的成本为100,000美元,误差为50,000美元。

使用MAE指标,我们取每个误差的绝对值。这将每个误差转换为正数。然后,我们取这些绝对误差的平均值。这是我们的模型质量测量指标。用简单的语言来说,可以表示为

平均而言,我们的预测误差大约为X。

计算MAE,我们首先需要一个模型。我们使用上面建立的模型。

一旦我们有了一个模型,下面是我们如何计算平均绝对误差:

from sklearn.metrics import mean_absolute_error

predicted_home_prices = melbourne_model.predict(X)
mean_absolute_error(y, predicted_home_prices)
434.71594577146544

“样本内”分数的问题

我们刚刚计算的度量可以称为“样本内”分数。我们使用同一“样本”房屋来建立模型和评估模型。以下是此方法的弊端。

假设在大房地产市场中,门的颜色与房价无关。

但是,在您用于建立模型的数据样本中,所有具有绿色门的房屋都非常昂贵。模型的任务是找到预测房价的模式,因此它将看到这个模式,并且它将始终预测绿色门的房屋价格很高。

由于这种模式是从训练数据中推导出来的,因此模型在训练数据中看起来准确无误。

但是,如果该模式在模型看到新数据时不成立,则该模型在实践中会非常不准确。

由于模型的实际价值来自于对新数据进行预测,因此我们在未用于构建模型的数据上测量性能。最简单的方法是从建模过程中排除一些数据,然后使用这些数据来测试模型在其从未看过的数据上的准确性。这些数据称为 验证数据

编码它

scikit-learn库具有一个名为train_test_split的函数,可以将数据分成两部分。我们将使用其中一部分数据作为训练数据来拟合模型,而将其他数据作为验证数据来计算平均绝对误差

以下是代码:

from sklearn.model_selection import train_test_split

# 为特征和目标将数据分割为训练和验证数据
# 分割是基于一个随机数生成器。
# 为 Random_state 参数提供一个数值可以保证我们每次运行这个脚本时得到相同的分割。
train_X, val_X, train_y, val_y = train_test_split(X, y, random_state = 0)
# 定义模型
melbourne_model = DecisionTreeRegressor()
# 拟合模型
melbourne_model.fit(train_X, train_y)

# 得到验证数据的预测价格
val_predictions = melbourne_model.predict(val_X)
print(mean_absolute_error(val_y, val_predictions))
258930.03550677857

哇!

样本内数据的平均绝对误差约为500美元,样本外数据的平均绝对误差超过25万美元。

这就是一个几乎完全正确的模型和一个不能用于大多数实际目的的模型之间的区别。作为参考,验证数据中的平均房屋价值是110万美元。因此,新数据的误差约为平均房屋价值的四分之一。

有很多方法可以改进这个模型,比如试验找到更好的特征或者不同的模型类型。


标题:kaggle机器学习入门(二)sklearn入门
作者:Departure
地址:https://www.unreachablecity.club/articles/2023/04/15/1681520357467.html