Kaggler日志-Day4

进度24/12/14

昨日复盘:
Pandas课程完成
Intermediate Mechine Learning2/7

今日记录:
Intermediate Mechine Learning之类型变量
读两篇讲解如何提问的文章,在提问区里发起一次提问
实战:自己从头到尾首先Housing Prices Competition for Kaggle Learn Users并成功提交

Intermediate Mechine Learning之管道(pipeline之前一直错译为工作流)

Categorical Variables

将学习三种处理类别特征的方式

我的文章里更倾向于将Variables翻译为特征
特征类型通常分为数值型和类别型

  • 策略一:丢弃
  • 策略二:顺序编码:为每一个种类分配一个独特的数值。不是所有的类型变量都能有一个排序来对应到顺序编码上,但是对于树形模型,有序编码通常可以很好地工作。
  • 策略三:One-hot编码,为每一类创建新的列。通常在类型没有内在顺序时工作地很好,但是类型数量不能过多。

获取是字符类型的特征:

# Get list of categorical variables
s = (X_train.dtypes == 'object')
object_cols = list(s[s].index)print("Categorical variables:")
print(object_cols)

策略一:丢弃

drop_X_train = X_train.select_dtypes(exclude=['object'])
drop_X_valid = X_valid.select_dtypes(exclude=['object'])

策略二:顺序编码

from sklearn.preprocessing import OrdinalEncoder# Make copy to avoid changing original data 
label_X_train = X_train.copy()
label_X_valid = X_valid.copy()# Apply ordinal encoder to each column with categorical data
ordinal_encoder = OrdinalEncoder()
label_X_train[object_cols] = ordinal_encoder.fit_transform(X_train[object_cols])
label_X_valid[object_cols] = ordinal_encoder.transform(X_valid[object_cols])

问题出现,有些在train中没有出现过的类型应该如何处理,首先对数据进行探索,将类别列分成可以安全编码的列和不可以安全编码的列

# Categorical columns in the training data
object_cols = [col for col in X_train.columns if X_train[col].dtype == "object"]
# Columns that can be safely ordinal encoded
good_label_cols = [col for col in object_cols if set(X_valid[col]).issubset(set(X_train[col]))]
# Problematic columns that will be dropped from the dataset
bad_label_cols = list(set(object_cols)-set(good_label_cols))
print('Categorical columns that will be ordinal encoded:', good_label_cols)
print('\nCategorical columns that will be dropped from the dataset:', bad_label_cols)

当前最简策略是:丢弃不可以进行安全编码的类别列,之后再应用顺序编码。
label_X_train = X_train.drop(bad_label_cols, axis=1)
label_X_valid = X_valid.drop(bad_label_cols, axis=1)

策略三:独热编码

from sklearn.preprocessing import OneHotEncoder# Apply one-hot encoder to each column with categorical data
OH_encoder = OneHotEncoder(handle_unknown='ignore', sparse=False)
OH_cols_train = pd.DataFrame(OH_encoder.fit_transform(X_train[object_cols]))
OH_cols_valid = pd.DataFrame(OH_encoder.transform(X_valid[object_cols]))# One-hot encoding removed index; put it back
OH_cols_train.index = X_train.index
OH_cols_valid.index = X_valid.index# Remove categorical columns (will replace with one-hot encoding)
num_X_train = X_train.drop(object_cols, axis=1)
num_X_valid = X_valid.drop(object_cols, axis=1)# Add one-hot encoded columns to numerical features
OH_X_train = pd.concat([num_X_train, OH_cols_train], axis=1)
OH_X_valid = pd.concat([num_X_valid, OH_cols_valid], axis=1)# Ensure all columns have string type
OH_X_train.columns = OH_X_train.columns.astype(str)
OH_X_valid.columns = OH_X_valid.columns.astype(str)

在开始之前,首先调查类别特征信息

# Get number of unique entries in each column with categorical data
object_nunique = list(map(lambda col: X_train[col].nunique(), object_cols))
d = dict(zip(object_cols, object_nunique))# Print number of unique entries by column, in ascending order
sorted(d.items(), key=lambda x: x[1])

与上一个方法一样,先找出本方法适用的列,对于列别数量过多的列,可以直接丢弃或者使用顺序编码。

# Columns that will be one-hot encoded
low_cardinality_cols = [col for col in object_cols if X_train[col].nunique() < 10]
# Columns that will be dropped from the dataset
high_cardinality_cols = list(set(object_cols)-set(low_cardinality_cols))
print('Categorical columns that will be one-hot encoded:', low_cardinality_cols)
print('\nCategorical columns that will be dropped from the dataset:', high_cardinality_cols)

最终代码

