定量变量和定性变量的转换(Transform of Quantitative & Qualitative Variables)
定量变量(Quantitative Variables):也称为数值型变量(Numerical Variables),可以用连续值或离散值表示。比如:气温(连续值),学生人数(离散值)。
为什么要对定量变量进行转换?大多数情况下,我们可以直接使用定量变量。但是有时候,特征和目标之间不呈线性关系。比如说年龄和收入之间的关系,当人年轻时,收入通常会稳步上升,但到了一定年纪之后,收入便开始降低。我们当然可以用非线性模型来拟合数据,但是这样会把模型弄得很复杂。因此比较好的做法是在数据准备的阶段就对定量变量做分箱处理(Binning,也称为分区间)。在对定量变量分箱处理之后,还要再将其转换为虚拟变量或对其进行WOE转换(参见:https://zhuanlan.zhihu.com/p/30026040)。
将定量变量转换为定性变量的方法为:分区间(Binning),包括等宽分区间以及自适应分区间。
1. 等宽分区间(Fixed-Width Binning):可以用pandas的cut()方法自己设定区间范围。等宽分区间的缺点是:落在某个区间中的数据点的数目不一定是均匀的,因此可能会得到不规则的区间。一些区间中的数据可能会非常的密集,一些区间则会非常稀疏甚至是空的。因此,自适应分区间方法是一个更安全的策略。
2. 自适应分区间(Adptive Binning):使用数据的四分位数来确定区间范围,这样确保每个区间内的数据个数是相同的。
定性变量(Qualitative Variables):也称为类别型变量(Categorical Variables),通常用文本字符串或离散值表示。根据变量之间是否存在次序关系,又可以分为有序型定性变量(Ordinal)和无序型定性变量(Nominal)。比如:衣服的尺寸“大中小”(有序型),男女性别(无序型)。
为什么要对定性变量进行转换?因为最终我们需要进行数值间的运算,而文本字符串之间无法进行运算。即使将文本字符串转变为离散值表示,比如将衣服的尺寸大中小表示为0:小,1:中,2:大,虽然将次序体现出来了(2>1>0),但还是不合理,因为不管对于有序型定性变量,还是无序型定性变量来说,这样的数值运算都没有意义。比如衣服的尺寸这个例子,如果将大减去中,其结果等于2-1=1,这是表示中号尺寸等于大号尺寸减去中号尺寸吗?这显然是不合理且没有意义的。因此我们需要用其他方式对定性变量进行转换。
有两种转换方式:a. 将定性变量转换为虚拟变量,b. 将定性变量转换为定量变量。
a. 将定性变量转换为虚拟变量:
1. 虚拟编码(Dummy Coding):如果某个特征变量有n个类别,那么虚拟编码会将其转换成n-1个二进制编码。变量的每个类别都被转换成 n-1 维向量。我们将减少的这个类别作为基准,其由全部是0组成的向量表示。转换后的变量称为虚拟变量(Dummy Variables)。
0 2-大
1 1-中
2 2-大
3 0-小
Name: 衣服尺寸, dtype: object
col=pd.Series(["2-大","1-中","2-大","0-小"],name="衣服尺寸")
print(pd.get_dummies(col).iloc[:,1:])
1-中 2-大
0 0 1
1 1 0
2 0 1
3 0 0
我们创建了一个衣服尺寸的Series,由四个样本组成。转换为虚拟变量后,可以看到变量由二进制组成的向量表示:大-[0,1],中-[1,0],小-[0,0]。其中把“小”作为基准,从特征中删去,因为“大”和“中”这两个特征足以表示所有的信息(不是大和中,便是小)。
2. 独热编码(One Hot Encoding):如果某个特征变量有n个类别,那么独热编码会将其转换成n个二进制编码。变量的每个类别都被转换成 n 维向量,其中只有某一维的值为 1(表示激活状态)。
col=pd.Series(["2-大","1-中","2-大","0-小"],name="衣服尺寸")
print(pd.get_dummies(col))
0-小 1-中 2-大
0 0 0 1
1 0 1 0
2 0 0 1
3 1 0 0
还是用上面衣服尺寸这个例子,转换为独热编码后,变量由二进制组成的向量表示为:大-[0,0,1],中-[0,1,0],小-[1,0,0]。
3. 效果编码(Effect Coding):和虚拟编码类似,只不过作为基准的特征全由-1组成的向量表示。那么既然已经有了虚拟编码,为何还要用效果编码呢?因为虚拟编码的回归系数表示的是某类别和基准类别之间的平均差异,而效果编码可以有效估计出各类别和总体平均水平之间的平均差异(根据回归系数),方便进行各类别之间的比较。因此如果各类别之间有关联,那么使用效果编码更好。(参见:https://wenku.baidu.com/view/4c6918c7581b6bd97e19ea57.html)
col=pd.Series(["2-大","1-中","2-大","0-小"],name="衣服尺寸")
dummy=pd.get_dummies(col).iloc[:,1:]
dummy=dummy.astype(np.int8)
dummy.loc[np.all(dummy==0,axis=1)]=-1
print(dummy)
1-中 2-大
0 0 1
1 1 0
2 0 1
3 -1 -1
还是用上面衣服尺寸这个例子,转换为效果编码后,变量由二进制组成的向量表示为:大-[0,1],中-[1,0],小-[-1,-1]。
4. 区间计数(Bin Counting):对于有m个类别的某个特征,经过上述转换后,将会变成m个新的特征。因此,当任意特征的类别数量变得很大的时候,很可能会造成维度灾难。我们需要针对那些可能具有非常多类别的特征(如 IP 地址),研究其它的转换方法 。区间计数使用基于概率的统计信息和在建模过程中所要预测的实际目标进行编码,而不是使用实际的标签值。这个方案需要历史数据作为先决条件,并且要求数据非常详尽。
5. 特征哈希(Feature Hashing):哈希函数通常与预设的编码特征的数量(作为预定义长度向量)一起使用。哈希方案适用于字符串、数字和其它结构(如向量)。如果我们有一个特征拥有 1000 个不同的类别,我们设置最终的特征向量长度为10,那么最终输出的特征将只有 10 个。特征哈希的缺点是可解释性不强。
b. 将定性变量转换为定量变量:
对于多个有序的定性变量,如果将其转换为虚拟变量,会损失掉每个定性变量本身的顺序信息和定性变量间的关联信息。为了解决这个问题,常常根据类别的顺序,将定性变量转换为定量变量。转换方法有:Ridit scoring(二分类问题),WOE(weight of evidence)等等。
参考:https://www.leiphone.com/news/201801/KTVu68zA6szteVmS.html
https://www.leiphone.com/news/201801/T9JlyTOAMxFZvWly.html
https://www.jiqizhixin.com/articles/2018-07-09-19
https://segmentfault.com/a/1190000019860050
定量变量和定性变量的转换(Transform of Quantitative & Qualitative Variables)的更多相关文章
- R语言:变量名称和字符串的转换
R语言:变量名称和字符串的转换 2014-06-23 14:45:27 在R语言中,经常会遇到变量名称和字符串相互转换的问题.比如说,进行1000次循环运算,并将运算结果存储在1000 ...
- 玩转变量、环境变量以及数学运算(shell)
变量和环境变量 var=value 给变量赋值,输出语句:$ echo $var或者是$ echo ${var},记住中间有个空格 例如:name="coffee" age ...
- js基础知识--变量类型和变量计算
提问: JS中使用typeof能得到的哪些类型 何时使用===何时使用== JS中有哪些内置函数 JS变量按照存储方式区分为哪些类型,并描述其特点 如何理解JSON 涉及知识点:(1)变量类型 值类型 ...
- 如何用BarTender将日期变量和序列号变量放一起打印成条码?
刚接触BarTender 2016的小伙伴们可能对条码的数据源还不太搞的定,例如有时需要将日期变量和序列号变量放一起打印成条码,那如何简单达到目的呢?下面,小编教大家解决这一问题的三大步骤. 1.在B ...
- Python 变量类型及变量赋值
在 Python 中,变量不一定占用内存变量.变量就像是对某一处内存的引用,可以通过变量访问到其所指向的内存中的值,并且可以让变量指向其他的内存.在 Python 中,变量不需要声明,但是使用变量之前 ...
- javascript中的变量作用域以及变量提升
在javascript中, 理解变量的作用域以及变量提升是非常有必要的.这个看起来是否很简单,但其实并不是你想的那样,还要一些重要的细节你需要理解. 变量作用域 “一个变量的作用域表示这个变量存在的上 ...
- if [ "$变量1"x = "$变量2"x ]中x的含义
问题:if [ "$变量1"x = "$变量2"x ]中x的含义是? 答:“x”字符可以为任意字符,用于防止变量为空时,某些版本的bash中会产生错误: 在一个 ...
- SQL*Plus中替换变量与定义变量
替换变量 SQL*Plus中的替换变量又叫替代变量,它一般用来临时存储相关数据:在SQL语句之间传递值.一般使用&或&&前缀来指定替换变量. 关于使用替换变量,一般是利用其创建 ...
- Python-类变量,成员变量,静态变量,类方法,静态方法,实例方法,普通函数
#coding:utf-8class class_name(object): class_var = 'I am a class variable' #类变量 def __init__(self): ...
随机推荐
- 守护线程在logback中的使用 - 论基础知识的重要性
守护线程在logback中的使用 先说问题,在java应用中,logback的异步Appender是怎么在主线程结束后,停下来的? 复盘 我在一个logback的测试用例中,写了这样的代码和logba ...
- 【转载】C#中List集合中Last和LastOrDefault方法的差别
在C#的List集合操作中,Last方法和LastOrDefault方法都会用来查找集合中最后一个符合条件的元素对象,但Last和LastOrDefault方法还是有差别的,建议使用LastOrDef ...
- vuecli3的项目搭建
1.卸载旧版本 npm uninstall vue-cli -g 或者 yarn global remove vue-cli 2.安装cli3脚手架 npm install -g @vue/cli 或 ...
- canvas实现酷炫气泡效果
canvas实现动画主要是靠设置定时器(setinterval())和定时清除画布里的元素实现,canvas动画上手很简单,今天可以自己动手来实现一个酷炫气泡效果. 气泡炸裂效果(类似水面波纹) 代码 ...
- 函数式接口(Functional Interface)
原文链接:https://www.cnblogs.com/runningTurtle/p/7092632.html 阅读目录 什么是函数式接口(Functional Interface) 函数式接口用 ...
- UML——从类图到C++
简易软件开发流程 实践中,use case and description.class diagram与sequence diagram三者搭配,几乎是UML项目的基本类型,所以在分工或外包的设计文档 ...
- Python包模块化调用方式详解
Python包模块化调用方式详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一般来说,编程语言中,库.包.模块是同一种概念,是代码组织方式. Python中只有一种模块对象类型 ...
- nginx负载调度算法,后端节点状态
- webapi之owin的oauth2.0密码模式_01概述
一般在webapi接口中,为了防止接口被随意调用,都会验证用户身份. 然而不能每次调用接口都需要用户输入用户名密码来验证,这时就需要授权颁发令牌了,持有令牌就可以访问接口,接口也能验证令牌身份. 简单 ...
- OpenStack核心组件-cinder存储服务
1. cinder 介绍 Block Storage 操作系统获得存储空间的方式一般有两种: 1) 通过某种协议(SAS,SCSI,SAN,iSCSI 等)挂接裸硬盘,然后分区.格式化.创建文 ...