模型实验

既然您有了一个可靠的方式来测量模型的准确性,您可以尝试使用其他模型并查看哪个能够提供最佳的预测。但是,您可以为模型提供哪些备选方案呢?

在scikit-learn的文档中,您可以看到决策树模型有许多选项(您长时间内可能都不需要或不想用到)。最重要的选项决定了树的深度。请回忆一下本课程第一篇文章中介绍的,决策树的深度是一种度量它在进行预测前多少次分裂的指标。这是一棵相对较浅的树。

Depth 2 Tree

在实践中,一棵树在顶层(所有房屋)和一个叶子节点之间分裂成10个部分并不罕见。随着树越来越深,数据集被切割成房屋更少的叶子节点。如果一棵树只有一个分叉,它将数据分为两组。如果每个组再次分叉,我们将得到4组房屋。如果我们通过在每一层添加更多的分叉来不断加倍分组数量,那么到达第10个级别时,我们将拥有\(2^{10}\)个房屋组。即1024个叶子。

当我们将房屋分配给许多叶子节点时,每个叶子节点中也有较少的房屋。房屋非常少的叶子节点将给出非常接近这些房屋实际值的预测,但它们可能会为新数据提供非常不可靠的预测(因为每个预测仅基于几个房屋)。

这种现象被称为 过度拟合,其中模型几乎完美地匹配训练数据,但在验证和其他新数据上表现不佳。相反,如果树非常浅,它就不会将房屋分成非常不同的群组。

在极端情况下,如果一棵树只把房子分成2或4组,那么每个组仍然有多种类型的房屋。得到的预测可能对大多数房屋而言都偏差很大,即使在训练数据中也是如此(由于同样的原因,验证也会很糟糕)。当模型无法捕捉数据中的重要差异和模式时,所以它在训练数据中表现不佳,那就是 欠拟合

由于我们关心新数据的准确性,我们从验证数据中估计它,我们想要找到欠拟合和过度拟合之间的最佳平衡点。从可视化的角度来看,我们想要在下图中(红色)验证曲线的最低点。

underfitting_overfitting

例子

有一些控制树深度的替代方法,许多方法允许通过树的一些路线比其他路线具有更大的深度。但是 max _leaf_node 参数提供了一种非常合理的方法来控制过拟合和不适合。我们允许模型生成的叶子越多,我们从上图中的欠拟合区域越容易移动到过拟合区域。

我们可以使用一个实用函数来帮助比较不同值 max_leaf_node 的 MAE 得分:

from sklearn.metrics import mean_absolute_error
from sklearn.tree import DecisionTreeRegressor

def get_mae(max_leaf_nodes, train_X, val_X, train_y, val_y):
    model = DecisionTreeRegressor(max_leaf_nodes=max_leaf_nodes, random_state=0)
    model.fit(train_X, train_y)
    preds_val = model.predict(val_X)
    mae = mean_absolute_error(val_y, preds_val)
    return(mae)

数据被加载到 train_Xval_Xtrain_yval_y 中,使用您已经看到的代码(以及您已经编写的代码)。

# 数据加载代码此时运行
import pandas as pd

# Load data
melbourne_file_path = '../input/melbourne-housing-snapshot/melb_data.csv'
melbourne_data = pd.read_csv(melbourne_file_path) 
# Filter rows with missing values
filtered_melbourne_data = melbourne_data.dropna(axis=0)
# Choose target and features
y = filtered_melbourne_data.Price
melbourne_features = ['Rooms', 'Bathroom', 'Landsize', 'BuildingArea', 
                        'YearBuilt', 'Lattitude', 'Longtitude']
X = filtered_melbourne_data[melbourne_features]

from sklearn.model_selection import train_test_split

# split data into training and validation data, for both features and target
train_X, val_X, train_y, val_y = train_test_split(X, y,random_state = 0)

我们可以使用 for 循环来比较用不同值构建的模型对 max_leaf_node 的准确性。

# 将 MAE 与 max_leaf_node 的不同值进行比较
for max_leaf_nodes in [5, 50, 500, 5000]:
    my_mae = get_mae(max_leaf_nodes, train_X, val_X, train_y, val_y)
    print("Max leaf nodes: %d  \t\t Mean Absolute Error:  %d" %(max_leaf_nodes, my_mae))
Max leaf nodes: 5  		 Mean Absolute Error:  347380
Max leaf nodes: 50  		 Mean Absolute Error:  258171
Max leaf nodes: 500  		 Mean Absolute Error:  243495
Max leaf nodes: 5000  		 Mean Absolute Error:  254983

在所列出的选项中,500张是最佳的叶子数量

总结

以下是我们的要点: 模型可能会遭遇以下两种情况:

  • 过度拟合: 捕获到在未来不会重现的假模式,导致预测不太准确,或者
  • 欠拟合: 未能捕捉到相关的模式,再次导致预测不准确。 我们模型训练中没有使用 验证数据 来衡量候选模型的准确性。这让我们可以尝试许多候选模型,并保持最好的一个。

标题:kaggle机器学习入门(三)过拟合与欠拟合
作者:Departure
地址:https://www.unreachablecity.club/articles/2023/04/15/1681520443269.html