Scikit learn 如何使用离散和连续特征混合的互信息选择K测试?
我正在使用scikit学习训练分类模型。我的训练数据中既有离散特征,也有连续特征。我想使用最大互信息进行特征选择。如果我有向量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
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)