2017.08.01回顾 xgboost get_dummies 尽可能留变量

本文回顾了使用xgboost进行数据建模的过程,探讨了xgboost的基分类器和参数设置,如线性分类器、dart等。在数据预处理中,通过get_dummies进行哑变量转换,降低了交叉验证的平均绝对误差。同时,发现xgboost能有效处理高度缺失值的变量。遇到的大问题是大型数据集转换为xgb.DMatrix速度过慢,考虑使用服务器或云计算平台解决。

节奏不要乱,做应该做的事情,一些不应该做的事情需要克制!

1、上午就是抓取建模变量,对变量做一些初步encode的工作,集中注意力弄了一上午,应该完成了1/3

2 、继续zillow数据建模,有几点收获:

  • xgboost的基分类器是CART,但是也可以用线性分类器,booster参数可以设置,似乎还有一个名叫dart的分类器,听朋友说是神经网络相关的
  • 整理了所有变量的预处理方法
  • 尝试了drop掉90% missing value的字段,但是在lb上效果很烂,CV好像是有所提升
  • 又尝试drop掉了一些地区类的字段,也没能提升lb的排名
  • 感觉到xgboost的这个方法根本不怕多喂他变量,不怕处理高度缺失值的变量
  • 最后我尝试把某些变量转换成哑变量,方法是直接调用pd.get_dummies方法,这个方法有参数可以控制是否转换NaN,他常用参数形如
    pd.get_dummies(df,prefix=['col1','col2'])
    后面的prefix前缀于前面的df列数相对应,如果后面prefix少一个,前面有一列就不会被dummy,这个函数返回一个dummy化的DF,添加到原raw_df可以用
    raw_df = raw_df.join(df)
    可以添加到raw_df后面
  • 添加了dummies变量后,交叉验证mae下降了,感觉有一定希望,但是xgb.DMatrix转换300万*156太慢了,跑了一个小时,那个kernel直接down掉,我发现不能用本机来跑,用本机来跑,我的工作直接会pending在那里,我需要想个办法,要不然找台服务器,要不然利用云计算平台
  • 老司机所说的保留尽可能多的特征是有道理的,可能xgboost这种算法有非常优秀的工程化实现,可以容忍各种缺失的,不完备的数据集
  • 线性相关性对于xgboost训练的影响,我实际数据集中有3个自变量高
