我正在尝试在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”
通过执行一个热门编码,上面的功能被分成许多子功能,我只想将其概括为竞争(参见预期结果),如果可能的话。
答案 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
中的每个类别。