定量变量(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)的更多相关文章

  1. R语言:变量名称和字符串的转换

    R语言:变量名称和字符串的转换 2014-06-23 14:45:27         在R语言中,经常会遇到变量名称和字符串相互转换的问题.比如说,进行1000次循环运算,并将运算结果存储在1000 ...

  2. 玩转变量、环境变量以及数学运算(shell)

    变量和环境变量    var=value  给变量赋值,输出语句:$ echo $var或者是$ echo ${var},记住中间有个空格 例如:name="coffee" age ...

  3. js基础知识--变量类型和变量计算

    提问: JS中使用typeof能得到的哪些类型 何时使用===何时使用== JS中有哪些内置函数 JS变量按照存储方式区分为哪些类型,并描述其特点 如何理解JSON 涉及知识点:(1)变量类型 值类型 ...

  4. 如何用BarTender将日期变量和序列号变量放一起打印成条码?

    刚接触BarTender 2016的小伙伴们可能对条码的数据源还不太搞的定,例如有时需要将日期变量和序列号变量放一起打印成条码,那如何简单达到目的呢?下面,小编教大家解决这一问题的三大步骤. 1.在B ...

  5. Python 变量类型及变量赋值

    在 Python 中,变量不一定占用内存变量.变量就像是对某一处内存的引用,可以通过变量访问到其所指向的内存中的值,并且可以让变量指向其他的内存.在 Python 中,变量不需要声明,但是使用变量之前 ...

  6. javascript中的变量作用域以及变量提升

    在javascript中, 理解变量的作用域以及变量提升是非常有必要的.这个看起来是否很简单,但其实并不是你想的那样,还要一些重要的细节你需要理解. 变量作用域 “一个变量的作用域表示这个变量存在的上 ...

  7. if [ "$变量1"x = "$变量2"x ]中x的含义

    问题:if [ "$变量1"x = "$变量2"x ]中x的含义是? 答:“x”字符可以为任意字符,用于防止变量为空时,某些版本的bash中会产生错误: 在一个 ...

  8. SQL*Plus中替换变量与定义变量

    替换变量 SQL*Plus中的替换变量又叫替代变量,它一般用来临时存储相关数据:在SQL语句之间传递值.一般使用&或&&前缀来指定替换变量. 关于使用替换变量,一般是利用其创建 ...

  9. Python-类变量,成员变量,静态变量,类方法,静态方法,实例方法,普通函数

    #coding:utf-8class class_name(object): class_var = 'I am a class variable' #类变量 def __init__(self): ...

随机推荐

  1. 【leetcode-97 动态规划】 交错字符串

    (1过,调试很久) 给定三个字符串 s1, s2, s3, 验证 s3 是否是由 s1 和 s2 交错组成的. 示例 1: 输入: s1 = "aabcc", s2 = " ...

  2. Linux Shell/Bash wildcard通配符、元字符、转义符使用

    说到shell通配符(wildcard),大家在使用时候会经常用到.下面是一个实例: 1   1 2 3 4 [chengmo@localhost ~/shell]$ ls a.txt  b.txt  ...

  3. sqoop从mysql导数据到hive报错:Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

    背景 使用sqoop从mysql导数据到hive,从本地服务器是可以访问mysql的(本地服务器是hadoop集群的一个datanode),但是sqoop导数据的时候依然连接不上mysql 报错如下: ...

  4. python爬虫-房天下-登录

    房天下-登录 本次爬取的网址为:https://passport.fang.com 一.分析请求 输入用户名和密码,点击登录按钮 请求的参数为: uid: 123456789 pwd: 64ccd42 ...

  5. 激活windows去掉右下角水印

     激活windows去掉右下角水印 //需要隔一段时间执行一次 // 卸载已有的激活产品slmgr.vbs /upk // 重新按照激活产品slmgr /ipk NPPR9-FWDCX-D2C8J-H ...

  6. Java基础 StringBuffer、StringBuilder原理浅析

    StringBuilder与StringBuffer作用就是用来处理字符串,但String类本身也具备很多方法可以用来处理字符串,那么为什么还要引入这两个类呢? 首先看下面的例子 public sta ...

  7. 企业如何避免错误决策?APS系统帮你忙

    一家企业不论什么事情都是有一定的决策者们,企业的决策者是对整个企业的兴衰成败主宰者主要责任. 战略一词它源于军事,是指为了获得有利的信息而进行的部署计划,那么现在战略合作也是被广泛的应用到商业的以及生 ...

  8. C#对MongDB取数据的常用代码

    1.使用聚合取最新的实时数据(每一个测站有多条数据,取日期最新的数据.也就是每个测站取最新的值) var group = new BsonDocument { {"_id",new ...

  9. 【RAC】 RAC For W2K8R2 安装--总体规划 (一)

    [RAC] RAC For W2K8R2 安装--总体规划 (一) 一.1  BLOG文档结构图 一.2  前言部分 一.2.1  导读 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一 ...

  10. 【OGG】RAC环境下配置OGG单向同步 (四)

    [OGG]RAC环境下配置OGG单向同步 (四) 一.1  BLOG文档结构图 一.2  前言部分 一.2.1  导读 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的 ...