类别变量(categorical variable):只有有限个值得变量,如性别就是一个类别变量,类似于这种。

如果不对这些变量做预处理,训练出来的模型可能是错误的。
主要有三种方法来处理这个变量。
如何从数据中找到类别变量?
我们可以对每一列检查它的数据类型,某列的数据类型为”object",表明该列有文本(也可能是其他的,但对我们的目标来说不重要),某列是数据是文本,则该列表示类别变量。
代码如下:

# 获得类别变量的列名,存放在列表中
s = (X_train.dtypes == 'object')
object_cols = list(s[s].index)

1.直接删除类别变量。

这种方法最简单,如果类别变量不包含有用的信息的话,直接删除。

drop_X_train = X_train.select_dtypes(exclude=['object'])#测试数据也要做相同的操作

2.标签编码(Label Encoding)

类别变量可能的值有顺序,将每个可能值分配给不同的整数。如,从不(0)<很少(1)<经常(2)<每天(3)。我们将这种有顺序的类别变量称为序数变量(ordinal variable )

Scikit-Learning有一个LabelEncoder类,可以用来获取标签编码。我们对分类变量进行循环,并将标签编码器分别应用于每一列。

在此步前通常要查看类别变量在有没有某些值只在验证集出现,如果有的话,直接使用下面这个类来做标签编码会抛出一个错误。因为这些值只在验证集出现。LabelEncoder不会给他们指派整数值。可以编写一个自定义标签编码器来处理类别变量中的新类别。最简单的方法是删除有问题的分类变量。
下面这段代码将有问题的列保存到Python列表‘bad_Label_cols’中。同样,可以安全地进行标签编码的列存储在‘good_Label_cols’中。并将bad_Label_cols的列删除。

object_cols = [col for col in X_train.columns if X_train[col].dtype == "object"]# Columns that can be safely label encoded
good_label_cols = [col for col in object_cols if set(X_train[col]) == set(X_valid[col])]# Problematic columns that will be dropped from the dataset
bad_label_cols = list(set(object_cols)-set(good_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 LabelEncoder# Make copy to avoid changing original data
label_X_train = X_train.copy()
label_X_valid = X_valid.copy()# Apply label encoder to each column with categorical data
label_encoder = LabelEncoder()
for col in object_cols:label_X_train[col] = label_encoder.fit_transform(X_train[col])#fit先获得col列中可能值个数label_X_valid[col] = label_encoder.transform(X_valid[col])# inverse_transform 还可以实现反向编码
上面的代码单元格中,对于每一列(类别变量),我们随机地将每个可能值分配给不同的整数。这是一种比提供自定义标签更简单的通用方法;但是,如果我们为所有序数变量提供更好的信息标签,那么性能将得到进一步的提高。

3.独热编码(One-Hot Encoding)

独热编码:创建新列,指示每个可能值的存在或不存在。例:一个类别变量是颜色,包含三个可能值:红色、黄色、蓝色。独热编码即在原始数据集上新建三列分别指示这三种颜色,如果某一条数据该类别变量是“红色”,则在指示红色的列对应这条数据的位置处放一个1。
与标签编码不同,独热编码不假定类别的顺序,即类别变量的每个可能值没有明显的排序。我们吧这种没有内在排名的类别变量称为名义变量(nominal variables)”
如果类别变量的可能值有非常多(超过15个),独热编码就不能有很好效果。
Scikit-Learning有一个OneHotEncoder类,有许多参数。可参考这篇博客scikit-learn 中 OneHotEncoder 解析

在进行独热编码时,用下面的代码先看下每个类别变量的可能值有多少个。

# 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])

第一行代码参考这个链接就懂了link
zip(): 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象,用list()可转换成列表。如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表。
**dict() **函数用于创建一个字典。
对大型的数据集,独热编码会极大的扩大数据集,因此我们通常只对可能值较少的类别变量做独热编码,可能值多的我们做标签编码或者直接删除。代码如下:

# 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))

进行独热编码

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_enco der.transform(X_valid[object_cols]))# One-hot encoding removed index; put it back
OH_cols_train.index = X_train.index    #.index是行索引,.column是列索引
OH_cols_valid.index = X_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)

