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

Python学习从0开始——Kaggle机器学习003总结

Python学习从0开始——Kaggle机器学习003总结

  • 一、加载及浏览数据
  • 二、机器学习模型
  • 三、模型验证
  • 四、欠拟合和过拟合
  • 五、随机森林

一、加载及浏览数据

# 路径
melbourne_file_path = '../input/melbourne-housing-snapshot/melb_data.csv'
# 读取
melbourne_data = pd.read_csv(melbourne_file_path) 
# 总览
melbourne_data.describe()

输出在这里插入图片描述

二、机器学习模型

# 引入pandas
import pandas as pdmelbourne_file_path = '../input/melbourne-housing-snapshot/melb_data.csv'
melbourne_data = pd.read_csv(melbourne_file_path) 
# 所有列
melbourne_data.columns

输出:Index([‘Suburb’, ‘Address’, ‘Rooms’, ‘Type’, ‘Price’, ‘Method’, ‘SellerG’,
‘Date’, ‘Distance’, ‘Postcode’, ‘Bedroom2’, ‘Bathroom’, ‘Car’,
‘Landsize’, ‘BuildingArea’, ‘YearBuilt’, ‘CouncilArea’, ‘Lattitude’,
‘Longtitude’, ‘Regionname’, ‘Propertycount’], dtype=‘object’)

#将有缺失值的列设为不可用
melbourne_data = melbourne_data.dropna(axis=0)#通过Dot符号来提取所需列
y = melbourne_data.Price
#通过数组提取目标列
melbourne_features = ['Rooms', 'Bathroom', 'Landsize', 'Lattitude', 'Longtitude']
X = melbourne_data[melbourne_features]
#查看数据
X.describe()
X.head()

输出
在这里插入图片描述

#使用sklearn创建模型
from sklearn.tree import DecisionTreeRegressor
#使用步骤
#Define: 是什么类型?决策树?其他类型的模型?还指定了模型类型的其他一些参数。
#Fit: 从提供的数据中捕获模式。这是建模的核心
#Predict: 预测
#Evaluate: 确定模型的预测的准确度# 定义模型。为random_state指定一个数字,以确保每次运行的结果相同
melbourne_model = DecisionTreeRegressor(random_state=1)
# 使用已知数据训练模型
melbourne_model.fit(X, y)
# 预测未知数据
print(melbourne_model.predict(X.head()))

输出:
在这里插入图片描述

三、模型验证

通过指标分析模型质量,如平均绝对误差MAE(Mean Absolute Error)。

from sklearn.metrics import mean_absolute_errorpredicted_home_prices = melbourne_model.predict(X)
#误差
mean_absolute_error(y, predicted_home_prices)

输出
在这里插入图片描述

scikit-learn库有一个函数train_test_split,用于将数据分成两部分,其中一些数据作为训练数据来拟合模型,其他数据作为验证数据来计算:

from sklearn.model_selection import train_test_split#通过随机生成器分割,random_state保证每次分割相同
train_X, val_X, train_y, val_y = train_test_split(X, y, random_state = 0)
#训练
melbourne_model = DecisionTreeRegressor()
melbourne_model.fit(train_X, train_y)
#预测
val_predictions = melbourne_model.predict(val_X)
print(mean_absolute_error(val_y, val_predictions))

输出
在这里插入图片描述

样本内数据的平均绝对误差约为500,样本外超过25万,这就是一个几乎完全正确的模型和一个不能用于大多数实际目的的模型之间的区别。
作为参考,验证数据中的平均房屋价值为110万,所以新数据的误差大约是平均房屋价值的四分之一。但是有很多方法可以改进,比如通过实验找到更好的特征或不同的模型类型。

四、欠拟合和过拟合

有方法测量模型的准确性,就可以尝试不同的模型以得出最好的预测。在scikit-learn的文档中决策树模型有许多选项,最重要的选项决定了树的深度。树的深度是它在做出预测之前进行分裂的次数。
在机器学习和深度学习中,过拟合(Overfitting)和欠拟合(Underfitting)是两种常见的问题,它们都与模型在训练数据上的表现和在未见过的测试数据上的泛化能力之间的关系有关。
过拟合指的是模型在训练数据上表现非常好,但在测试数据上表现较差的现象。这通常是因为模型过于复杂,以至于它“记住”了训练数据中的噪声和细节,而不是学习到了数据的普遍规律。因此,当模型面对新的、未见过的数据时,它无法正确地进行预测。
过拟合的表现:

  • 训练误差非常低,但测试误差很高。
  • 模型在训练数据上的表现很好,但在测试数据上的表现很差。
  • 模型对于训练数据中的噪声和异常值非常敏感。

解决过拟合的方法:

  • 增加数据量:更多的数据可以帮助模型学习到更普遍的规律,而不是仅仅记住训练数据。
  • 简化模型:减少模型的复杂度,例如减少神经网络的层数或神经元数量。
  • 正则化:在损失函数中添加正则化项,如L1正则化或L2正则化,以惩罚模型的复杂度。
  • 早停法(Early Stopping):在验证误差开始上升时停止训练。
  • 数据增强:通过旋转、缩放、裁剪等操作来增加训练数据的多样性。
  • 集成方法:如Bagging和Boosting,通过组合多个模型的预测结果来提高泛化能力。