from sklearn.preprocessing import OneHotEncoder# Use as many lines of code as you need!
# low_OH_X_train = X_train.drop(high_cardinality_cols, axis=1)
# low_OH_X_valid = X_valid.drop(high_cardinality_cols, axis=1)OH_encoder = OneHotEncoder(handle_unknown='ignore', sparse_output=False)
OH_cols_train = pd.DataFrame(OH_encoder.fit_transform(X_train[low_cardinality_cols]))
OH_cols_valid = pd.DataFrame(OH_encoder.transform(X_valid[low_cardinality_cols]))OH_cols_train.index = low_OH_X_train.index
OH_cols_valid.index = low_OH_X_valid.indexnum_X_train = X_train.drop(object_cols, axis=1)
num_X_valid = X_valid.drop(object_cols, axis=1)OH_X_train = pd.concat([num_X_train, OH_cols_train], axis=1) # Your code here
OH_X_valid = pd.concat([num_X_valid, OH_cols_valid], axis=1) # Your code hereOH_X_train.columns = OH_X_train.columns.astype(str)
OH_X_valid.columns = OH_X_valid.columns.astype(str)print(OH_X_train.columns)
# Check your answer
step_4.check()
问题

为什么最后需要将所有列转化为字符串类型?
在论坛里提问,首先查看两篇提问说明
Kaggle Community Guidelines
Frequently Asked Questions

Ask Question in discussion area

发出提问。

实战:利用Missing Value和Categorical variable的知识自己写一份Notebook并成功提交

# This Python 3 environment comes with many helpful analytics libraries installed
# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python
# For example, here's several helpful packages to loadimport numpy as np # linear algebra
import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)# Input data files are available in the read-only "../input/" directory
# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directoryimport os
for dirname, _, filenames in os.walk('/kaggle/input'):for filename in filenames:print(os.path.join(dirname, filename))# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using "Save & Run All" 
# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session
# Load original data
from sklearn.model_selection import train_test_splitX_full = pd.read_csv("/kaggle/input/home-data-for-ml-course/train.csv")
X_test = pd.read_csv("/kaggle/input/home-data-for-ml-course/test.csv")X_full.dropna(axis=0, subset=['SalePrice'], inplace=True)
y = X_full.SalePrice
X_full.drop(['SalePrice'], axis=1, inplace=True)X_train, X_valid, y_train, y_valid = train_test_split(X_full, y, train_size=0.8, test_size=0.2,random_state=0)
# define evaluation functions,
# and submit file generation functions
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_absolute_errordef score_dataset(X_train, X_valid, y_train, y_valid, model):model.fit(X_train, y_train)preds = model.predict(X_valid)return mean_absolute_error(y_valid, preds)def generate_submit_file(X_test, model):preds_test = model.predict(X_test)output = pd.DataFrame({'Id': X_test.Id,'SalePrice': preds_test})output.to_csv('submission.csv', index=False)print("submission.csv saved.")return outputprint("func defined")
# define data_preprocesser
from sklearn.preprocessing import OrdinalEncoderdef na_processer(X_data, non_cols, is_train=False):# non_cols = [col for col in X_data.columns if X_data[col].isnull().any()]X_data = X_data.drop(non_cols, axis=1)return X_data# def cate_processer(X_data, bad_cols, good_cols, is_train=False):
#     # cate_cols = [col for col in X_data.columns if X_data[col].dtype=="object"]#     X_data = X_data.drop(cate_cols, axis=1)#     return X_datadef data_preprocesser(train, valid, test):"""X_data referce to datasetis_train is used to show whether X_data is training data"""# missing valuestrain_non_cols = [col for col in train.columns if train[col].isnull().any()]valid_non_cols = [col for col in valid.columns if valid[col].isnull().any()]test_non_cols = [col for col in test.columns if test[col].isnull().any()]non_cols = train_non_cols + valid_non_cols + test_non_cols# drop na colsX_train = na_processer(train, non_cols, is_train=True)X_valid = na_processer(valid, non_cols)X_test = na_processer(test, non_cols)# categorical variable: odinary encodingobject_cols = [col for col in X_train.columns if X_train[col].dtype == "object"]good_label_cols = [col for col in object_cols if set(X_valid[col]).issubset(set(X_train[col])) and set(X_test[col]).issubset(set(X_train[col]))]bad_label_cols = list(set(object_cols)-set(good_label_cols))ordinal_encoder = OrdinalEncoder()# encode good colsX_train[good_label_cols] = ordinal_encoder.fit_transform(X_train[good_label_cols])X_valid[good_label_cols] = ordinal_encoder.transform(X_valid[good_label_cols])X_test[good_label_cols] = ordinal_encoder.transform(X_test[good_label_cols])# drop bad colsX_train.drop(bad_label_cols, axis=1, inplace=True)X_valid.drop(bad_label_cols, axis=1, inplace=True)X_test.drop(bad_label_cols, axis=1, inplace=True)return X_train, X_valid, X_testprint("func defined")
# train and valid
model = RandomForestRegressor(n_estimators=100, random_state=0)final_X_train, final_X_valid, final_X_test = data_preprocesser(X_train, X_valid, X_test)# print(final_X_train.dtypes)
score = score_dataset(final_X_train, final_X_valid, y_train, y_valid, model)
print(f"MAE socre is {score}")# generate test output
output = generate_submit_file(final_X_test, model)

