机器学习必修课 - 使用管道 Pipeline

目标:学习使用管道(pipeline)来提高机器学习代码的效率。

1. 运行环境:Google Colab

import pandas as pd
from sklearn.model_selection import train_test_split
!git clone https://github.com/JeffereyWu/Housing-prices-data.git
  • 下载数据集

2. 加载房屋价格数据集,进行数据预处理,并将数据划分为训练集和验证集

# Read the data
X_full = pd.read_csv('/content/Housing-prices-data/train.csv', index_col='Id')
X_test_full = pd.read_csv('/content/Housing-prices-data/test.csv', index_col='Id')# Remove rows with missing target, separate target from predictors
X_full.dropna(axis=0, subset=['SalePrice'], inplace=True)
y = X_full.SalePrice
X_full.drop(['SalePrice'], axis=1, inplace=True)# Break off validation set from training data
X_train_full, X_valid_full, y_train, y_valid = train_test_split(X_full, y, train_size=0.8, test_size=0.2,random_state=0)
  • 使用Pandas的read_csv函数从指定路径读取训练集和测试集的CSV文件。index_col='Id'表示将数据集中的’Id’列作为索引列。
  • X_full数据中删除了带有缺失目标值的行,这是因为目标值(‘SalePrice’)是我们要预测的值,所以必须确保每个样本都有一个目标值。然后,将目标值从X_full数据中分离出来,存储在变量y中,并从X_full中删除了目标值列,以便将其视为预测特征。

3. 选择具有相对低基数(唯一值数量较少)的分类(categorical)列

# "Cardinality" means the number of unique values in a column
# Select categorical columns with relatively low cardinality (convenient but arbitrary)
categorical_cols = [cname for cname in X_train_full.columns ifX_train_full[cname].nunique() < 10 and X_train_full[cname].dtype == "object"]
  • 识别具有相对较少不同类别的分类列,因为这些列更适合进行独热编码,而不会引入太多的新特征。

4. 选择数值型(numerical)列

# Select numerical columns
numerical_cols = [cname for cname in X_train_full.columns if X_train_full[cname].dtype in ['int64', 'float64']]
  • 识别数据集中包含数值数据的列,因为这些列通常用于构建数值特征,并且需要用于训练和评估数值型机器学习模型。

5. 将数据集中的列限制在所选的分类(categorical)列和数值(numerical)列上

# Keep selected columns only
my_cols = categorical_cols + numerical_cols
X_train = X_train_full[my_cols].copy()
X_valid = X_valid_full[my_cols].copy()
X_test = X_test_full[my_cols].copy()
  • 创建了一个名为my_cols的列表,其中包含了要保留的列名
  • 使用X_train_full[my_cols].copy()X_valid_full[my_cols].copy()从原始训练数据集(X_train_fullX_valid_full)中创建了新的数据集(X_trainX_valid)。这两个数据集只包含了my_cols中列名所对应的列,其他列被丢弃了。最后,同样的操作也被应用到测试数据集上,创建了包含相同列的测试数据集X_test
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import OneHotEncoder
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_absolute_error

6. 准备数值型数据和分类型数据以供机器学习模型使用

# Preprocessing for numerical data
numerical_transformer = SimpleImputer(strategy='constant')# Preprocessing for categorical data
categorical_transformer = Pipeline(steps=[('imputer', SimpleImputer(strategy='most_frequent')),('onehot', OneHotEncoder(handle_unknown='ignore'))
])# Bundle preprocessing for numerical and categorical data
preprocessor = ColumnTransformer(transformers=[('num', numerical_transformer, numerical_cols),('cat', categorical_transformer, categorical_cols)])
  • 创建了一个名为numerical_transformer的预处理器,用于处理数值型数据。在这里,使用了SimpleImputer,并设置了策略为’constant’,表示将缺失的数值数据填充为一个常数值。
  • 使用SimpleImputer来填充缺失值,策略为’most_frequent’,表示使用出现频率最高的值来填充缺失的分类数据。
  • 使用OneHotEncoder来执行独热编码,将分类数据转换成二进制的形式,并且设置了handle_unknown='ignore',以处理在转换过程中遇到未知的分类值。
  • 使用ColumnTransformer来组合数值型和分类型数据的预处理器,将它们一起构建成一个整体的预处理过程。

