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

da75705311b79c48ea6694602d0fe846.gif

0be5db884809c264c0b791711b7d01da.png作者:louwill;转载自:机器学习实验室

在做结构化数据训练时,类别特征是一个非常常见的变量类型。机器学习中有多种类别变量编码方式,各种编码方法都有各自的适用场景和特点。本文就对机器学习中常见的类别编码方式做一个简单的总结。硬编码:Label Encoding所谓硬编码,即直接对类别特征进行数值映射,有多少类别取值就映射多少数值。这种硬编码方式简单粗暴,方便快捷。但其仅在类别特征内部取值是有序的情况才好使用,即类别特征取值存在明显的顺序性,比如说学历特征取值为高中、本科、硕士和博士,各学历之间存在明显的顺序关系。Sklearn提供了Label Encoding的实现方式,示例代码如下:
from sklearn import preprocessingle = preprocessing.LabelEncoder()le.fit(['undergraduate', 'master', 'PhD', 'Postdoc'])le.transform(['undergraduate', 'master', 'PhD', 'Postdoc'])
array([3, 2, 0, 1], dtype=int64)
独热编码:One-hot EncodingOne-hot编码应该是应用最广泛的类别特征编码方式了。假设一个类别特征有m个类别取值,通过One-hot编码我们可以将其转换为m个二元特征,每个特征对应该取值类别。f83c94c99684b243236667d0de2675f8.png对于类别特征内部取值不存在明显的内在顺序时,即直接的硬编码不适用时,One-hot编码的作用就凸显出来了。但当类别特征取值过多时,One-hot编码很容易造成维度灾难,特别是对于文本类的特征,如果使用One-hot编码对其进行编码,基本上都是茫茫零海。所以,在类别特征取值无序,且特征取值数量少于5个时,可使用One-hot方法进行类别编码。有朋友可能会问,一定得是5个吗,6个行不行,当然也可以,这里并没有固定标准,但差不多就是这个数据左右。数量再多就不建议使用One-hot了。Pandas和Sklearn都提供了One-hot编码的实现方式,示例代码如下。
import pandas as pddf = pd.DataFrame({'f1':['A','B','C'], 'f2':['Male','Female','Male']})df = pd.get_dummies(df, columns=['f1', 'f2'])df

b28305c63f580a11644357aaf3bd3c4b.png

from sklearn.preprocessing import OneHotEncoderenc = 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 EncodingTarget Encoding就是用目标变量的类别均值来给类别特征做编码。CatBoost中就大量使用目标变量统计的方法来对类别特征编码。但在实际操作时,直接用类别均值替换类别特征的话,会造成一定程度的标签信息泄露的情况,主流方法是使用两层的交叉验证来计算目标均值。Target Encoding一般适用于类别特征无序且类别取值数量大于5个的情形。参考代码如下:
### 该代码来自知乎专栏:### https://zhuanlan.zhihu.com/p/40231966from sklearn.model_selection import KFoldn_folds = 20n_inner_folds = 10likelihood_encoded = pd.Series()likelihood_coding_map = {}# global prior meanoof_default_mean = train[target].mean()      kf = KFold(n_splits=n_folds, shuffle=True)oof_mean_cv = pd.DataFrame()split = 0for 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 = 0inner_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 meanoof_mean = train.iloc[inner_infold].groupby(by=feature)[target].mean()        # assign oof_mean to the infoldlikelihood_encoded_cv = likelihood_encoded_cv.append(train.iloc[infold].apply(lambda x : oof_mean[x[feature]]if x[feature] in oof_mean.indexelse 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 += 1oof_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 += 1print ('============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.indexelse 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

作者:louwill

排版:喵君姐姐

转载自:机器学习实验室

6d42fb5ba6a9cd3cd9b9f77af1d67f17.png2943b55054f86a23f041e2d7f3090f2f.gif行上行下 | 编程相关推文汇总心理学实验常用编程软件和学习资源汇总认知神经科学 | 脑电信号处理的机器学习机器学习: 心理学&管理学研究的新篇章?

因为微信更改了推送规则,如果不想错过我们的精彩内容,请点『在看』以及星标⭐我们呦!

