机器学习

Author:louwill

Machine Learning Lab

在做结构化数据训练时,类别特征是一个非常常见的变量类型。机器学习中有多种类别变量编码方式,各种编码方法都有各自的适用场景和特点。本文就对机器学习中常见的类别编码方式做一个简单的总结。

硬编码:Label Encoding

所谓硬编码,即直接对类别特征进行数值映射,有多少类别取值就映射多少数值。这种硬编码方式简单粗暴,方便快捷。但其仅在类别特征内部取值是有序的情况才好使用,即类别特征取值存在明显的顺序性,比如说学历特征取值为高中、本科、硕士和博士,各学历之间存在明显的顺序关系。

Sklearn提供了Label Encoding的实现方式,示例代码如下:

from sklearn import preprocessing
le = preprocessing.LabelEncoder()
le.fit(['undergraduate', 'master', 'PhD', 'Postdoc'])
le.transform(['undergraduate', 'master', 'PhD', 'Postdoc'])
array([3, 2, 0, 1], dtype=int64)

独热编码:One-hot Encoding

One-hot编码应该是应用最广泛的类别特征编码方式了。假设一个类别特征有m个类别取值,通过One-hot编码我们可以将其转换为m个二元特征,每个特征对应该取值类别。

对于类别特征内部取值不存在明显的内在顺序时,即直接的硬编码不适用时,One-hot编码的作用就凸显出来了。但当类别特征取值过多时,One-hot编码很容易造成维度灾难,特别是对于文本类的特征,如果使用One-hot编码对其进行编码,基本上都是茫茫零海。所以,在类别特征取值无序,且特征取值数量少于5个时,可使用One-hot方法进行类别编码。有朋友可能会问,一定得是5个吗,6个行不行,当然也可以,这里并没有固定标准,但差不多就是这个数据左右。数量再多就不建议使用One-hot了。

Pandas和Sklearn都提供了One-hot编码的实现方式,示例代码如下。

import pandas as pd
df = pd.DataFrame({'f1':['A','B','C'],
'f2':['Male','Female','Male']})
df = pd.get_dummies(df, columns=['f1', 'f2'])
df

from sklearn.preprocessing import OneHotEncoder
enc = OneHotEncoder(handle_unknown='ignore')
X = [['Male', 1], ['Female', 3], ['Female', 2]]
enc.fit(X)
enc.transform([['Female', 1], ['Male', 4]]).toarray()
array([[1., 0., 1., 0., 0.],
[0., 1., 0., 0., 0.]])

目标变量编码:Target Encoding

Target Encoding就是用目标变量的类别均值来给类别特征做编码。CatBoost中就大量使用目标变量统计的方法来对类别特征编码。但在实际操作时,直接用类别均值替换类别特征的话,会造成一定程度的标签信息泄露的情况,主流方法是使用两层的交叉验证来计算目标均值。Target Encoding一般适用于类别特征无序且类别取值数量大于5个的情形。

参考代码如下:

### 该代码来自知乎专栏:
### https://zhuanlan.zhihu.com/p/40231966
from sklearn.model_selection import KFold
n_folds = 20
n_inner_folds = 10
likelihood_encoded = pd.Series()
likelihood_coding_map = {}
# global prior mean
oof_default_mean = train[target].mean()
kf = KFold(n_splits=n_folds, shuffle=True)
oof_mean_cv = pd.DataFrame()
split = 0
for infold, oof in kf.split(train[feature]):
print ('==============level 1 encoding..., fold %s ============' % split)
inner_kf = KFold(n_splits=n_inner_folds, shuffle=True)
inner_oof_default_mean = train.iloc[infold][target].mean()
inner_split = 0
inner_oof_mean_cv = pd.DataFrame()
likelihood_encoded_cv = pd.Series()
for inner_infold, inner_oof in inner_kf.split(train.iloc[infold]):
print ('==============level 2 encoding..., inner fold %s ============' % inner_split)# inner out of fold mean
oof_mean = train.iloc[inner_infold].groupby(by=feature)[target].mean()# assign oof_mean to the infold
likelihood_encoded_cv = likelihood_encoded_cv.append(train.iloc[infold].apply(
lambda x : oof_mean[x[feature]]
if x[feature] in oof_mean.index
else inner_oof_default_mean, axis = 1))
inner_oof_mean_cv = inner_oof_mean_cv.join(pd.DataFrame(oof_mean), rsuffix=inner_split, how='outer')
inner_oof_mean_cv.fillna(inner_oof_default_mean, inplace=True)
inner_split += 1
oof_mean_cv = oof_mean_cv.join(pd.DataFrame(inner_oof_mean_cv), rsuffix=split, how='outer')
oof_mean_cv.fillna(value=oof_default_mean, inplace=True)
split += 1
print ('============final mapping...===========')
likelihood_encoded = likelihood_encoded.append(train.iloc[oof].apply(
lambda x: np.mean(inner_oof_mean_cv.loc[x[feature]].values)
if x[feature] in inner_oof_mean_cv.index
else oof_default_mean, axis=1))

模型自动编码

在LightGBM和CatBoost等算法中,模型可以直接对类别特征进行编码,实际使用时直接将类别特征标记后传入对应的api即可。一个示例代码如下:

