5.Underfitting and Overfitting

在这一步结束时,您将了解欠拟合和过拟合的概念,并且您将能够应用这些办法来使您的模型更准确。

Experimenting With Different Models

现在您已经有了一种可靠的方法来测量模型精度,您可以尝试使用其他模型,并查看哪种模型可以提供最佳预测。 但是你对模型有什么选择?

您可以在scikit-learn的文档中看到决策树模型有很多选项(比您长期想要或需要的更多)。 最重要的选项决定了树的深度。 回想一下本课程的第一课,树的深度是衡量它在进行预测之前分支的数量。 这是一棵相对浅的树

Depth 2 Tree

在实践中,树在顶层(所有房屋)和叶子之间有10个分支并不罕见。随着树木越来越深,数据集被切成了更少房屋的树叶。如果树只有1个分割,则将数据分为2组。如果每组再次拆分,我们将获得4组房屋。再次拆分每个将创建8个组。如果我们通过在每个级别添加更多分组来保持组数量翻倍,当我们到达第10级时我们将有2^{10}房屋。即1024片叶子。

当我们将房屋分成许多树叶时,每片树叶中的房屋数量也会减少。拥有极少数房屋的树叶将进行与房屋实际值非常接近的预测,但它们可能会对新数据做出非常不可靠的预测(因为每个预测仅基于少数房屋)。

这是一种称为过拟合的现象,其中模型几乎完美地匹配训练数据,但在验证其他新数据方面表现不佳。另一方面,如果我们使树非常浅,它不会将房屋分成非常不同的组。

在极端情况下,如果一棵树将房屋分成2或4组,每组仍有各种各样的房屋。对于大多数房屋来说,结果预测可能相差甚远,即使在训练数据中也是如此(由于同样的原因,验证也会很糟糕)。当模型无法捕获数据中的重要区别和模式时,即使在训练数据中它也表现不佳,这称为欠拟合

由于我们关注新数据的准确性,我们根据验证数据估算,我们希望找到欠拟合和过拟合之间的最佳点。在视觉上,我们想要(红色)验证曲线的低点。

http://i.imgur.com/2q85n9s.png

Example

有一些控制树深度的替代方案,其中一些树的路径比其他路径拥有更大的深度。 但是max_leaf_nodes参数提供了一种非常合理的方法来控制过拟合与欠拟合。 我们允许模型的叶子越多,我们越多地从上图中的欠拟合区域移动到过度拟合区域。

我们可以使用函数来帮助比较max_leaf_nodes的不同值的MAE分数:

【1】

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_X,val_X,train_y和val_y中。

【2】

# Data Loading Code Runs At This Point
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_nodes的值对应的模型精度:

【3】

扫描二维码关注公众号,回复: 3260238 查看本文章
# compare MAE with differing values of max_leaf_nodes
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是最优叶子数量。

Conclusion

模型可能会受到以下任何一种情况:

  •      过拟合:捕获不会再发生的虚假模式,导致预测不准确,或者
  •      欠拟合:未能捕获相关模式,再次导致预测不准确。

我们使用未在模型训练中使用的验证数据来测量候选模型的准确性。 这让我们尝试了许多候选模型,并保持最好的模型。

Your Turn

尝试优化你之前建立的模型

猜你喜欢

转载自blog.csdn.net/cg129054036/article/details/82313068