编程小白冲Kaggle每日打卡(16)--kaggle学堂:<机器学习简介>欠拟合与过拟合
Kaggle官方课程链接:Underfitting and Overfitting
本专栏旨在Kaggle官方课程的汉化,让大家更方便地看懂。
Underfitting and Overfitting
微调你的模型以获得更好的性能。
在这一步结束时,您将了解欠拟合和过拟合的概念,并能够应用这些想法使您的模型更加准确。
尝试不同的模型
现在你有了一种可靠的方法来衡量模型的准确性,你可以尝试其他模型,看看哪种模型能给出最好的预测。但是,对于模型,你有什么替代方案呢?
您可以在scikit-learn的文档中看到,决策树模型有很多选项(比您在很长一段时间内想要或需要的更多)。最重要的选项决定了树的深度。回想一下本课程的第一课,树的深度是衡量它在做出预测之前分裂了多少次的指标。这是一棵相对较浅的树
在实践中,一棵树在顶层(所有房屋)和一片叶子之间有10个裂缝并不罕见。随着树越来越深,数据集被切成叶子,房子越来越少。如果一棵树只有1个分割,它会将数据分为2组。如果每组再次拆分,我们将得到4组房屋。再次拆分每个组将创建8个组。如果我们通过在每个级别添加更多拆分来将组的数量增加一倍,我们就会有2^10.
当我们到达第10层时,已经有几组房子了。这是1024片叶子。
当我们把房子分成许多叶子时,每片叶子上的房子也会减少。房屋很少的叶子会做出非常接近这些房屋实际价值的预测,但它们可能会对新数据做出非常不可靠的预测(因为每个预测都只基于少数房屋)。
这是一种称为过拟合的现象,其中模型几乎完全匹配训练数据,但在验证和其他新数据方面表现不佳。另一方面,如果我们把树做得很浅,它就不会把房子分成非常不同的组。
在极端情况下,如果一棵树只把房子分成2或4个,每个组仍然有各种各样的房子。对于大多数房屋来说,即使在训练数据中,最终的预测也可能很遥远(出于同样的原因,验证也会很糟糕)。当一个模型未能捕捉到数据中的重要区别和模式时,即使在训练数据中也表现不佳,这被称为欠拟合。
由于我们关心新数据的准确性,我们根据验证数据进行估计,因此我们想找到欠拟合和过拟合之间的最佳点。从视觉上看,我们想要下图中(红色)验证曲线的低点。
例子
有几种方法可以控制树的深度,许多方法允许通过树的某些路线比其他路线具有更大的深度。但是max_lef_nodes参数提供了一种非常合理的方法来控制过拟合与欠拟合。我们允许模型制作的叶子越多,我们就越能从上图中的欠拟合区域移动到过拟合区域。
我们可以使用一个实用函数来帮助比较max_lef_nodes的不同值的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_X、val_X、train_y和val_y中。
# 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_lef_nodes的不同值构建的模型的准确性。
# 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是最佳的叶子数量。
结论
以下是结论:模特可能会受到以下两种情况的影响:
- 过度拟合:捕捉未来不会再次出现的虚假模式,导致预测不准确,或
- 拟合不足:未能捕捉到相关模式,再次导致预测不准确。
我们使用模型训练中不使用的验证数据来衡量候选模型的准确性。这让我们尝试了许多候选模型,并保留了最好的一个。
Your Turn
尝试优化您之前构建的模型。