我正在训练一个具有10个左右分类输入的神经网络。 在对这些分类输入进行一次热编码之后,我最终将大约500个输入馈入网络。
我希望能够确定我每个分类输入的重要性。 Scikit-learn具有许多功能重要性算法,但是这些算法中的任何一种都可以应用于分类数据输入吗? 所有示例均使用数字输入。
我可以将这些方法应用于"一键编码"输入,但是在应用于二进制输入后如何提取含义? 如何判断分类输入中的特征重要性?
Ive已成功使用支持discrete_features=True的mutual_info_score。
看看scikit-learn.org/stable/modules/
谨慎使用单点编码,因为您将特征空间的维数增加了50倍。您还可以考虑使用随机森林而不是神经网络,因为随机森林方法具有内置的特征重要性表征。
感谢您的意见。 @IgorRaush,我可以像这样使用common_info_classif函数:l_importance = mutual_info_classif(X, y, discrete_features=True)但是可以确认我在X数组中编码离散特征的方式。显然,它必须是一个numpy数组,因此大多数输入都必须进行编码。我可以使用离散索引吗?如果我对输入进行了二值化,那么将很难从功能输出中提取含义,因为功能是如此分离。如果这些是我的输入:X = [[A, X, alpha], [B, X, beta], [B, Y, gamma]]我将如何编码?谢谢 -
@VivekKumar感谢您的回复。我知道如何编码分类输入。您是否暗示最佳实践是在单热编码输入上运行标准特征选择算法?如果是这种情况,您将如何包装输出以确定每个功能的重要性,而不是确定每个热编码列的重要性?谢谢
@ A555h5似乎实际上并不需要是一个Numpy数组,您提供的列表也可以作为输入正常工作(尽管您可以将Numpy数组与dtype=np.str一起使用,该数组包含字符串并且也可以使用)。
通常,对于这种情况,您将使用索引编码,其中分类功能的每个级别都映射到整数0、1等。请查看Scikit-learn中的LabelEncoder或Pandas中的分类系列。
在回答您对Vivek的问题时,这取决于您要完成的工作。您可以使用重要性度量来修剪整个功能("功能选择"),也可以一键编码它们并仅修剪某些级别("值选择")。我见过两种使用方法。
感谢您的回答@IgorRaush-一个快速的问题。如果我在同一数据集中混合了分类特征和数字特征,那么该如何编码?我想一起考虑它们,因为我需要了解它们之间的相互影响。我应该将数字视为分类数字(因为失去幅度,这似乎是错误的),还是对分类数字使用索引编码方法并与数字结合?再次感谢
在某些情况下,在进入scikit-learn之前可能值得探索您的数据集。我通常使用Wekas GUI玩一些。在Weka中,您可以使用多种算法来可视化和评估特征。如果数据集太大,则将其稍微修剪一下。在此处获取Weka:cs.waikato.ac.nz/ml/weka有关此处的属性选择的更多信息:wiki.pentaho.com/display/DATAMINING/Attribute+Selection
由于编码特征之间的关系,在一种热编码上使用特征选择算法可能会导致错过。例如,如果您将n个值的特征编码为n个特征,并且已选择m个中的n-1个,则不需要最后一个特征。
由于您的功能数量很少(?10),因此功能选择对您的帮助不大,因为您可能只能减少其中的几个而不会丢失太多信息。
您写道,一种热编码将10个要素转换为500个,这意味着每个要素都有大约50个值。在这种情况下,您可能会对离散化算法更感兴趣,可以对值本身进行操作。如果值隐含顺序,则可以对连续特征使用算法。另一种选择是简单地忽略稀有值或与概念没有强相关性的值。
如果您使用特征选择,则大多数算法将对分类数据起作用,但您应提防极端情况。例如,@ Igor Raush建议的相互信息是一种很好的措施。但是,具有许多值的特征往往比具有较少值的特征具有更高的熵。反过来,这可能会导致更高的相互信息,并会偏向许多价值特征。一种解决此问题的方法是通过将互信息除以特征熵来进行归一化。
可能会帮助您的另一套功能选择算法是包装器。他们实际上将学习委托给分类算法,因此,只要分类算法可以应对,它们就不会影响表示。