Scikit learn 如何使用离散和连续特征混合的互信息选择K测试?

Scikit learn 如何使用离散和连续特征混合的互信息选择K测试?,scikit-learn,feature-selection,Scikit Learn,Feature Selection,我正在使用scikit学习训练分类模型。我的训练数据中既有离散特征,也有连续特征。我想使用最大互信息进行特征选择。如果我有向量x和标签y,并且前三个特征值是离散的,我可以得到如下MMI值: mutual_info_classif(x, y, discrete_features=[0, 1, 2]) 现在我想在管道中使用相同的互信息选择。我想做这样的事情 SelectKBest(score_func=mutual_info_classif).fit(x, y) 但是无法将离散功能掩码传递给Se

我正在使用scikit学习训练分类模型。我的训练数据中既有离散特征,也有连续特征。我想使用最大互信息进行特征选择。如果我有向量
x
和标签
y
,并且前三个特征值是离散的,我可以得到如下MMI值:

mutual_info_classif(x, y, discrete_features=[0, 1, 2])
现在我想在管道中使用相同的互信息选择。我想做这样的事情

SelectKBest(score_func=mutual_info_classif).fit(x, y)

但是无法将离散功能掩码传递给
SelectKBest
。是否有一些语法是我忽略的,或者我必须编写自己的分数函数包装器?

不幸的是,我找不到SelectKBest的此功能。 但是我们可以轻松地将
SelectKBest
扩展为我们的自定义类,以覆盖将被调用的
fit()
方法

这是SelectKBest的当前
fit()
方法(取自)

现在,我们将使用更改后的
fit()
定义新类
SelectKBestCustom
。我已从上述来源复制了所有内容,仅更改了两行(对此进行了评论):

这可以简单地称为:

clf = SelectKBestCustom(mutual_info_classif,k=2)
clf.fit(X, y, discrete_features=[0, 1, 2])
编辑: 上述解决方案在管道中也很有用,调用
fit()
时,可以为
discrete\u features
参数指定不同的值

另一种解决方案(不太可取): 不过,如果您只需要使用
mutual\u info\u classif
临时(仅分析结果),我们还可以创建一个自定义函数,该函数可以使用硬编码的
离散功能在内部调用
mutual\u info\u classif
。大致如下:

def mutual_info_classif_custom(X, y):
    # To change discrete_features, 
    # you need to redefine the function each time
    # Because once the func def is supplied to selectKBest, it cant be changed
    discrete_features = [0, 1, 2]

    return mutual_info_classif(X, y, discrete_features)
上述功能的使用:

selector = SelectKBest(mutual_info_classif_custom).fit(X, y)

您还可以使用partials,如下所示:

从functools导入部分
离散的相互信息分类=部分(相互信息分类,iscrete特征=[0,1,2])
选择K测试(分数函数=离散相互信息分类)。拟合(x,y)
def mutual_info_classif_custom(X, y):
    # To change discrete_features, 
    # you need to redefine the function each time
    # Because once the func def is supplied to selectKBest, it cant be changed
    discrete_features = [0, 1, 2]

    return mutual_info_classif(X, y, discrete_features)
selector = SelectKBest(mutual_info_classif_custom).fit(X, y)