类别型变量label encoding方法学习
参考博客:
Categorical Encoding Techniques
[Smarter Ways to Encode Categorical Data for Machine Learning](Smarter Ways to Encode Categorical Data for Machine Learning)
kaggle编码categorical feature总结
为什么要对类别型变量做label encoding?
许多机器学习的算法需要,比如KNN、SVM、XGBoost等
各种label-encoding的技术
首先我们来看一下依赖于scikit-learn的开源包Category Encoders中包含的选项:
Backward Difference Coding
BaseN
Binary
CatBoost Encoder
Hashing
Helmert Coding
James-Stein Encoder
Leave One Out
M-estimate
One Hot
Ordinal
Polynomial Coding
Sum Coding
Target Encoder
Weight of Evidence
我的学习
对于一般情况
使用机器学习常用的编码方式,比如
- Ordinal
- OneHot
- Binary
OneHot
One-Hot-Encoding(独热编码)特点是有多少个不同的值就有多少个新的特征,一个特征为1,其他特征只能为0
以一般介绍独热编码的常用例子来看
1 | encoder = preprocessing.OneHotEncoder() |
1 | # 输出 |
如何理解?
原先有四个特征,第一个特征有0、1、2三种取值,第二个特征有2、3两种取值,以此类推第三第四个特征分别有4个、2个取值,所以新生成的编码有3+2+4+2=11个特征
因此对于high-cardinality的情况,生成的新特征维度为极大,不仅有内存占用问题,还有可能出现“维度爆炸”的情况
Binary
先将字符型label以Ordinal的方式编码,再转换为二进制形式
优点是占用空间更少,缺点是相比于OneHot的编码方式,其实牺牲了一部分信息
对于high-cardinality的情况
一个类别特征中有大量不同的值时,可以尝试使用以下编码方式
- Target
- LeaveOneOut
- WeightOfEvidence
- James-Stein
- M-estimator
这些方式大都应用了贝叶斯统计的思路,在编码时考虑了target的值Target
不仅考虑了该类别特征的属性值$$x_i$$,还考虑了target的值$$y_i$$。
即假设为一个C分类问题对于任何一个待编码的$$x_i$$,包括了$$x=x_i$$时target依次取C个可能值的概率,又因为$$y_i$$的的先验概率也会有影响,所以又以一定权重考虑了$$y=y_i$$的概率
$\displaystyle f(x_i,y_i)=\lambda(n_i)P(y=y_i|x=x_i)+[1-\lambda(n_i)]P(y=y_i)$
对于回归问题,稍微更改一下公式
$\displaystyle f(x_i,y_i)=\lambda(n_i)\frac{\sum_{x=x_i}Y}{n_i}+[1-\lambda(n_i)]\frac{\sum_{}Y}{N_{target}}$
前一部分为$$x=x_i$$均值,后一部分为训练集上所有target中$$y$$的均值
相关参数文档见doc、论文链接
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 carlos@sjtu.edu.cn