【问题标题】:how to apply mutual information on categorical features如何在分类特征上应用互信息
【发布时间】:2021-02-03 21:40:11
【问题描述】:

我正在使用Scikit-learn 来训练分类模型。我的训练数据中既有离散特征又有连续特征。

我想使用mutual information 进行特征选择。

特征 1,2 和 3 是离散的。为此,我尝试了以下代码:

mutual_info_classif(x, y, discrete_features=[1, 2, 3])

但它不起作用,它给了我错误:

 ValueError: could not convert string to float: 'INT'

【问题讨论】:

  • 我已经应用了 W.P. 先生的代码。 McNeill 曾在stackoverflow.com/q/43643278 求婚,但没有成功
  • 我们需要更多信息才能为您提供帮助。如果您复制代码的简化示例,这可能会很有用。
  • 这是我的代码:from sklearn.feature_selection importmutual_info_classif res_M_train =mutual_info_classif(data_train, Y_train,discrete_features= [1,2,3]) 谢谢
  • 我的数据就是这样:[0.983874,TCP,HTTP,FIN,10,8,816,1172,172,17.278635,62,62,2552,5976.375,375,8342.5342.53125,25,125,25,125,25,19319319331931931931931931931931931931931931931931931931931931931931931931931931931931931931931931931931931931931931931931931999999999999太平洋合物,1624757001,255,0.206572,0.108393,0.098179,82,147,1,184,2,1,1,1,1,2,0,0,1,1,3,0,] 如您所见,我的三个首要特征是分类,并且我想计算每个特征的互信息: from sklearn.feature_selection importmutual_info_classif res_M_train =mutual_info_classif(data_train, Y_train,discrete_features= [1,2,3])

标签: python scikit-learn feature-detection


【解决方案1】:

mutual information classifier 的简单示例:

import numpy as np
from sklearn.feature_selection import mutual_info_classif
X = np.array([[0, 0, 0],
              [1, 1, 0],
              [2, 0, 1],
              [2, 0, 1],
              [2, 0, 1]])
y = np.array([0, 1, 2, 2, 1])
mutual_info_classif(X, y, discrete_features=True)
# result: array([ 0.67301167,  0.22314355,  0.39575279]

【讨论】:

  • 但我有这样的混合功能 X = np.array([[0, a, 0], [1, b, 0], [2, c,1], [2, d , 1], [2, a, 1]])
  • 这是我的数据中的一行 [8e-06,"udp","-","INT",2,0,1762,0,125000.0003,254,0,881000000.0,0.0, 0,0,0.008,0.0,0.0,0.0,0,0,0,0,0.0,0.0,0.0,881,0,0,0,2,2,1,1,1,2,0,0, 0,1,2,0] 似乎是前三个功能导致了问题
  • 如果您使用类别并且有字符串信息,请查看get_dummies
【解决方案2】:

mutual_info_classif 只能接受数字数据。您需要对分类特征进行标签编码,然后运行相同的代码。

x1=x.apply(LabelEncoder().fit_transform)

然后运行您正在运行的完全相同的代码。

mutual_info_classif(x1, y, discrete_features=[1, 2, 3])

【讨论】:

  • 关心@Jatin,参考 sklearn 的文档:This transformer should be used to encode target values, i.e. y, and not the input X。所以也许对于这种情况,使用OrdinalEncoder 是一个更好的选择。
【解决方案3】:

.“离散”和“分类”之间存在差异 在这种情况下,函数要求数据是数字的。如果您有序数特征,您可能可以使用标签编码器。否则,您将不得不对标称特征使用一种热编码。为此,您可以使用 pd.get_dummies。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-20
    • 2016-05-28
    • 2012-06-22
    • 1970-01-01
    • 1970-01-01
    • 2019-06-30
    相关资源
    最近更新 更多