7. 建立、训练和评估一个随机森林回归模型

# Define model
model = RandomForestRegressor(n_estimators=100, random_state=0)# Bundle preprocessing and modeling code in a pipeline
clf = Pipeline(steps=[('preprocessor', preprocessor),('model', model)])# Preprocessing of training data, fit model 
clf.fit(X_train, y_train)# Preprocessing of validation data, get predictions
preds = clf.predict(X_valid)print('MAE:', mean_absolute_error(y_valid, preds))
  • 创建了一个名为model的机器学习模型。在这里,使用了随机森林回归模型,它是一个基于决策树的集成学习模型,包含了100颗决策树,并设置了随机种子random_state为0,以确保结果的可重复性。
  • 创建了一个名为clf的机器学习管道(Pipeline)。管道将数据预处理步骤(preprocessor)和模型训练步骤(model)捆绑在一起,确保数据首先被预处理,然后再用于模型训练。
  • MAE是一种衡量模型预测误差的指标,其值越小表示模型的性能越好。

MAE: 17861.780102739725

8. 重新进行数据预处理和定义一个机器学习模型

# Preprocessing for numerical data
numerical_transformer = SimpleImputer(strategy='constant')# Preprocessing for categorical data
categorical_transformer = Pipeline(steps=[('imputer', SimpleImputer(strategy='constant')),('onehot', OneHotEncoder(handle_unknown='ignore'))
])# Bundle preprocessing for numerical and categorical data
preprocessor = ColumnTransformer(transformers=[('num', numerical_transformer, numerical_cols),('cat', categorical_transformer, categorical_cols)])# Define model
model = RandomForestRegressor(n_estimators=100, random_state=0)
  • 使用SimpleImputer来填充分类型数据中的缺失值,策略改为’constant’,改用常数值填充。
# Bundle preprocessing and modeling code in a pipeline
my_pipeline = Pipeline(steps=[('preprocessor', preprocessor),('model', model)])# Preprocessing of training data, fit model 
my_pipeline.fit(X_train, y_train)# Preprocessing of validation data, get predictions
preds = my_pipeline.predict(X_valid)# Evaluate the model
score = mean_absolute_error(y_valid, preds)
print('MAE:', score)

MAE: 17621.3197260274

9. 再一次进行数据预处理和定义一个机器学习模型

# 自定义数值型数据的预处理步骤
numerical_transformer = Pipeline(steps=[('imputer', SimpleImputer(strategy='mean')),  # 可以使用均值填充缺失值
])# 自定义分类型数据的预处理步骤
categorical_transformer = Pipeline(steps=[('imputer', SimpleImputer(strategy='most_frequent')),  # 使用最频繁的值填充缺失值('onehot', OneHotEncoder(handle_unknown='ignore'))  # 执行独热编码
])# 定义自己的模型
model = RandomForestRegressor(n_estimators=200, random_state=42)  # 增加决策树数量,设置随机种子# 将自定义的预处理和模型捆绑在一起
clf = Pipeline(steps=[('preprocessor', preprocessor),('model', model)])# 预处理训练数据,训练模型
clf.fit(X_train, y_train)# 预处理验证数据,获取预测结果
preds = clf.predict(X_valid)print('MAE:', mean_absolute_error(y_valid, preds))

MAE: 17468.0611130137

# Preprocessing of test data, fit model
preds_test = clf.predict(X_test)
# Save test predictions to file
output = pd.DataFrame({'Id': X_test.index,'SalePrice': preds_test})
output.to_csv('submission.csv', index=False)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/96168.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(一)正点原子STM32MP135移植——准备

