one-hot与哑变量(dummy variable)的区别
在机器学习问题中,我们通过训练数据集学习得到的其实就是一组模型的参数,然后通过学习得到的参数确定模型的表示,最后用这个模型再去进行我们后续的预测分类等工作。在模型训练过程中,我们会对训练数据集进行抽象、抽取大量特征,这些特征中有离散型特征也有连续型特征。若此时你使用的模型是简单模型(如LR),那么通常我们会对连续型特征进行离散化操作,然后再对离散的特征,进行one-hot编码或哑变量编码。这样的操作通常会使得我们模型具有较强的非线性能力。那么这两种编码方式是如何进行的呢?它们之间是否有联系?又有什么样的区别?是如何提升模型的非线性能力的呢?下面我们一一介绍:
one-hot encoding
关于one-hot编码的具体介绍,可以参考我之前的一篇博客,博客地址:特征提取方法: one-hot 和 IF-IDF。这里,不再详细介绍。one-hot的基本思想:将离散型特征的每一种取值都看成一种状态,若你的这一特征中有N个不相同的取值,那么我们就可以将该特征抽象成N种不同的状态,one-hot编码保证了每一个取值只会使得一种状态处于“激活态”,也就是说这N种状态中只有一个状态位值为1,其他状态位都是0。举个例子,假设我们以学历为例,我们想要研究的类别为小学、中学、大学、硕士、博士五种类别,我们使用one-hot对其编码就会得到:
dummy encoding
哑变量编码直观的解释就是任意的将一个状态位去除。还是拿上面的例子来说,我们用4个状态位就足够反应上述5个类别的信息,也就是我们仅仅使用前四个状态位 [0,0,0,0] 就可以表达博士了。只是因为对于一个我们研究的样本,他已不是小学生、也不是中学生、也不是大学生、又不是研究生,那么我们就可以默认他是博士,是不是。(额,当然他现实生活也可能上幼儿园,但是我们统计的样本中他并不是,^-^)。所以,我们用哑变量编码可以将上述5类表示成:
one-hot编码和dummy编码:区别与联系
通过上面的例子,我们可以看出它们的“思想路线”是相同的,只是哑变量编码觉得one-hot编码太罗嗦了(一些很明显的事实还说的这么清楚),所以它就很那么很明显的东西省去了。这种简化不能说到底好不好,这要看使用的场景。下面我们以一个例子来说明:
假设我们现在获得了一个模型,这里自变量满足(因为特征是one-hot获得的,所有只有一个状态位为1,其他都为了0,所以它们加和总是等于1),故我们可以用表示第三个特征,将其带入模型中,得到:
这时,我们就惊奇的发现和这两个参数是等价的!那么我们模型的稳定性就成了一个待解决的问题。这个问题这么解决呢?有三种方法:
(1)使用正则化手段,将参数的选择上加一个限制,就是选择参数元素值小的那个作为最终参数,这样我们得到的参数就唯一了,模型也就稳定了。
(2)把偏置项去掉,这时我们发现也可以解决同一个模型参数等价的问题。
因为有了bias项,所以和我们去掉bias项的模型是完全不同的模型,不存在参数等价的问题。
(3)再加上bias项的前提下,使用哑变量编码代替one-hot编码,这时去除了,也就不存在之前一种特征可以用其他特征表示的问题了。
总结:我们使用one-hot编码时,通常我们的模型不加bias项 或者 加上bias项然后使用正则化手段去约束参数;当我们使用哑变量编码时,通常我们的模型都会加bias项,因为不加bias项会导致固有属性的丢失。
选择建议:我感觉最好是选择正则化 + one-hot编码;哑变量编码也可以使用,不过最好选择前者。虽然哑变量可以去除one-hot编码的冗余信息,但是因为每个离散型特征各个取值的地位都是对等的,随意取舍未免来的太随意。
连续值的离散化为什么会提升模型的非线性能力?
简单的说,使用连续变量的LR模型,模型表示为公式(1),而使用了one-hot或哑变量编码后的模型表示为公式(2)
式中表示连续型特征,、、分别是离散化后在使用one-hot或哑变量编码后的若干个特征表示。这时我们发现使用连续值的LR模型用一个权值去管理该特征,而one-hot后有三个权值管理了这个特征,这样使得参数管理的更加精细,所以这样拓展了LR模型的非线性能力。
这样做除了增强了模型的非线性能力外,还有什么好处呢?这样做了我们至少不用再去对变量进行归一化,也可以加速参数的更新速度;再者使得一个很大权值管理一个特征,拆分成了许多小的权值管理这个特征多个表示,这样做降低了特征值扰动对模型为稳定性影响,也降低了异常数据对模型的影响,进而使得模型具有更好的鲁棒性。
转载自:https://www.cnblogs.com/lianyingteng/p/7792693.html
one-hot与哑变量(dummy variable)的区别相关推荐
- 离散型变量的编码方式——one-hot与哑变量(dummy variable)
我们在用模型去解决机器学习问题的时候,要提前进行"特征工程".而特征工程中很重要的就是对特征的预处理. 当你使用的是logistic回归这样的模型的时候,模型要求所有特征都应该是数 ...
- 哑变量(Dummy Variable)、独热编码(one-hot Encoding)、label-encoding归纳
1 概念 1.1 定类型变量 定类类型就是纯分类,不排序,没有逻辑关系. 当某特征具有k个属性值,那么: a 哑变量(虚拟变量)-- 具有k-1个二进制特征,基准类别将被忽略,若基准类别选择不合理,仍 ...
- R语言一般线性模型(涉及因变量是虚拟变量(哑变量))
R语言的一般线性模型 R语言的一般线性模型用函数:lm(),即可轻松实现. 例子 建立一般线性模型 NC.glm1 = lm(fmri.SFG_R_CerebellumGM_L ~ age + gen ...
- 自变量是分类变量的线性拟合+哑变量
哑变量 dummy variable(也相当于对数据分类) 何时引入哑变量 顺序变量如(高,中,低)可按比例引入值(如1,3,5) 而分类变量,或连续变量的划分:(如:1-10,11-20,21-30 ...
- R语言中哑变量的设置
原文来源:https://www.sohu.com/a/199698358_489312 在构建回归模型时,如果自变量X为连续性变量,回归系数β可以解释为:在其他自变量不变的条件下,X每改变一个单位, ...
- 哑变量的基本介绍及R语言设置
哑变量的基本介绍及R语言设置 1. 哑变量的基本介绍[摘自医咖会] 1.1 什么是哑变量? 1.2 什么情况下需要设置哑变量? 1.3 如何设置哑变量的参照组? 1.4 设置哑变量时的注意事项 2. ...
- 给属性赋值_赋值方法:虚拟变量 Dummy Coding
点击上方蓝色字体,关注我们 选择实验法获得的数据属于离散变量,因而使用离散选择模型进行分析,常见的是Logit模型.在使用中需要对获得数据进行处理,其中一个处理方式就是虚拟变量(Dummy Varia ...
- 在R中做含有哑变量的gam模型并可视化
R中建立包含哑变量的gam模型需要使用mgcv包.下面是一个例子: library(mgcv) set.seed(1) # 生成模拟数据 n <- 100 x1 <- rnorm(n) x ...
- 机器学习总结之——Dummy Coding(哑变量)
机器学习总结之--Dummy Coding 1.哑变量的概念 在构建回归模型时,如果自变量X为连续性变量,回归系数β可以解释为:在其他自变量不变的条件下,X每改变一个单位,所引起的因变量Y的平均变 ...
最新文章
- idea 快速定位到某一行的快捷键
- 微信小程序 - 支持html空格(提示)
- golang连接mysql报错:this authentication plugin is not supported 解决方案
- 【渝粤题库】广东开放大学 现代服务学概论 形成性考核 (2)
- 全面介绍Windows内存管理机制及C++内存分配实例(二):内存状态查询
- Django 遇到的错误:expected str, bytes or os.PathLike object, not _io.TextIOWrapper
- linux查看文件的方法,查看linux文件的方法
- 小米八显示无服务器,二修小米8无服务案例
- 有哪些开源的小程序商城源码?
- Axure9元件库,如何自建,如何利用下载的元件库
- 计算机字体颜色太浅,我的打印机打字太淡,如何调,打印的字就能够颜色
- 常见笔顺错误的字_[转载]常见笔画笔顺易错字大全
- 手机的小窗口怎么弄_vivo怎么弄小窗口 vivo怎样弄小窗口
- WPF学习之绘图和动画--DarrenF
- vue中使用echart实现三维立体图
- 理解信号处理中的卷积
- 静下来读《一个人的村庄》
- CorelDRAW 2022中文精简64位直装版下载
- docker(5、网络2) 1、容器间通信的三种方式 2、 容器如何访问外部 3、 外部如何访问容器
- 治精神疾病不能光靠吃药,还要学会自救
热门文章
- Python:执行精确的浮点数运算
- Python真神奇,带你体验另类的“全自动编程”
- 年度数据与月度数据转化_山东工会新媒体传播力指数2020年12月数据、年度数据出炉...
- VS cmake 远程开发 opencv报错:CMake was unable to find a build program corresponding to “Ninja“.(换个构建方式)
- word怎么设置图片编号(图片下标,图片标签,图片序号,图片注释,题注)(交叉引用)
- vscode 代码莫名爆红(未定义标识符 “nullptr“)解决办法(VSCode 如何快速打开c_c++_properties.json文件)
- markdown怎么输入指数、幂、次方、上下标?(2^8^=256、a~0~=1)
- 初识Linux——菜鸟篇
- Optimal Strategy 组合数,dp,博弈论(济南)
- python把桢写入txt_ffmpeg 常用参数一览表及python 使用示例