<think> 我们被要求解释pandas库中的get_dummies()函数的使用方法。参考之前提供的引用,我们可以总结如下: get_dummies()函数用于将分类变量转换为哑变量/指示变量(dummy/indicator variables)。它常用于机器学习中的特征处理,将类别型变量转换为0/1的二进制列。 函数语法: pandas.get_dummies(data, prefix=None, prefix_sep='_', dummy_na=False, columns=None, sparse=False, drop_first=False, dtype=None) 参数解析(根据引用[1][3][4][5]): - data: 输入数据,可以是DataFrame或Series。 - prefix: 用于新列名的前缀。可以是字符串、字符串列表或字典(为每列指定不同的前缀)。默认为None,此时使用原列名。 - prefix_sep: 前缀和类别值之间的分隔符,默认为下划线'_'。 - dummy_na: 布尔值,默认为False。如果为True,则增加一列表示缺失值(NaN)。 - columns: 指定需要转换的列名列表。默认为None,表示转换所有类别型变量(非数值型的列)。 - sparse: 布尔值,默认为False。是否返回稀疏矩阵(Sparse DataFrame)。 - drop_first: 布尔值,默认为False。如果为True,则删除每个分类变量的第一个类别(避免多重共线性,在回归中常用)。 - dtype: 新列的数据类型,默认为np.uint8。 使用步骤: 1. 导入pandas:`import pandas as pd` 2. 准备数据:通常是一个包含类别型变量的DataFrame。 3. 调用`pd.get_dummies()`,传入数据和其他参数。 示例: 假设有以下DataFrame: ```python import pandas as pd df = pd.DataFrame({ 'A': ['a', 'b', 'a'], 'B': ['b', 'a', 'c'], 'C': [1, 2, 3] }) ``` 1. 基本转换: ```python pd.get_dummies(df) ``` 结果: C A_a A_b B_a B_b B_c 0 1 1 0 0 1 0 1 2 0 1 1 0 0 2 3 1 0 0 0 1 注意:数值列C被保留,非数值列A和B被转换成多个哑变量列。 2. 指定列转换(columns): ```python pd.get_dummies(df, columns=['A']) ``` 结果: B C A_a A_b 0 b 1 1 0 1 a 2 0 1 2 c 3 1 0 # 注意:这里第三行A列是'a',所以A_a为1,A_b为0(因为没有'b',所以为0) 3. 使用前缀(prefix)和前缀分隔符(prefix_sep): ```python pd.get_dummies(df, prefix=['col1', 'col2']) ``` 结果: C col1_a col1_b col2_a col2_b col2_c 0 1 1 0 0 1 0 1 2 0 1 1 0 0 2 3 1 0 0 0 1 注意:这里给A列加了前缀'col1',B列加了前缀'col2'。 4. 处理缺失值(dummy_na): ```python df_nan = pd.DataFrame({'D': ['a', 'b', np.nan]}) pd.get_dummies(df_nan, dummy_na=True) ``` 结果: D_a D_b D_nan 0 1 0 0 1 0 1 0 2 0 0 1 5. 删除第一个类别(drop_first)以避免多重共线性: ```python pd.get_dummies(df, drop_first=True) ``` 结果: C A_b B_a B_c 0 1 0 0 0 # 注意:A列的第一个类别是'a',被删除了,所以只保留A_b;同理B列删除了第一个类别'b'(按字母顺序),保留B_a和B_c。 1 2 1 1 0 2 3 0 0 1 注意:drop_first=True会删除每个分类变量的第一个类别(按字母排序)。 6. 设置数据类型(dtype): ```python pd.get_dummies(df, dtype=float) ``` 注意事项(引用[2]): - 当类别变量取值较多时,会产生大量新列,导致维度灾难,需谨慎使用。 - 在回归模型中,通常需要设置drop_first=True以避免多重共线性问题。 - 可以结合缺失值处理(dummy_na)来保留缺失信息。 相关问题: 1. get_dummies()函数处理数值型和类别型列的方式有什么不同? 2. 在机器学习模型中使用独热编码时,为什么有时需要删除第一个类别? 3. 如何处理大数据集下的高基数分类变量(即类别取值非常多)? 4. 如何将get_dummies()与pandas的cut/qcut函数结合使用? 5. 使用get_dummies()后如何恢复原始分类变量? 注意:在回答中,我们引用了多个引用,需要在适当位置标注引用标识。 </think> # Pandas中get_dummies()函数详解 `pd.get_dummies()`是Pandas中处理分类变量的核心函数,它将**类别型数据转换为独热编码(One-Hot Encoding)**,便于机器学习算法处理。下面详细介绍其使用方法:[^1][^3][^4] ## 函数语法 ```python pandas.get_dummies( data, prefix=None, prefix_sep='_', dummy_na=False, columns=None, sparse=False, drop_first=False, dtype=None ) ``` ## 核心参数解析 | 参数 | 说明 | 默认值 | 示例 | |------|------|--------|------| | `data` | 输入数据(DataFrame或Series) | 必需 | `df` | | `prefix` | 新列名前缀(字符串/列表/字典) | None | `'cat'` | | `prefix_sep` | 前缀与类别的分隔符 | `'_'` | `'-'` | | `dummy_na` | 是否为NaN创建新列 | False | True | | `columns` | 指定要转换的列 | None | `['color', 'size']` | | `drop_first` | 是否删除第一个类别 | False | True | | `dtype` | 输出数据类型 | uint8 | float | ## 基本使用示例 ### 1. 基础转换 ```python import pandas as pd df = pd.DataFrame({'color': ['红', '蓝', '绿', '蓝']}) pd.get_dummies(df) ``` 输出: ``` color_红 color_蓝 color_绿 0 1 0 0 1 0 1 0 2 0 0 1 3 0 1 0 ``` ### 2. 添加前缀 ```python pd.get_dummies(df, prefix='COL') ``` 输出: ``` COL_红 COL_蓝 COL_绿 0 1 0 0 1 0 1 0 2 0 0 1 3 0 1 0 ``` ### 3. 处理缺失值 ```python df_nan = pd.DataFrame({'size': ['S', 'M', None, 'L']}) pd.get_dummies(df_nan, dummy_na=True) ``` 输出: ``` size_L size_M size_S size_nan 0 0 0 1 0 1 0 1 0 0 2 0 0 0 1 3 1 0 0 0 ``` ### 4. 避免多重共线性 ```python pd.get_dummies(df, drop_first=True) ``` 输出: ``` color_蓝 color_绿 0 0 0 1 1 0 2 0 1 3 1 0 ``` ## 高级应用场景 ### 1. 多列同时转换 ```python df_multi = pd.DataFrame({ 'color': ['红', '蓝', '绿'], 'size': ['S', 'M', 'L'] }) pd.get_dummies(df_multi, columns=['color', 'size']) ``` ### 2. 自定义前缀映射 ```python prefix_mapping = {'color': 'COL', 'size': 'SZ'} pd.get_dummies(df_multi, prefix=prefix_mapping) ``` ### 3. 与数值列共存 ```python df_num = pd.DataFrame({ 'price': [10, 20, 30], 'category': ['A', 'B', 'A'] }) pd.get_dummies(df_num) ``` ## 注意事项 1. **高基数问题**:当类别过多时会导致维度爆炸,建议先进行类别合并[^2] 2. **内存管理**:使用`sparse=True`可节省内存(返回稀疏矩阵)[^4] 3. **回归模型**:线性模型中务必设置`drop_first=True`避免完全多重共线性[^5] 4. **数据类型**:通过`dtype`控制输出类型可节省内存(如dtype=bool) ## 最佳实践 ```python # 典型预处理流程 processed = ( df .filter(['category', 'size']) # 选择需要转换的列 .pipe(pd.get_dummies, prefix_sep=':', drop_first=True, dummy_na=True) ) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值