一、简述 使用板卡&#xff1a;正点原子的ATK-DLMP135 V1.2 从i.mx6ull学习完过来&#xff0c;想继续学习一下移植uboot和内核的&#xff0c;但是原子官方没有MP135的移植教程&#xff0c;STM32MP157的移植教程用的又是老版本的代码&#xff0c;ST官方更新后的代码不兼容老版本…

Redis缓存设计与性能优化

文章目录 一、缓存穿透二、缓存失效(击穿)三、缓存雪崩四、热点缓存key重建优化五、缓存与数据库双写不一致六、开发规范与性能优化键值设计key名设计value设计 命令使用客户端使用系统内核参数优化vm.swapinessvm.overcommit_memory(默认0)合理设置文件句柄数慢查询日志&#…

包装类?为什么需要包装类?

包装类是一种用于将基本数据类型(如整数、浮点数、字符等)封装成对象的类。在Java和许多其他编程语言中,基本数据类型是不具备面向对象特性的,它们不是对象,不能进行方法调用或参与泛型化。为了弥补这一不足,Java引入了包装类,允许基本数据类型被当作对象来处理。 Java…

ZRTP交叉编译与移植

1 ZRTP源码下载 这里采用的是libzrtp来自于freeswitch&#xff1a;libs/libzrtp。 2 ZRTP交叉编译 zrtp编译比较简单&#xff0c;采用configure进行编译在根目录心中zrtp编译脚本&#xff0c;只需要指定交叉编译工具链和安装地址即可。脚本如下所示&#xff1a; unset CC C…

【刷题笔记10.6】LeetCode:汉明距离

LeetCode&#xff1a;汉明距离 一、题目描述 两个整数之间的汉明距离是指这两个数字对应二进制位不同的位置的数目。 给你两个整数x 和 y&#xff0c;计算并返回他们之间的汉明距离。 二、分析及代码实现 对于汉明距离问题我们其实可以将其转换为&#xff1a;计算x 和 y按…

使用opencv及FFmpeg编辑视频

使用opencv及FFmpeg编辑视频 1.融合两个视频2.为视频添加声音2.1 安装ffmpy Python包2.2 下载ffmpeg2.3 代码实现 3.效果参考文献 帮朋友做了一个小作业&#xff0c;具体实现分为几个过程&#xff1a; 将两个mp4格式视频融合到一起为新视频添加声音 1.融合两个视频 其中一个…

makeMakefile

一、 什么是make&Makefile &#xff1f; ①make 是一条命令,makefile是一个文件,配合使用,通过依赖关系和依赖方法达到我们形成可执行程序的目的 ②makefile好处就是可以进行 自动化编译 ” &#xff0c;极大的提高软件开发的效率,一旦写好&#xff0c;只需要一个 make 命令…

MySQL 事务隔离级别与锁机制详解

目录 一、前言二、事务及其ACID属性三、并发事务处理带来的问题四、事务隔离级别4.1、隔离级别分类4.2、查看当前数据库的事务隔离级别:4.3、临时修改数据库隔离级别&#xff08;重启MySQL后恢复到配置中的级别&#xff09; 五、表数据准备六、MySQL常见锁介绍5.1、锁分类5.2、…

【Pytorch笔记】6.Transforms

pytorch官方文档 - transforms transforms需要使用计算机视觉工具包&#xff1a;torchvision。 torchvision.transforms&#xff1a;常用的图像预处理方法&#xff1b; torchvision.datasets&#xff1a;常用数据集的dataset实现&#xff0c;如MNIST、CIFAR-10、ImageNet等&am…

【RK3588】YOLO V5在瑞芯微板子上部署问题记录汇总

YOLO V5训练模型部署到瑞芯微的板子上面&#xff0c;官方是有给出案例和转过详情的。并且也提供了Python版本的推理代码&#xff0c;以及C语言的代码。 但是&#xff0c;对于转换过程中的细节&#xff0c;哪些需要改&#xff1f;怎么改&#xff1f;如何改&#xff0c;和为什么…