机器学习数据中类别变量(categorical variable)的处理方法相关推荐

  1. 【机器学习基础】机器学习中类别变量的编码方法总结

    机器学习 Author:louwill Machine Learning Lab 在做结构化数据训练时,类别特征是一个非常常见的变量类型.机器学习中有多种类别变量编码方式,各种编码方法都有各自的适用场 ...

  2. toarray方法_机器学习中类别变量的编码方法总结

    作者:louwill:转载自:机器学习实验室 在做结构化数据训练时,类别特征是一个非常常见的变量类型.机器学习中有多种类别变量编码方式,各种编码方法都有各自的适用场景和特点.本文就对机器学习中常见的类 ...

  3. 机器学习中类别变量的编码方法总结

    机器学习 Author:louwill Machine Learning Lab 在做结构化数据训练时,类别特征是一个非常常见的变量类型.机器学习中有多种类别变量编码方式,各种编码方法都有各自的适用场 ...

  4. R语言描述性统计分析:使用epiDisplay包的summ函数获取dataframe数据中每个变量的常用统计量、对每个变量进行汇总统计

    R语言描述性统计分析:使用epiDisplay包的summ函数获取dataframe数据中每个变量的常用统计量.对每个变量进行汇总统计 目录

  5. 处理数据中分类变量的三种方法(附代码实现)

    本文是将kaggle Courses中 Categorical Variables | Kaggle进行了翻译并且加入自己的理解,如有地方不清楚,可以查阅原文 文章目录 介绍 三种方法 1)删除分类变 ...

  6. 树模型对类别变量的 7 种处理方法(Python代码)

    在数据挖掘项目的数据中,数据类型可以分为两种:有序的连续数值 和 无序的类别型特征. 对于xgboost.GBDT等boosting树模型,基学习通常是cart回归树,而cart树的输入通常只支持连续 ...

  7. 基于R对数据中分类变量按照某一个分类变量的类别计算频数

    常常在问卷数据分析中,我们需要根据多个分类变量,比如性别,年龄,职业,学历等,计算在某一个目标变量,如工资水平(分为多个等级)上 的频数,得到一个多维的交叉列联表,从而方便了解这些在变量(年龄,职业, ...

  8. 如何从机器学习数据中获取更多收益

     对于深度学习而言,合适的数据集以及合适的模型结构显得至关重要.选择错误的数据集或者错误的模型结构可能导致得到一个性能不佳的网络模型,甚至可能得到的是一个不收敛的网络模型.这个问题无法通过分析数据得到 ...

  9. 如何从机器学习数据中获取更多收益 1

    摘要: 本文讲解一些关于机器学习数据集的小技巧,分享个人经验,可供读者参考. 对于深度学习而言,合适的数据集以及合适的模型结构显得至关重要.选择错误的数据集或者错误的模型结构可能导致得到一个性能不佳的 ...

最新文章

  1. 新型量子计算机首个基本元件问世,扩展性更强运算速度更快
  2. 运维的基本知识点及分类工作
  3. 启明云端分享|盘一盘ESP32为啥那么惹人爱呢?
  4. VTK:vtkChartMatrix用法实战
  5. 毛坯房装修需要哪些材料
  6. PHFRefreshControl
  7. 字符串数值的比较 java
  8. discuz加密解密,可参考下
  9. H3C S1526交换机端口镜像配置
  10. 抖音内测网页版 网友:摸鱼党新的快乐来了
  11. 选择自己用的到的文件编译一个CEGUISample(一)
  12. 对象已死?及其判断算法
  13. 国内计算机专业最好的大学有哪些
  14. [ACL18]基于Self-Attentive的成分句法分析
  15. [UE4]图片按钮设置技巧
  16. bat计算机清理原理,如何一键清除系统垃圾bat,教您如何清理
  17. 富士通Fujitsu DPK750 Pro 打印机驱动
  18. 女生做软件测试的职业规划,来说说女程序员的职业规划要怎么做
  19. android平板打电话,四款可接打电话平板电脑推荐
  20. 从零开始学前端 - 7. CSS盒模型 margin和padding详解

热门文章

  1. android FileDownloader
  2. 计算机如何对多个用户进行管理,如何给多个账户设置密码?-用户账户控制设置...
  3. Mac百度网盘飞速下载的方法,三步操作永久生效
  4. 车载诊断系列 —— 车辆诊断(Vehicle Diagnostics)
  5. java bytebuffer分包收集,Java ByteBuffer rewind()用法及代码示例
  6. RK3399平台开发系列讲解(WIFI)5.56、什么是WIFI无线局域网
  7. 不长的时间,不短的记忆,岁月使然,色彩依旧……(回忆广州生活)
  8. 《跟着小吴哥学python》之 08 python模块
  9. Python 开发录屏功能
  10. 阿里云ECS 网站访问变卡