机器学习算法只接受数值输入,所以如果遇到分类特征,我们就对分类特征进行编码。本文总结了11种常见的分类变量编码方法。1.ONEHOTENCODING最流行和最常用的编码方法是OneHotEncoding。具有n个观测值和d个不同值的单个变量被转换为具有n个观测值的d个二进制变量,每个变量由单个位(0,1)标识。例如:编码后最简单的实现是使用pandas的get_dummiesnew_df=pd.get_dummies(columns=['Sex'],data=df)2.LabelEncoding为分类数据变量分配一个唯一标识的整数。这种方法非常简单,但对于表示无序数据的分类变量可能会有问题。例如:值高的标签可以比值低的标签有更高的优先级。比如上面的数据,我们编码后得到如下结果:sklearn的LabelEncoder可以直接转换:fromsklearn.preprocessingimportLabelEncoderle=LabelEncoder()df['Sex']=le.fit_transform(df['Sex'])3。LabelBinarizerLabelBinarizer是一个工具类,用于从多类别列表创建标签矩阵。它会将一个列表转换成一个矩阵,其列数与输入集中的唯一值完全相同。比如这次数据转换的结果是fromsklearn.preprocessingimportLabelBinarizerlb=LabelBinarizer()new_df['Sex']=lb.fit_transform(df['Sex'])4.LeaveOneOutEncodingLeaveOneOut编码时,目标分类对特征变量对具有相同值的所有记录进行平均,以确定目标变量的均值。训练数据集和测试数据集的编码算法略有不同。因为考虑分类的特征记录被排除在训练数据集之外,所以称为“LeaveOneOut”。具体类别变量具体值的编码如下。ci=(Σj!=itj/(n—1+R))x(1+εi)其中ci=第i条记录的编码值tj=第j条记录的目标变量值n=具有相同类别的记录数变量值R=正则化因子εi=正态分布N(0,s)的零均值随机变量例如,以下数据:编码后:为了演示此编码过程,我们创建了一个数据集:importpandasaspd;数据=[['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','YearlySalary'])然后编码:importcategory_encodersascetenc=ce.TargetEncoder()df_dep=tenc.fit_transform(df['Dept'],df['YearlySalary'])df_dep=df_dep.rename({'Dept':'Value'},axis=1)df_new=df.join(df_dep)这样就得到了上面的结果。5.散列当使用散列函数时,字符串会被转换成一个唯一的散列值。因为它使用更少的内存,所以它可以处理更多的分类数据。特征哈希是机器学习中管理稀疏高维特征的有效方法。适用于在线学习场景,具有快速、简单、高效、快速的特点。例如下面的数据:编码后的代码如下:fromsklearn.feature_extractionimportFeatureHasher#n_features包含你想要的哈希值的位数。h=FeatureHasher(n_features=3,input_type='string')#拟合后变换列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,WeightEvidenceEncoding(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非常适合逻辑回归。在logistic回归中使用wo-coded预测变量时,预测变量被处理为与代码相同的比例,这允许直接比较线性logistic回归方程中的变量。例如,以下数据将被编码为:fromcategory_encodersimportWOEEncoderdf=pd.DataFrame({'cat':['a','b','a','b','a','a','b','c','c'],'目标':[1,0,0,1,0,0,1,1,0]})woe=WOEEncoder(cols=['cat'],random_state=42)X=df['cat']y=df.targetencoded_df=woe.fit_transform(X,y)7.HelmertEncodingHelmertEncoding将一个级别的因变量的均值与之前的所有级别进行比较该编码与因变量的均值进行了比较。反向Helmert编码是类编码器变体的另一个名称。它将因变量的特定水平的平均值与所有先前水平的水平的平均值进行比较。将被编码为代码如下:importcategory_encodersasceencoder=ce.HelmertEncoder(cols='Dept')new_df=encoder.fit_transform(df['Dept'])new_hdf=pd.concat([df,new_df],axis=1)new_hdf8,CatBoostEncoding是试图解决targetleakage问题的CatBoostencoder,除了targetencoding之外,还使用了sorting的概念。它的工作原理类似于时间序列数据验证。当前特征的目标概率仅根据其前面的行(观察)计算,这意味着目标统计量取决于观察历史。TargetCount:类别特征的目标值的总和(到目前为止)。Prior:它的值是常数,表示为(数据集中的观测总数(即行数))/(整个数据集中目标值的总和)。featucalculate:到目前为止看到的与此具有相同值的分类特征的总数。编码结果如下:代码:importcategory_encoderscategory_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)#定义catboost编码器cbe_encoder=ce.cat_boost.CatBoostEncoder()#拟合编码器并转换featurescbe_encoder.fit(train,target)train_cbe=cbe_encoder.transform(train)9、JamesStein编码James-Stein提供以下特征值加权平均值:观测特征值的平均目标值。平均预期值(独立于特征值)。James-Stein编码器将均值缩小为全局均值。这个编码器是基于对象的。但是James-Stein估计器有一个缺点:它只支持正态分布。它只能在给定正态分布的情况下定义(实时情况并非如此)。为防止这种情况,我们可以使用beta分布或使用对数优势比转换二进制目标,就像在WOE编码器中所做的那样(默认情况下使用它,因为它很简单)。10.MEstimatorEncoding:TargetEncoder更直接的变体是MEstimatorEncoding。它只包含一个超参数m,代表正则化能力。m值越大,收缩越强。建议m的取值范围为1~100。11.SumEncoderSumEncoder比较因变量(target)在类别列的特定级别的平均值与target的整体平均值。在线性回归(LR)模型中,SumEncoder和ONEHOTENCODING是常用的方法。两个模型对LR系数的解释不同,SumEncoder模型的截距代表整体均值(在所有条件下),系数很容易理解为一个主效应。在OHE模型中,截距代表基线条件的平均值,系数代表简单效应(特定条件与基线之间的差异)。最后,我们在编码中使用了一个非常有用的Python包“category-encoders”。它还提供其他编码方法。如果你对他感兴趣,请查看它的官方文档:http://contrib.scikit-learn.org/category_encoders/