2caac0c015c101d8f5902acd874791e2.pngec0b3a2f899645f2eb4b70bd86f4db9f.png21ee65a0b20f9da9eeeb3dd9a09bd15b.png

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

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

相关文章

java实现可选形参_Java:可选的可选实现

java实现可选形参类java.util.Optional被实现为单个不可变的具体类&#xff0c;该类在内部处理两种情况。 一个有元素&#xff0c;一个没有元素。 让Optional作为一个接口并让两个不同的实现代替实现该接口不是更好的选择吗&#xff1f; 毕竟&#xff0c;这就是我们通常被教导要…

MySQL数据库的JSON数据类型详解

文章目录JSON 数据类型意义存储JSON串修改JSON串中指定字段的值查询 JSON 串中的数据查询 JSON 串中指定字段的值特殊语法精确查询嵌套精确查询模糊查询优化 JSON 查询处理 JSON 数据的常用函数JSON_CONTAINS_PATHJSON_PRETTY总结参考资料JSON 数据类型意义 其实&#xff0c;没…

高特权级代码段转向低特权级代码段(利用 ret(retf) 指令实现 jmp from ring0 to ring3)

【0】写在前面 0.1&#xff09;本代码旨在演示 从 ring0 转移到 ring3&#xff08;即&#xff0c;从高特权级 转移到 低特权级&#xff09;0.2&#xff09;本文 只对 与 门相关的 代码进行简要注释&#xff0c;言简意赅&#xff1b;0.3&#xff09;文末的个人总结是干货&#…

aws 删除ec2实例_如何在AWS中启动EC2实例

aws 删除ec2实例你好朋友&#xff0c; 在本教程中&#xff0c;我们将看到如何立即在AWS中旋转EC2实例。 您应该有权访问AWS控制台。如果您还没有AWS账户&#xff0c;则可以单击此处并在AWS上创建免费套餐。 如何在AWS中启动EC2实例 第1步 &#xff1a; 使用您的凭证登录到您…

python足球射门小游戏_足球射门游戏教案

足球射门游戏教案【篇一&#xff1a;足球射门游戏教案】足球游戏教案任课教师&#xff1a;张旭授课班级&#xff1a;初二(1)班第1次课上课时间&#xff1a;2008-12-1人数&#xff1a;50男(30)女(20)指导教师&#xff1a;彭老师1.运球接力1.足球运球类游戏{ 2.传球射门3.足球打靶…

jQuery 1.9版本之后函数toggle()的轮流执行事件监听器功能被舍弃掉了

文章目录实现隐藏与显示相互切换的效果可以恢复函数 toggle 轮流执行事件监听器的功能toggle()方法主要有两个功能&#xff0c;一是用于绑定两个或多个事件处理器函数&#xff0c;在元素被点击时轮流执行&#xff1b;二是切换元素的显隐状态&#xff0c;如果元素是可见的&#…

不同特权级间代码段的跳转{ 门 + 跳转(jmp + call) + 返回(ret) }

【0】写在前面 0.1&#xff09;我们讲 CPU的保护机制&#xff0c;它是可靠的多任务运行环境所必须的&#xff1b;0.2&#xff09; CPU保护机制&#xff1a;分为段级保护 页级保护&#xff1b; 0.2.1&#xff09;段级保护分为&#xff1a;段限长 limit 检查、段类型 type 检查…

精打细算油盐_Java:ChronicleMap第1部分,精打细算

精打细算油盐用数百万个对象填充HashMap会很快导致诸如内存使用效率低下&#xff0c;性能低下和垃圾回收等问题。 了解如何使用堆外CronicleMap &#xff0c;其中可以包含数十亿个对象&#xff0c;而对堆的影响很小或没有。 当我们要使用中小型数据集时&#xff0c;内置的Map实…

日志服务器搭建及配置_[ELK入门到实践笔记] 一、通过rsyslog搭建集中日志服务器...

ELK 是elastic公司提供的一套完整的日志收集以及展示的解决方案&#xff0c;这是我在ELK学习和实践过程写下的笔记&#xff0c;整理成了一个ELK入门到实践的系列文章&#xff0c;分享出来与大家共勉。本文为该系列文章的第一篇&#xff0c;通过rsyslog搭建集中日志服务器&#…

