减少One-Hot编码数据集的稀疏性

时间:2016-12-17 12:36:58

标签: python-2.7 pandas machine-learning feature-selection

我正在尝试在UCI成人数据集上做一些特征选择算法,而我遇到了单一特征选择的问题。我正在对所有分类数据进行单拍编码,将它们更改为数字,但这给了我很多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

修改
当前代码的部分结果:
F得分26.1375747945为特色赛_Amer-Indian-Eskimo
F得分3.91592196913 for feature race_Asian-Pac-Islander
F得分237.173133254为特色赛_Black
F得分31.117798305 for feature race_Other
F得分218.117092671 for feature race_White

预期结果:
F为“比赛”特征评分“f_score”

通过执行一个热门编码,上面的功能被分成许多子功能,我只想将其概括为竞争(参见预期结果),如果可能的话。

1 个答案:

答案 0 :(得分:2)

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

使用categorical_encoding包可以在python中轻松实现二进制编码。该包装是可以安装的,可与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

以下是我之前answer使用与上述相同的变量但使用单热编码的代码。让我们比较两种不同输出的外观。

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中的每个类别。