减少单热编码数据集的稀疏性

Reducing the Sparsity of a One-Hot Encoded dataset

我正在尝试对 UCI 成人数据集进行一些特征选择算法,但我 运行 遇到了 Univaraite 特征选择问题。我正在对所有分类数据进行 onehot 编码以将它们更改为数字,但这给了我很多 f 分数。

我怎样才能避免这种情况?我应该怎么做才能使这段代码更好?

# Encode
adult['Gender'] = adult['sex'].map({'Female': 0, 'Male': 1}).astype(int)
adult = adult.drop(['sex'], axis=1)

adult['Earnings'] = adult['income'].map({'<=50K': 0, '>50K': 1}).astype(int)
adult = adult.drop(['income'], axis=1)

#OneHot Encode
adult = pd.get_dummies(adult, columns=["race"])

target = adult["Earnings"]
data = adult.drop(["Earnings"], axis=1)

selector = SelectKBest(f_classif, k=5)
selector.fit_transform(data, target)

for n,s in zip( data.head(0), selector.scores_):
    print "F Score ", s,"for feature ", n

编辑:
当前代码的部分结果:
特征 race_Amer-Indian-Eskimo
的 F 得分为 26.1375747945 特征 race_Asian-Pac-Islander
的 F 分数 3.91592196913 特征 race_Black
的 F 得分为 237.173133254 特征 race_Other
的 F 分数 31.117798305 特征 race_White

的 F 得分为 218.117092671

预期结果:
特征 "race"

的 F 得分 "f_score"

通过一次热编码,上面的功能被分成许多子功能,如果可能的话,我想将其概括为仅用于比赛(参见预期结果)。

减少特征数量同时仍以非序数方式编码类别的一种方法是使用二进制编码。 One-hot-encoding 具有线性增长率 n,其中 n 是分类特征中的类别数。二进制编码有 log_2(n) 增长率。换句话说,将类别数量加倍会为二进制编码添加一个列,同时将单热编码的列数加倍。

使用 categorical_encoding 包可以在 python 中轻松实现二进制编码。该软件包可通过 pip 安装,并可与 sklearn 和 pandas 无缝协作。这是一个例子

import pandas as pd
import category_encoders as ce

df = pd.DataFrame({'cat1':['A','N','K','P'], 'cat2':['C','S','T','B']})

enc_bin = ce.binary_encoding.BinaryEncoding(cols=['cat1']) # cols=None, all string columns encoded

df_trans = enc_bin.fit_transform(df)
print(df_trans)


Out[1]:
           cat1_0  cat1_1 cat2
    0       1       1      C
    1       0       1      S
    2       1       0      T
    3       0       0      B

这是我之前 的代码,使用与上面相同的变量,但使用 one-hot 编码。让我们比较一下两种不同输出的外观。

import pandas as pd
import category_encoders as ce

df = pd.DataFrame({'cat1':['A','N','K','P'], 'cat2':['C','S','T','B']})
enc_ohe = ce.one_hot.OneHotEncoder(cols=['cat1']) # cols=None, all string columns encoded

df_trans = enc_ohe.fit_transform(df)
print(df_trans)


Out[2]:
       cat1_0  cat1_1  cat1_2  cat1_3 cat2
    0       0       0       1       0    C
    1       0       0       0       1    S
    2       1       0       0       0    T
    3       0       1       0       0    B

了解二进制编码如何使用一半的列来唯一地描述类别 cat1 中的每个类别。