JavaScript(JS)调用事件监听器(事件处理函数/事件处理程序/事件监听函数)时如何传递参数

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>事件的演示代码</title></head> <body> <input id"bt" type"button" value"test"> <scrip…

x86 的 TSS 任务切换机制

转自&#xff1a;http://blog.chinaunix.net/uid-587665-id-2732907.html 【0】写在前面segment descriptors 构建保护模式下的最基本、最根本的执行环境。system descriptors 则构建保护模式下的核心组件&#xff1a;&#xff11;、TSS descriptor 提供硬件级的进程切换机制&a…

spring安全性_具有PreAuthorize的Spring方法安全性

spring安全性朋友不允许朋友写用户身份验证。 厌倦了管理自己的用户&#xff1f; 立即尝试Okta的API和Java SDK。 数分钟之内即可在任何应用程序中对用户进行身份验证&#xff0c;管理和保护。 本教程将探讨使用Spring Security在Spring Boot中配置身份验证和授权的两种方法。…

animiz动画制作软件_AN动画制作软件

AN基础介绍我们先了解一些基本概念&#xff0c;才能帮助我们更好的进行下面一系列的操作。1.图层。图层就像是含有文字或图形等元素的胶片&#xff0c;一张张按顺序叠放在一起&#xff0c;组合起来形成页面的最终效果。图层可以将页面上的元素精确定位。图层中可以加入文本、图…

关于一致/非一致代码段与TSS 关系的个人看法

【0】概念定义 0.1&#xff09;一致代码段: 简单理解&#xff0c;就是操作系统拿出来被共享的代码段,可以被低特权级的用户直接调用访问的代码&#xff0c; 但是特权级高的程序不允许访问特权级低的数据. 通常这些共享代码&#xff0c;是”不访问”受保护的资源和某些类型异…

python预处理标准化_tensorflow预处理:数据标准化的几种方法

tensorflow预处理&#xff1a;数据标准化的几种方法发布时间&#xff1a;2018-08-09 19:39,浏览次数&#xff1a;1774, 标签&#xff1a;tensorflow数据归一化问题是数据挖掘中特征向量表达时的重要问题&#xff0c;当不同的特征成列在一起的时候&#xff0c;由于特征本身表达方…

三思笔记_使用反射前先三思

三思笔记介绍 有时&#xff0c;作为开发人员&#xff0c;您可能会遇到无法使用new运算符实例化对象的情况&#xff0c;因为其类名称存储在配置XML中的某个位置&#xff0c;或者您需要调用一个名称指定为注释属性的方法。 在这种情况下&#xff0c;您总会有一个答案&#xff1a;…

分页机制总结

【0】写在前面&#xff08;分页机制&#xff09; 0.0&#xff09; source code from orange’s implemention of a os and text description from Zhaojiong’s perfect analysis of Linux kernel and for complete code ,please visit https://github.com/pacosonTang/Orange…

python程序填空题参照代码模板、完善代码_python二级考试操作题11.pdf

综合应用题参照代码模板完善代码&#xff0c;实现下述功能。文件ngchina.html 保持了网页源代码&#xff0c;请将该页面中图片的URL 提取出来,并输出所有图像的URL。习题讲解#P301#读取HTML 文件内容def getHTMLlines(htmlpath):f open(htmlpath,"r",encoding utf-…

Struts2学习笔记

文章目录Struts2 的核心开发包Struts2 配置文件Struts2 域对象Struts2 编程流程Action 组件使用通配符配置 ActionAction 中如何访问 Session通过 ActionContext 对象访问 Session 对象&#xff08;不推荐&#xff09;通过实现 SessionAware 接口访问 sessionAction 如何访问 r…

如何从文件系统中读取文件内容

【0】写在前面 0.0&#xff09; text description from orange’s implemention of a os &#xff0c;文末总结系个人臆测出的干货 【1】intro to FAT12&#xff08;file allocation table 12&#xff09;文件系统格式&#xff08;from Baidu Baike&#xff09; &#xff08;…