定量变量和定性变量的转换(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): ...
随机推荐
- ZooKeeper学习笔记(二)——内部原理
zookeeper学习笔记(二)--内部原理 1. zookeeper的节点的类型 总的来说可以分为持久型和短暂型,主要区别如下: 持久:客户端与服务器端断开连接的以后,创建的节点不会被删除: 持久化 ...
- Oracle学习笔记(四)
Oracle中的体系结构: oracle体系结构中的进程: 共享池相关的优化: drop table t purge; create table t as select * from dba_obje ...
- React+SpringBoot项目部署
静态资源访问配置 https://www.jianshu.com/p/b6e0a0df32ec https://segmentfault.com/q/1010000012240531/a-102000 ...
- springcolud 的学习(一),架构的发展史
一.传统架构 传统的SSH架构,分为三层架构 web控制层.业务逻辑层.数据库访问层. 传统架构也就是单点应用,就是大家在刚开始初学JavaEE技术的时候SSH架构或者SSM架构,业务没有进行拆分,都 ...
- 1.ASP.NET Core 中向 Razor Pages 应用添加模型
右键单击“RazorPagesMovie”项目 >“添加” > “新建文件夹”. 将文件夹命名为“Models”.右键单击“Models”文件夹. 选择“添加” > “类”. 将类命 ...
- 如何导出UML图片以及小人的组件在哪里
首先先要创建一个新项目 接着在右侧栏目创建一个modal 添加usecase,里面就有小人的组件(注意:是Add Diagram) 将做好的图进行保存程jpg格式(快捷键 ctrl +shift+D) ...
- python 2.django的镜像安装与第一次项目创建-运行以及app创建
django的设计模式 Django是一个遵循MVC设计模式的框架,MVC是Model.View.Controller的三个单词的简写.分别代表模型.视图.控制器. 而Django也是是一个MTV的设 ...
- Angular使用操作事件指令ng-click传多个参数示例
本文实例讲述了Angular使用操作事件指令ng-click传多个参数功能.分享给大家供大家参考,具体如下: <!DOCTYPE html> <html ng-app="m ...
- Win 10 无法锁屏,快捷键win+L失效
快捷键win+L 一直在使用,忽然之间不知道按错了什么 Win 10 无法锁屏,快捷键win+L失效,按win+L后出来的是输入法 应该是键盘的Windows键锁住了,按Fn+windows键解锁
- MySQL Execution Plan--IN子查询对UPDATE语句影响
问题描述 在系统中发现一条执行时间为为44652.060734秒(12.5小时)的慢SQL,SQL语句为: UPDATE ob_internal_task SET OPERATE_STATUS WHE ...