Python 2.7 减少一个热编码数据集的稀疏性

Python 2.7 减少一个热编码数据集的稀疏性,python-2.7,pandas,machine-learning,feature-selection,Python 2.7,Pandas,Machine Learning,Feature Selection,我试图在UCI成人数据集上做一些特征选择算法,但我遇到了Univaraite特征选择的问题。我正在对所有分类数据进行一次热编码,将它们改为数字,但这会给我很多f分数 我怎样才能避免这种情况?我应该怎么做才能使这段代码更好 # Encode adult['Gender'] = adult['sex'].map({'Female': 0, 'Male': 1}).astype(int) adult = adult.drop(['sex'], axis=1) adult['Earnings'] =

我试图在UCI成人数据集上做一些特征选择算法,但我遇到了Univaraite特征选择的问题。我正在对所有分类数据进行一次热编码,将它们改为数字,但这会给我很多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
#编码
成人['Gender']=成人['sex'].map({'Female':0,'Male':1})。aType(int)
成人=成人。下降(['sex'],轴=1)
成人['Earnings']=成人['income'].map({'50K':1}).astype(int)
成人=成人。下降(['income'],轴=1)
#OneHot编码
成人=pd.get_假人(成人,列=[“种族”])
目标=成年人[“收入”]
数据=成人。下降([“收入”],轴=1)
选择器=SelectKBest(f_classif,k=5)
选择器.fit_变换(数据、目标)
对于zip中的n,s(data.head(0),selector.scores\ux):
打印“F分数”,s,“用于特征”,n
编辑:
当前代码的部分结果:
美国印第安人爱斯基摩人特色赛F分26.1375747945
亚洲太平洋岛民特色赛F分3.91592196913
功能赛的F分数为237.173133254_黑色
功能赛的F分数为31.117798305\u其他
特色赛F得分218.117092671

预期结果:
功能“比赛”的F分数“F_分数”


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

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

二进制编码可以通过使用包在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
下面是我使用与上面相同的变量,但带有一个热编码的前一个版本的代码。让我们比较两种不同输出的外观

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

请:将代码缩短到所需的最小值,并包括示例数据和所需结果。提问的一般指导原则:Pandas specific:@Username我建议您编辑此问题的名称,以便更能描述您的实际问题。也许是为了“减少特征选择的分类编码特征数量?”或“减少一个热编码数据集的稀疏性”。@JohnE和josh,感谢您的评论!我对问题做了一些修改,谢谢你解释得很好的回答!我认为这会奏效:)。