欠拟合(Underfitting)
欠拟合指的是模型在训练数据上的表现就很差,更不用说在测试数据上了。这通常是因为模型过于简单,无法捕捉到数据中的复杂关系或规律。
欠拟合的表现:

  • 训练误差和测试误差都很高。
  • 模型无法对训练数据进行有效的预测。

解决欠拟合的方法:

  • 增加模型复杂度:例如增加神经网络的层数或神经元数量。
  • 使用更复杂的模型:例如从线性模型切换到非线性模型。
  • 减少正则化强度:如果使用了正则化,可以尝试减少正则化项的权重。
  • 检查数据质量:确保数据是正确标记的,并且没有过多的噪声或异常值。
  • 增加训练时间:确保模型已经充分训练,没有提前停止。

在实际应用中,通常需要在这两种问题之间找到一个平衡,以使模型在训练数据和测试数据上都有良好的表现。这通常需要一些试验和调优工作。
由于我们关心新数据的准确性,这是我们从验证数据中估计的,我们希望找到欠拟合和过拟合之间的最佳点。从视觉上看,我们需要下图中(红色)验证曲线的低点。

在这里插入图片描述

通过max_leaf_nodes参数来调整过拟合与欠拟合,我们允许模型生成的叶子越多,我们就越能从上图中的欠拟合区域移动到过拟合区域。

from sklearn.metrics import mean_absolute_error
from sklearn.tree import DecisionTreeRegressordef 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)# 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))

输出
在这里插入图片描述

所以此处500是最优数量。

五、随机森林

随机森林使用许多树,它通过平均每个组成树的预测来进行预测。它通常比单一决策树具有更好的预测准确性,并且在默认参数下工作得很好。

#通过随机森林建树
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_absolute_errorforest_model = RandomForestRegressor(random_state=1)
forest_model.fit(train_X, train_y)
melb_preds = forest_model.predict(val_X)
print(mean_absolute_error(val_y, melb_preds))

相关文章:

  • [线程与网络] 网络编程与通信原理(五): 深入理解网络层IP协议与数据链路层以太网协议
  • 3DGS语义分割之LangSplat
  • 步进电机双闭环细分控制(matlab仿真)内含课设等参考文件
  • 新闻出版署发布新规定,腾讯游戏限制未成年人端午期间每天一小时
  • 搭载昇腾310NPU的Orange Pi AIpro开箱体验以及深度学习样例测试
  • LAMP分布式安全方案搭建网页 (LinuxCentOS7+Apache+Mariadb+PHP)包括服务端口及防火墙规则配置
  • 防雷接地测试方法及注意事项
  • 前端 JS 经典:判断数组的准确方法
  • LLM主流开源代表模型
  • ethernet eth0: Could not attach to PHY
  • 家宽动态公网IP,使用docker+ddns 实现动态域名解析
  • 计算机视觉与模式识别实验2-2 SIFT特征提取与匹配
  • 云端数据提取:安全、高效地利用无限资源
  • 2024-5-13——腐烂的橘子
  • 在Spring Boot项目中使用Redisson实现延迟执行
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • 【跃迁之路】【669天】程序员高效学习方法论探索系列(实验阶段426-2018.12.13)...
  • angular学习第一篇-----环境搭建
  • Babel配置的不完全指南
  • Javascript 原型链
  • Java基本数据类型之Number
  • MySQL几个简单SQL的优化
  • overflow: hidden IE7无效
  • passportjs 源码分析
  • 闭包,sync使用细节
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 好的网址,关于.net 4.0 ,vs 2010
  • 排序(1):冒泡排序
  • 使用docker-compose进行多节点部署
  • 优化 Vue 项目编译文件大小
  • 走向全栈之MongoDB的使用
  • 【运维趟坑回忆录】vpc迁移 - 吃螃蟹之路
  • 7行Python代码的人脸识别
  • 好程序员大数据教程Hadoop全分布安装(非HA)
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • ​VRRP 虚拟路由冗余协议(华为)
  • # AI产品经理的自我修养:既懂用户,更懂技术!
  • # Apache SeaTunnel 究竟是什么?
  • # Java NIO(一)FileChannel
  • # 数论-逆元
  • (2020)Java后端开发----(面试题和笔试题)
  • (C语言)strcpy与strcpy详解,与模拟实现
  • (pojstep1.1.2)2654(直叙式模拟)
  • (回溯) LeetCode 46. 全排列
  • (离散数学)逻辑连接词
  • (转)GCC在C语言中内嵌汇编 asm __volatile__
  • .Net 垃圾回收机制原理(二)
  • .net对接阿里云CSB服务
  • .NET连接数据库方式
  • .net生成的类,跨工程调用显示注释
  • .Net实现SCrypt Hash加密
  • .net中生成excel后调整宽度
  • @德人合科技——天锐绿盾 | 图纸加密软件有哪些功能呢?
  • [ Python ]使用Charles对Python程序发出的Get与Post请求抓包-解决Python程序报错问题
  • [Android] Upload package to device fails #2720