机器学习算法只承受数值输出,所以如果咱们遇到分类特色的时候都会对分类特色进行编码,本文总结了常见的11个分类变量编码方法。
1、ONE HOT ENCODING
最风行且罕用的编码方法是One Hot Enoding。一个具备n个观测值和d个不同值的繁多变量被转换成具备n个观测值的d个二元变量,每个二元变量应用一位(0,1)进行标识。
例如:
编码后
最简略的实现是应用pandas的' get_dummies
new_df=pd.get_dummies(columns=[‘Sex’], data=df)
2、Label Encoding
为分类数据变量调配一个惟一标识的整数。这种办法非常简单,但对于示意无序数据的分类变量是可能会产生问题。比方:具备高值的标签能够比具备低值的标签具备更高的优先级。
例如下面的数据,咱们编码后失去了上面的后果:
sklearn的LabelEncoder 能够间接进行转换:
from sklearn.preprocessing import LabelEncoder le=LabelEncoder() df[‘Sex’]=le.fit_transform(df[‘Sex’])
3、Label Binarizer
LabelBinarizer 是一个用来从多类别列表创立标签矩阵的工具类,它将把一个列表转换成一个列数与输出汇合中惟一值的列数完全相同的矩阵。
例如这个数据
转化后后果为
from sklearn.preprocessing import LabelBinarizer lb = LabelBinarizer() new_df[‘Sex’]=lb.fit_transform(df[‘Sex’])
4、Leave one out Encoding
Leave One Out 编码时,指标分类特色变量对具备雷同值的所有记录会被均匀以确定指标变量的平均值。在训练数据集和测试数据集之间,编码算法略有不同。因为思考到分类的特色记录被排除在训练数据集外,因而被称为“Leave One Out”。
对特定类别变量的特定值的编码如下。
ci = (j != i tj / (n — 1 + R)) x (1 + i) where ci = encoded value for ith record tj = target variable value for jth record n = number of records with the same categorical variable value R = regularization factor i = zero mean random variable with normal distribution N(0, s)
例如上面的数据:
编码后:
为了演示这个编码过程,咱们创立数据集:
import pandas as pd; data = [[‘1’, 120], [‘2’, 120], [‘3’, 140], [‘2’, 100], [‘3’, 70], [‘1’, 100],[‘2’, 60], [‘3’, 110], [‘1’, 100],[‘3’, 70] ] df = pd.DataFrame(data, columns = [‘Dept’,’Yearly Salary’])
而后进行编码:
import category_encoders as ce tenc=ce.TargetEncoder() df_dep=tenc.fit_transform(df[‘Dept’],df[‘Yearly Salary’]) df_dep=df_dep.rename({‘Dept’:’Value’}, axis=1) df_new = df.join(df_dep)
这样就失去了下面的后果
5、Hashing
当应用哈希函数时,字符串将被转换为一个惟一的哈希值。因为它应用的内存很少能够解决更多的分类数据。对于治理机器学习中的稠密高维特色,特色哈希是一种无效的办法。它实用于在线学习场景,具备疾速、简略、高效、疾速的特点。
例如上面的数据:
编码后
代码如下:
from sklearn.feature_extraction import FeatureHasher # n_features contains the number of bits you want in your hash value. h = FeatureHasher(n_features = 3, input_type =’string’) # transforming the column after fitting hashed_Feature = h.fit_transform(df[‘nom_0’]) hashed_Feature = hashed_Feature.toarray() df = pd.concat([df, pd.DataFrame(hashed_Feature)], axis = 1) df.head(10)
6、Weight of Evidence Encoding
(WoE) 开发的次要指标是创立一个预测模型,用于评估信贷和金融行业的贷款守约危险。证据反对或批驳实践的水平取决于其证据权重或 WOE。
如果P(Goods) / P(Bads) = 1,则WoE为0。如果这个组的后果是随机的,那么P(Bads) > P(Goods),比值比为1,证据的权重(WoE)为0。如果一组中P(Goods) > P(bad),则WoE大于0。
因为Logit转换只是概率的对数,或ln(P(Goods)/P(bad)),所以WoE非常适合于逻辑回归。当在逻辑回归中应用wo编码的预测因子时,预测因子被解决成与编码到雷同的尺度,这样能够间接比拟线性逻辑回归方程中的变量。
例如上面的数据
会被编码为:
代码如下:
from category_encoders import WOEEncoder df = pd.DataFrame({‘cat’: [‘a’, ‘b’, ‘a’, ‘b’, ‘a’, ‘a’, ‘b’, ‘c’, ‘c’], ‘target’: [1, 0, 0, 1, 0, 0, 1, 1, 0]}) woe = WOEEncoder(cols=[‘cat’], random_state=42) X = df[‘cat’] y = df.target encoded_df = woe.fit_transform(X, y)
7、Helmert Encoding
Helmert Encoding将一个级别的因变量的平均值与该编码中所有先前程度的因变量的平均值进行比拟。
反向 Helmert 编码是类别编码器中变体的另一个名称。它将因变量的特定程度平均值与其所有先前程度的程度的平均值进行比拟。
会被编码为
代码如下:
import category_encoders as ce encoder=ce.HelmertEncoder(cols=’Dept’) new_df=encoder.fit_transform(df[‘Dept’]) new_hdf=pd.concat([df,new_df], axis=1) new_hdf
8、Cat Boost Encoding
是CatBoost编码器试图解决的是指标透露问题,除了指标编码外,还应用了一个排序概念。它的工作原理与工夫序列数据验证相似。以后特色的指标概率仅从它之前的行(观测值)计算,这意味着指标统计值依赖于观测历史。
TargetCount:某个类别个性的目标值的总和(到以后为止)。
Prior:它的值是恒定的,用(数据集中的察看总数(即行))/(整个数据集中的目标值之和)示意。
featucalculate:到目前为止曾经看到的、具备与此雷同值的分类特色的总数。
编码后的后果如下:
代码:
import category_encoders category_encoders.cat_boost.CatBoostEncoder(verbose=0, cols=None, drop_invariant=False, return_df=True, handle_unknown=’value’, handle_missing=’value’, random_state=None, sigma=None, a=1) target = df[[‘target’]] train = df.drop(‘target’, axis = 1) # Define catboost encoder cbe_encoder = ce.cat_boost.CatBoostEncoder() # Fit encoder and transform the features cbe_encoder.fit(train, target) train_cbe = cbe_encoder.transform(train)
9、James Stein Encoding
James-Stein 为特征值提供以下加权平均值:
- 察看到的特征值的均匀目标值。
- 均匀期望值(与特征值无关)。
James-Stein 编码器将平均值放大到全局的平均值。该编码器是基于指标的。然而James-Stein 预计器有毛病:它只反对正态分布。
它只能在给定正态分布的状况下定义(实时状况并非如此)。为了避免这种状况,咱们能够应用 beta 散布或应用对数-比值比转换二元指标,就像在 WOE 编码器中所做的那样(默认应用它,因为它很简略)。
10、M Estimator Encoding:
Target Encoder的一个更间接的变体是M Estimator Encoding。它只蕴含一个超参数m,它代表正则化幂。m值越大膨胀越强。倡议m的取值范畴为1 ~ 100。
11、 Sum Encoder
Sum Encoder将类别列的特定级别的因变量(指标)的平均值与指标的总体平均值进行比拟。在线性回归(LR)的模型中,Sum Encoder和ONE HOT ENCODING都是罕用的办法。两种模型对LR系数的解释是不同的,Sum Encoder模型的截距代表了总体平均值(在所有条件下),而系数很容易被了解为次要效应。在OHE模型中,截距代表基线条件的平均值,系数代表简略效应(一个特定条件与基线之间的差)。
最初,在编码中咱们用到了一个十分好用的Python包 “category-encoders”它还提供了其余的编码方法,如果你对他感兴趣,请查看它的官网文档:
https://avoid.overfit.cn/post/2ebd057b56cd4b54a666de6dd4ed6294
作者:saksham saxena