1392. 最长快乐前缀

链接&#xff1a; 1392. 最长快乐前缀 题解&#xff1a; class Solution { public:string longestPrefix(string s) {if (s.size() < 0) {return "";}int MOD 1e9 7;// 构建26的n次方&#xff0c;预处理std::vector<long> pow26(s.size());pow26[0] 1…

【已解决】在 Vite 项目中使用 eslint-config-ali 时遇到的解析错误

错误还原 搭建 Vite 项目 pnpm create vite my-vue-app --template vue-ts安装 eslint-config-ali pnpm i -D eslint-config-ali typescript-eslint/parser typescript-eslint/eslint-plugin eslint-plugin-import eslint-import-resolver-typescript vue-eslint-parser esl…

vue3中使用return语句返回this.$emit(),在同一行不执行,换行后才执行,好奇怪!

今天练习TodoList任务列表案例,该案例效果如图所示&#xff1a; 此案例除了根组件App.vue&#xff0c;还有TodoList、TodoInput、TodoButton三个子组件。 因为有视频讲解&#xff0c;在制作TodoList、TodoInput时很顺利&#xff0c;只是在完成TodoButton这个组件时出了点问题…

《protobuf》基础语法3

文章目录 默认值更新规则保留字段未知字段 默认值 在反序列化时&#xff0c;若被反序列化的二进制序列中不包含某个字段&#xff0c;则在反序列化时&#xff0c;就会设置对应默认值。不同的类型默认值不同&#xff1a; 类型默认值字符串“”布尔型false数值类型0枚举型0设置了…

微信开放平台第三方代小程序开发,授权事件、消息与事件通知总结

大家好&#xff0c;我是小悟 时间过得真快&#xff0c;转眼就到了国庆节尾巴&#xff0c;小伙伴们吃好喝好玩好了么。 关于微信开放平台第三方代小程序开发的两个事件接收推送通知&#xff0c;是开放平台代小程序实现业务的重要功能。 授权事件推送&#xff0c;事件类型以In…

ssm+vue的培训机构运营管理系统(有报告)。Javaee项目,ssm vue前后端分离项目。

演示视频&#xff1a; ssmvue的培训机构运营管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;ssm vue前后端分离项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结…

二分查找:34. 在排序数组中查找元素的第一个和最后一个位置

个人主页 &#xff1a; 个人主页 个人专栏 &#xff1a; 《数据结构》 《C语言》《C》《算法》 文章目录 前言一、题目解析二、解题思路1. 暴力查找2. 一次二分查找 部分遍历3. 两次二分查找分别查找左右端点1.查找区间左端点2. 查找区间右端点 三、代码实现总结 前言 本篇文…

queryWrapper的使用教程

大于、等于、小于 eq 等于 例&#xff1a;queryWrapper.eq("属性","lkm") ——> 属性 lkm ne 不等于 例&#xff1a;queryWrapper.ne("属性","lkm") ——> 属性<> lkm gt 大于 例&#xff1a;queryWrapper.gt("属性…

蓝桥杯每日一题2023.10.6

题目描述 门牌制作 - 蓝桥云课 (lanqiao.cn) 题目分析 #include<bits/stdc.h> using namespace std; int ans; int main() {for(int i 1; i < 2020; i ){int x i;while(x){int a x % 10;if(a 2)ans ;x / 10;}}cout << ans;return 0; } 题目描述 既约分数…

C++设计模式-桥接(Bridge)

目录 C设计模式-桥接&#xff08;Bridge&#xff09; 一、意图 二、适用性 三、结构 四、参与者 五、代码 C设计模式-桥接&#xff08;Bridge&#xff09; 一、意图 将抽象部分与它的实现部分分离&#xff0c;使它们都可以独立地变化。 二、适用性 你不希望在抽象和它…