定量变量(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. .net core获取数据库连接 抛出The type initializer to throw an exception

    原文:https://www.cnblogs.com/pudefu/p/7580722.html 在.NET Framework框架时代我们的应用配置内容一般都是写在Web.config或者App.c ...

  2. MVC HtmlHelper 使用大全 [转]

    原:http://www.cnblogs.com/jyan/archive/2012/07/23/2604474.html#2979358 HtmlHelper用来在视图中呈现 HTML 控件. 以下 ...

  3. Tomcat组件梳理--Server

    Tomcat组件梳理--Server 1.Server组件的定义和功能概述 定义: Server组件用于描述一个启动的Tomcat实例,一个Tocmat被启动,在操作系统中占用一个进程号,提供web服 ...

  4. centos8安装chromium浏览器

    1/yum install epel* [root@localhost framework]# yum list epl* Last metadata expiration check: 0:57:4 ...

  5. DataPipeline CTO 陈肃:我们花了3年时间,重新定义数据集成

    目前,中国企业在大数据流通.交换.利用等方面仍处于起步阶段,但是企业应用数据集成市场却是庞大的.根据 Forrester 数据看来,2017 年全球数据应用集成市场纯软件规模是 320 亿美元,如果包 ...

  6. 记录一次git回滚代码

    老大临时让更新一版代码到本地,熟练的git fetch/git merge 之后,出来了一批改动的文件,但是并不是我改动的. 我以为是版本迭代出来的其他同事改的,我就直接给add commit到我的版 ...

  7. 图说jdk1.8新特性(5)--- 编译器新特性

    /** * Returns the name of the parameter. If the parameter's name is * {@linkplain #isNamePresent() p ...

  8. oracle 11g goldengate搭建(一)

    初学ogg,基本了解ogg原理及架构之后,趁热打铁,搭建一个简单的学习环境,以实现目标:将sourcedb数据库的2个表:sourceuser.test01和sourceuser.dept通过ogg分 ...

  9. 解决maven install报错:java.lang.NoClassDefFoundError: org/codehaus/plexus/compiler/util/scan/InclusionScanException

    问题:maven install时,报错:java.lang.NoClassDefFoundError: org/codehaus/plexus/compiler/util/scan/Inclusio ...

  10. Docker搭建Portainer

    1.介绍 Docker 图形化管理提供了很多工具,有Portainer.Docker UI.Shipyard等等,本文主要介绍Portainer. Portainer是一个开源.轻量级Docker管理 ...