问题:提交失败,经过查看发现是Id列的问题

def generate_submit_file(X_test, model):preds_test = model.predict(X_test)output = pd.DataFrame({'Id': X_test.index,  #这里应该写成X_test.Id'SalePrice': preds_test})output.to_csv('submission.csv', index=False)print("submission.csv saved.")return output

修改后提交成功
在这里插入图片描述

Pipeline

管道是一种组织预处理和建模代码的简单方法。打包预处理和建模过程中的各个步骤。

虽然有些人完全不用pipeline, 它的好处如下:

  • 清晰的代码
  • 更少的Bug
  • 更方便投产
  • 更多的验证选择

超级简洁明了的代码,比之前的清晰很多,但需要详细了解一下pipeline的用法。

from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import OneHotEncoder# 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)])from sklearn.ensemble import RandomForestRegressormodel = RandomForestRegressor(n_estimators=100, random_state=0)from sklearn.metrics import mean_absolute_error# 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)

pipeline和columnTransformer极大简化了代码和编码流程。可以更加专注于策略的选择。

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

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

相关文章

【常考前端面试题总结】---2025

React fiber架构 1.为什么会出现 React fiber 架构? React 15 Stack Reconciler 是通过递归更新子组件 。由于递归执行&#xff0c;所以更新一旦开始&#xff0c;中途就无法中断。当层级很深时&#xff0c;递归更新时间超过了 16ms&#xff0c;用户交互就会卡顿。对于特别庞…

二三(Node2)、Node.js 模块化、package.json、npm 软件包管理器、nodemon、Express、同源、跨域、CORS

1. Node.js 模块化 1.1 CommonJS 标准 utils.js /*** 目标&#xff1a;基于 CommonJS 标准语法&#xff0c;封装属性和方法并导出*/ const baseURL "http://hmajax.itheima.net"; const getArraySum (arr) > arr.reduce((sum, item) > (sum item), 0);mo…

Java爬虫设计:淘宝商品详情接口数据获取

1. 概述 淘宝商品详情接口&#xff08;如Taobao.item_get&#xff09;允许开发者通过编程方式&#xff0c;以JSON格式实时获取淘宝商品的详细信息&#xff0c;包括商品标题、价格、销量等。本文档将介绍如何设计一个Java爬虫来获取这些数据。 2. 准备工作 在开始之前&#x…

LeetCode-hot100-73

https://leetcode.cn/problems/largest-rectangle-in-histogram/description/?envTypestudy-plan-v2&envIdtop-100-liked 84. 柱状图中最大的矩形 已解答 困难 相关标签 相关企业 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#x…

【docker】springboot 服务提交至docker

准备docker &#xff08;不是docker hub或者harbor&#xff0c;就是可以运行docker run的服务&#xff09;&#xff0c;首先确保docker已经安装。 本文以linux下举例说明&#xff1a; systemctl stats docker ● docker.service - Docker Application Container EngineLoaded…

通过ajax的jsonp方式实现跨域访问,并处理响应

一、场景描述 现有一个项目A&#xff0c;需要请求项目B的某个接口&#xff0c;并根据B接口响应结果A处理后续逻辑。 二、具体实现 1、前端 前端项目A发送请求&#xff0c;这里通过jsonp的方式实现跨域访问。 $.ajax({ url:http://10.10.2.256:8280/ssoCheck, //请求的u…

Unity 沿圆周创建Sphere

思路 取圆上任意一点连接圆心即为半径&#xff0c;以此半径为斜边作直角三角形。当已知圆心位置与半径长度时&#xff0c;即可得该点与圆心在直角三角形两直角边方向上的位置偏移&#xff0c;从而得出该点的位置。 实现 核心代码 offsetX radius * Mathf.Cos(angle * Mathf…

9. 高效利用Excel设置归档Tag

高效利用Excel设置归档Tag 1. Excle批量新建/修改归档Tag2. 趋势记录模型批量导入归档Tag(Method1)2. 趋势记录模型批量导入归档Tag(Method2)3. 趋势记录控件1. Excle批量新建/修改归档Tag Fcatory Talk常常需要归档模拟量,对于比较大的项目工程会有成千上万个重要数据需…

网页端web内容批注插件:

感觉平时每天基本上90%左右的时间都在浏览器端度过&#xff0c;按理说很多资料都应该在web端输入并且输出&#xff0c;但是却有很多时间浪费到了各种桌面app中&#xff0c;比如说什么notion、语雀以及各种笔记软件中&#xff0c;以及导入到ipad的gn中&#xff0c;这些其实都是浪…

数据结构——栈的模拟实现

大家好&#xff0c;今天我要介绍一下数据结构中的一个经典结构——栈。 一&#xff1a;栈的介绍 与顺序表和单链表不同的是&#xff1a; 顺序表和单链表都可以在头部和尾部插入和删除数据&#xff0c;但是栈的结构就锁死了&#xff08;栈的底部是堵死的&#xff09;栈只能从…

基于springboot+vue的高校校园交友交流平台设计和实现

文章目录 系统功能部分实现截图 前台模块实现管理员模块实现 项目相关文件架构设计 MVC的设计模式基于B/S的架构技术栈 具体功能模块设计系统需求分析 可行性分析 系统测试为什么我&#xff1f; 关于我项目开发案例我自己的网站 源码获取&#xff1a; 系统功能 校园交友平台…

让文案生成更具灵活性/chatGPT新功能canvas画布编辑

​ ​ OpenAI最近在2024年12月发布了canvas画布编辑功能&#xff0c;这是一项用途广泛的创新工具&#xff0c;专为需要高效创作文案的用户设计。 无论是职场人士、学生还是创作者&#xff0c;这项功能都能帮助快速生成、优化和编辑文案&#xff0c;提升效率的同时提高内容质量…

递归问题(c++)

递归设计思路 数列递归 : 如果一个数列的项与项之间存在关联性&#xff0c;那么可以使用递归实现 ; 原理 : 如果一个函数可以求A(n)&#xff0c;那么该函数就可以求A(n-1)&#xff0c;就形成了递归调用 ; 注意: 一般起始项是不需要求解的&#xff0c;是已知条件 这就是一个典型…

AI Alignment: A Comprehensive Survey---摘要、简介

题目 人工智能对齐&#xff1a;全面调查 摘要 人工智能对齐旨在使人工智能系统的行为符合人类的意图和价值观。随着人工智能系统的能力不断增强&#xff0c;错位的风险也在不断增加。为了提供对齐领域的全面和最新概述&#xff0c;在本调查中&#xff0c;我们深入研究了对齐的…

Linux中vi和vim的区别详解

文章目录 Linux中vi和vim的区别详解一、引言二、vi和vim的起源与发展三、功能和特性1、语法高亮2、显示行号3、编辑模式4、可视化界面5、功能扩展6、插件支持 四、使用示例1、启动编辑器2、基本操作 五、总结 Linux中vi和vim的区别详解 一、引言 在Linux系统中&#xff0c;vi和…

【工具变量】上市公司企业经营困境指数数据(Zscore、Oscore、RLPM、Merton DD)2000-2021年

一、资料范围&#xff1a;包括Zscore、Oscore、RLPM、Merton DD&#xff0c;经营困境说明如下&#xff1a;&#xff08;1&#xff09;Zscore&#xff1a;以2.67和1.81作为临界值计算样本得分所处的范围。Zscore>2.67 为财务状况良好&#xff0c;发生破产的可能性较小。Zscor…

5G中的ATG Band

Air to Ground Networks for NR是R18 NR引入的。ATG很多部分和NTN类似中的内容类似。比较明显不同的是&#xff0c;NTN的RF内容有TS 38.101-5单独去讲&#xff0c;而ATG则会和地面网络共用某些band&#xff0c;这部分在38.101-1中有描述。 所以会存在ATG与地面网络之间的相邻信…

spring cloud contract http实例

微服务很多时&#xff0c;服务之前相互调用&#xff0c;接口参数的一致性要变得很难维护。 spring cloud contract 提供了测试接口一致性的方法。 一 项目配置 plugins {id "groovy"id "org.springframework.cloud.contract" version "4.0.5"i…

JIS-CTF: VulnUpload靶场渗透

JIS-CTF: VulnUpload来自 <https://www.vulnhub.com/entry/jis-ctf-vulnupload,228/> 1,将两台虚拟机网络连接都改为NAT模式 2&#xff0c;攻击机上做namp局域网扫描发现靶机 nmap -sn 192.168.23.0/24 靶机IP地址192.168.23.162&#xff0c;攻击机IP地址192.168.23.140…

数据分析思维(一):业务指标(数据分析并非只是简单三板斧)

个人认为&#xff0c;数据分析并非只是简单的数据分析工具三板斧——Excel、SQL、Python&#xff0c;更重要的是数据分析思维。没有数据分析思维和业务知识&#xff0c;就算拿到一堆数据&#xff0c;也不知道如何下手。 推荐书本《数据分析思维——分析方法和业务知识》&#x…