足球一世 666814 足球一世 666814 足球一世 666814

11 种常见分类特征的编码技术

机器学习算法只接受数字输入,所以如果我们遇到分类特征,我们将对分类特征进行编码。本文总结了11种常见的分类变量编码方法。

预测模型两大分类_大古预测pc28预测_模型预测控制

1. 一种热编码

最流行和最常用的编码方法是 One Hot Enoding。将具有 n 个观测值和 d 个不同值的单个变量转换为具有 n 个观测值的 d 个二元变量,每个变量用一位 (0, 1) 标识。

例如:

模型预测控制_预测模型两大分类_大古预测pc28预测

编码后

大古预测pc28预测_预测模型两大分类_模型预测控制

最简单的实现是使用 pandas 的 get_dummies

new_df=pd.get_dummies(columns=[‘Sex’], data=df)

2.标签编码

将唯一标识整数分配给分类数据变量。这种方法非常简单预测模型两大分类,但对于表示无序数据的分类变量可能会有问题。例如:值高的标签可以比值低的标签具有更高的优先级。

例如,对于上面的数据,我们编码后得到如下结果:

模型预测控制_预测模型两大分类_大古预测pc28预测

sklearn的LabelEncoder可以直接转换:

from sklearn.preprocessing import LabelEncoder
le=LabelEncoder()
df[‘Sex’]=le.fit_transform(df[‘Sex’])

3. 标签二值化器

LabelBinarizer 是一个实用程序类,用于从多类别列表创建标签矩阵,它将列表转换为与输入集合中的唯一值完全相同的列数的矩阵。

例如这个数据

大古预测pc28预测_模型预测控制_预测模型两大分类

大古预测pc28预测_模型预测控制_预测模型两大分类

转换后的结果是

模型预测控制_大古预测pc28预测_预测模型两大分类

from sklearn.preprocessing import LabelBinarizer
lb = LabelBinarizer()
new_df[‘Sex’]=lb.fit_transform(df[‘Sex’])

4. 留一个编码

使用“留一法”编码,对目标分类特征变量具有相同值的所有记录进行平均,以确定目标变量的平均值。训练和测试数据集的编码算法略有不同。之所以称为“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)

例如以下数据:

模型预测控制_预测模型两大分类_大古预测pc28预测

编码后:

模型预测控制_预测模型两大分类_大古预测pc28预测

为了演示这个编码过程,我们创建了数据集:

import pandas as pd;
data = [[‘1’, 120], [‘2’, 120], [‘3’, 140],

大古预测pc28预测_模型预测控制_预测模型两大分类

[‘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. 散列

使用散列函数时,字符串将被转换为唯一的散列值。由于它使用更少的内存,它可以处理更多的分类数据。特征哈希是机器学习中管理稀疏高维特征的一种有效方法。适用于在线学习场景,快速、简单、高效、快捷。

例如以下数据:

预测模型两大分类_模型预测控制_大古预测pc28预测

编码后

预测模型两大分类_模型预测控制_大古预测pc28预测

代码显示如下:

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

预测模型两大分类_大古预测pc28预测_模型预测控制

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. 证据编码权重

(WoE) 开发的主要目标是创建一个预测模型,用于评估信贷和金融行业的贷款违约风险。证据支持或反驳理论的程度取决于其证据的权重,或 WOE。

预测模型两大分类_模型预测控制_大古预测pc28预测

如果 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 非常适合逻辑回归。在逻辑回归中使用双编码预测变量时,将预测变量处理为与编码相同的尺度,以允许直接比较线性逻辑回归方程中的变量。

例如以下数据

模型预测控制_大古预测pc28预测_预测模型两大分类

将被编码为:

模型预测控制_预测模型两大分类_大古预测pc28预测

代码显示如下:

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 编码

模型预测控制_预测模型两大分类_大古预测pc28预测

Helmert 编码将一个级别的因变量的平均值与该编码中所有先前级别的因变量的平均值进行比较。

反向 Helmert 编码是类别编码器变体的另一个名称。它将因变量的特定水平的平均值与其之前所有水平的平均值进行比较。

大古预测pc28预测_预测模型两大分类_模型预测控制

将被编码为

大古预测pc28预测_预测模型两大分类_模型预测控制

代码显示如下:

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 编码

CatBoost 编码器试图解决的是目标泄漏问题,它在目标编码之外还使用了排序概念。它的工作原理类似于时间序列数据验证。当前特征的目标概率仅根据其之前的行(观察)计算,这意味着目标统计量取决于观察历史。

预测模型两大分类_大古预测pc28预测_模型预测控制

TargetCount:一个类别特征的目标值的总和(到目前为止)。

Prior:它的值是常数,表示为(数据集中观察的总数(即行))/(整个数据集中目标值的总和)。

Featureucalculate:到目前为止已经看到的与此具有相同值的分类特征的总数。

预测模型两大分类_大古预测pc28预测_模型预测控制

编码结果如下:

模型预测控制_大古预测pc28预测_预测模型两大分类

代码:

预测模型两大分类_大古预测pc28预测_模型预测控制

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 为特征值提供以下加权平均值:

James-Stein 编码器将平均值降低到全局平均值。该编码器是基于对象的。但是 James-Stein 估计器有一个缺点:它只支持正态分布。

它只能在给定正态分布的情况下定义(实时情况并非如此)。为了防止这种情况,我们可以使用 beta 分布或使用对数优势比来转换二进制目标,就像在 WOE 编码器中所做的那样(默认情况下使用它,因为它很简单)。

10. M 估计器编码:

Target Encoder 的一个更直接的变体是 M Estimator Encoding。它只包含一个超参数 m,代表正则化能力。

m值越大,收缩越强。m 的推荐值范围为 1 到 100。

11. 和编码器

Sum 编码器将分类列的特定级别的因变量(目标)的平均值与目标的总体平均值进行比较。在线性回归(LR)模型中预测模型两大分类,Sum Encoder 和 ONE HOT ENCODING 都是常用的方法。两个模型对 LR 系数的解释是不同的,Sum Encoder 模型的截距代表总体均值(在所有条件下),而系数很容易解释为主效应。在 OHE 模型中,截距代表基线条件的均值,系数代表简单效应(特定条件与基线之间的差异)。

最后,我们在编码中使用了一个非常有用的 Python 包“category-encoders”。它还提供了其他编码方法。如果您对此感兴趣,请查看其官方文档: