当前位置: 首页 > article >正文

编程小白冲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

尝试优化您之前构建的模型。


http://www.kler.cn/a/562764.html

相关文章:

  • Java 网络协议面试题答案整理,最新面试题
  • C++ 二叉树的后序遍历 - 力扣(LeetCode)
  • 通过Sidecar模式实现服务注册、服务发现和负载均衡的分布式系统架构
  • 自动驾驶FSD技术的核心算法与软件实现
  • HarmonyOS组件开发规范文档之理解与总结
  • 跟着官方文档学习UE C++ TArray容器系列 迭代
  • 详解直方图均衡化
  • 【算法】哈希表详解
  • C语言实战项目(1)---------->猜数字游戏
  • Redis面试题----为什么要做Redis分区?
  • 基于springboot+vue的人工智能领域复合型人才校企协同培养管理系统
  • Python基于Django和Vue的校园互助平台(附源码、文档说明)
  • 【Uniapp-Vue3】点击将内容复制到剪切板
  • 使用 LangChain 和 Milvus 构建测试知识库
  • 【Jenkins】一种灵活定义多个执行label节点的jenkinsfile写法
  • Windows 图形显示驱动开发-WDDM 3.2-自动显示切换(八)
  • 物联网综合实训室建设方案的探讨(职业院校物联网综合实训室建设方案)
  • Pytorch实现之浑浊水下图像增强
  • DeepSeek + 数据分析:让数据洞察更智能、更高效
  • 技术改变生活新趋势