【问题标题】:Feature selection using scikit-learn on categorical features使用 scikit-learn 对分类特征进行特征选择
【发布时间】:2021-03-26 10:26:44
【问题描述】:

我目前正在处理一个包含 5 列数字变量和 23 列分类变量的数据集。这些变量大多是名义变量(不是有序变量),可以包含 4 到 15 个不同的类别。我知道 OneHotEncoder 但我担心应用 rfecv 之类的东西会导致给定变量中的各个类别从分析中删除,而不是删除整个变量。谢谢!

【问题讨论】:

  • 好的,但你到底想做什么?
  • 我想选择要选择的字段以预测我的目标变量。我很确定使用所有 28 个字段会导致过度拟合。
  • 好的,所以您想实现一种方法来告诉您哪些是最重要的功能,对吧?您可以为此使用树基方法
  • 谢谢,这正是我的意思。那么像 SelectFromModel(RandomForestClassifier() 这样的东西可以处理分类特征吗?我需要事先使用像 OneHotEncoder 这样的东西吗?
  • 不,基于树的方法不需要对数据进行热编码,因为它通过比较不同特征的分割来确定不同特征的重要性,而最重要的是那些最小化熵

标签: python scikit-learn categorical-data feature-selection


【解决方案1】:

这是一个实现基于树的特征重要性分析方法的函数。它实际上会返回原始数据框,其中仅包含按重要性排序的前 n 个特征。

from sklearn.ensemble import ExtraTreesClassifier

def select_best_Tree_features(df,target_var,top_n):
"""
:param df: pandas dataframe
:param target_var: string containing the target value column name 
:param top_n: integer indicating the number of columns to consider
:return:
"""
Y = df[target_var]
X = df.drop([target_var], axis=1)
model = ExtraTreesClassifier()
model.fit(X, Y)
f = pd.Series(model.feature_importances_, index=X.columns)
f.nlargest(top_n).plot(kind='barh')
plt.show()
print('\nFeatures Scores\n',f.sort_values(ascending=False))
top_list=f.nlargest(top_n).index.tolist()
X_fi = df[top_list]
return X_fi,Y,top_list

确保数据帧的每一列都包含数值或使用标签编码器进行转换

【讨论】:

  • 如果数据不是序数,使用标签编码器会不会有问题?例如,我有一列包含不同的国家。我不确定在该列上使用标签编码器是否有意义。
  • 你打算用哪个模型来解决这个问题?
  • 我正在使用 PoissonRegressor() 创建一个 GLM。我坚持的部分是特征选择部分。
  • 好的,但您无能为力...您必须将字符串值转换为数字...一种选择可能是使用目标编码,但这样您必须非常注意您正在做什么,因为过度拟合的可能性很高...如果您的问题是您不想增加维度,您可以先执行数据分箱,然后进行一次热编码...或者对于每个功能,您可以选择顶部3-4 个最常见的值并删除其他值,然后单热编码...
猜你喜欢
  • 2014-11-05
  • 2018-02-24
  • 2018-06-01
  • 2013-04-30
  • 2018-09-25
  • 2015-09-08
  • 2015-01-12
  • 2014-02-17
相关资源
最近更新 更多