lgb_train = lgb.Dataset(train2[features], train2['total_cost'], categorical_feature=['sex'])

总结

根据本文的梳理,可总结机器学习中类别特征的编码方式如下:

  • Label Encoding

    • 类别特征内部有序

  • One-hot Encoding

    • 类别特征内部无序

    • 类别数值<5

  • Target Encoding

    • 类别特征内部无序

    • 类别数值>5

  • 模型自动编码

    • LightGBM

    • CatBoost

往期精彩回顾适合初学者入门人工智能的路线及资料下载机器学习及深度学习笔记等资料打印机器学习在线手册深度学习笔记专辑《统计学习方法》的代码复现专辑
AI基础下载机器学习的数学基础专辑获取一折本站知识星球优惠券,复制链接直接打开:https://t.zsxq.com/662nyZF本站qq群704220115。加入微信群请扫码进群(如果是博士或者准备读博士请说明):

【机器学习基础】机器学习中类别变量的编码方法总结相关推荐

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

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

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

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

  3. 机器学习数据中类别变量(categorical variable)的处理方法

    类别变量(categorical variable):只有有限个值得变量,如性别就是一个类别变量,类似于这种. 如果不对这些变量做预处理,训练出来的模型可能是错误的. 主要有三种方法来处理这个变量. ...

  4. 【机器学习实战】第1章 机器学习基础

    第1章 机器学习基础 机器学习 概述 机器学习就是把无序的数据转换成有用的信息. 获取海量的数据 从海量数据中获取有用的信息 我们会利用计算机来彰显数据背后的真实含义,这才是机器学习的意义. 机器学习 ...

  5. 《机器学习实战》笔记(01):机器学习基础

    机器学习基础 机器学习能让我们自数据集中受到启发,换句话说利用计算机来彰显数据背后的真实含义. 机器学习在日常生活中的应用 人脸识别 手写数字识别 垃圾邮件过滤 电商的产品推荐 天气预测 疾病诊断 - ...

  6. 2.机器学习基础(一)

    文章目录 第二章 机器学习基础 2.1 基本概念 2.1.1 什么是神经网络 2.1.2 各种常见算法图示 2.1.3 计算图的导数计算 2.1.4 理解局部最优与全局最优 2.1.5 大数据与深度学 ...

  7. 机器学习--机器学习基础

    机器学习(Machine Learning ) --机器学习基础 机器学习 概述 机器学习(Machine Learning,ML) 是使用计算机来彰显数据背后的真实含义,它为了把无序的数据转换成有用 ...

  8. 机器学习基础、sklearn数据集、转换器与预估器

    机器学习基础 机器学习开发流程 机器学习算法分类 机器学习模型是什么 需要明确几点问题: 算法是核心,数据和计算是基础 找准定位 大部分复杂模型的算法设计都是算法工程师在做,而我只是一个调包侠 分析很 ...

  9. 《机器学习系列教程》:第二章 机器学习基础

    第二章 机器学习基础 机器学习and 数据分析 2.2 监督学习.非监督学习.半监督学习.弱监督学习? 根据数据类型的不同,对一个问题的建模有不同的方式.依据不同的学习方式和输入数据,机器学习主要分为 ...

最新文章

  1. java开源写字板_简单的写字板 - 努力喵的个人空间 - OSCHINA - 中文开源技术交流社区...
  2. JDBC如何连接mysql数据库附详细步骤
  3. tp3.2php开启事务,Thinkphp 3.2.3 开启调试模式
  4. js 将图片置灰_JS 上传一张图片让其部分变灰色
  5. 25 FI配置-财务会计-定义冲销原因
  6. C++基础::运算符重载
  7. javawebJSP餐厅点餐系统源码JSP点餐系统JSP网上订餐系统JSP在线订餐系统JSP外卖系统
  8. Ubuntu 安装磁盘分区及启动项添加
  9. 2020 年全球移动 APT事件总结
  10. 从移动硬盘安装计算机系统文件,移动硬盘装系统,教您怎么用移动硬盘装系统...
  11. 复变函数——一到三章总结
  12. 202101汇率换算
  13. Mermaid知识点总结4 - Flowchart 3
  14. 【邀请函】2018年医院绩效改革方案构建与落地实践成果分享会
  15. Word embeddings-词向量
  16. Java中的this关键字
  17. Python123第六章答案
  18. 解决 Maven工程运行报错Failed to clean project: Failed to delete
  19. javascript中使用枚举定义一个对象进行数据转换
  20. 最新中国省市区县geoJSON格式地图数据Echarts地图数据

热门文章

  1. 创建dynamics CRM client-side (四) - Namespace Notation in JS
  2. 数据库出现的bug原因以及解决方法
  3. 抽取随即人员——SqlServer_Proc_Random
  4. MySql项目中使用的小窍门
  5. Linux SVN搭建模式
  6. (转)RemoteView 设置控件属性
  7. 转载:【opencv入门教程之一】:配置
  8. JavaSE(八)——StringBuffer类、Arrays类、数组排序
  9. Error: Could not find or load main class CLASS的解决方法
  10. Python os和os.path的基础知识与常用操作