Kaggle翻译,第十二天:机器学习 5/7

低度拟合和过度拟合——机器学习 5/7

微调你的模型以便得到更好的效果
在本次课结束后,你将会掌握低度拟合和过度拟合的概念,而且你也能够将这些观点实施在你的模型上使得它更准确

用不同的模型做实验

  • 现在,你已经掌握了一种测量模型准确性的有效方法,你可以使用其他的替换模型来看看哪个得出的预测最准确。但是具体的替代模型有哪些呢?
  • 你可以从scikit-learn的文档中发现决策树有很多种选择(比你想的甚至用的都要多)。最重要的一个选择就是树的深度,回忆下第一节课我们讨论过的:树的深度指的是在做出预测前经过的树的分叉数。
  • 实际上,从树根(所有房子)到叶子,中间有10多层都不足为奇。随着树的不断分叉,叶端的房子数也在不断减少。如果一棵树有一个分叉,那么就将房子分成两份。每份再分一叉,就是4组,各自再分就是8组,我们每分一次,组数就乘2.10层我们就会得到1024组。
  • 组分的越多,每组的房子数就越少、叶端的房子数越少,我们估计的值就会与实际值越接近,但是他们在新数据中的预测就会越不稳定(因为每个预测依据的数据越来越少)。
  • 这个现象叫做 过度拟合 ,讲的是模型几乎完美的符合了训练结果,但是面对新数据集或验证集时的能力却不足。
  • 另一个方向,如果我们的树很浅,我们没有将房子分到一些特定的组中。极端情况下,如果树只有2到4组,每组还有相当大数量的房子。预测结果甚至在训练集中也相差甚远(在验证集中也由于同样的原因表现很差)。模型不能抓住重要的区别特征或者数据中的规律,即使在训练集中的表现也不尽如人意,这样的现象称 低度拟合
  • 既然我们关心新数据集中的表现(在验证集中的表现),我们就要找到在低度拟合和过度拟合中间的恰到好处的那个点。视觉上,我们希望达到验证曲线的低谷位置

案例

  • 树深度控制有几个备选方案,许多方案允许一些路线要比其他路线更深入树。但是max_leaf_nodes参数提供了一个非常敏感的方式来控制低度拟合和过度拟合。我们允许的叶端数量越大,我们就在渐渐从低度拟合向高度拟合过度。
  • 我们可以使用工具函数来帮我们比较不同max_leaf_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_leaf_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应该是一个最佳的叶端数

总结

这里的总结可以带走:模型可能误入以下两种歧途:

  • **过度拟合:**捕捉过于散乱的规律,这些规律并不会在未来的数据集中出现,导致预测准确性下降。
  • **低度拟合:**不能捕捉相关的规律,同样会导致预测的准确性下降。

我们使用验证集数据(不在训练集中),来评估备用模型的准确性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值