Python 2.7 减少一个热编码数据集的稀疏性
我试图在UCI成人数据集上做一些特征选择算法,但我遇到了Univaraite特征选择的问题。我正在对所有分类数据进行一次热编码,将它们改为数字,但这会给我很多f分数 我怎样才能避免这种情况?我应该怎么做才能使这段代码更好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'] =
# 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,感谢您的评论!我对问题做了一些修改,谢谢你解释得很好的回答!我认为这会奏效:)。