我正在使用scikit学习训练分类模型。我的训练数据中包含离散和连续的特征。我想使用最大的互信息进行特征选择。如果我有向量x
和标签y
并且前三个要素值是离散的,我可以像这样得到MMI值:
mutual_info_classif(x, y, discrete_features=[0, 1, 2])
现在我想在管道中使用相同的互信息选择。我想做这样的事情
SelectKBest(score_func=mutual_info_classif).fit(x, y)
但无法将离散要素掩码传递给SelectKBest
。是否有一些语法可以解决这个问题,或者我是否必须编写自己的分数函数包装器?
答案 0 :(得分:2)
不幸的是我找不到SelectKBest的这个功能。
但我们可以轻松完成的工作是将SelectKBest
扩展为我们的自定义类,以覆盖将被调用的fit()
方法。
这是SelectKBest的当前fit()
方法(取自source at github)
# No provision for extra parameters here
def fit(self, X, y):
X, y = check_X_y(X, y, ['csr', 'csc'], multi_output=True)
....
....
# Here only the X, y are passed to scoring function
score_func_ret = self.score_func(X, y)
....
....
self.scores_ = np.asarray(self.scores_)
return self
现在,我们将使用更改后的SelectKBestCustom
定义新的课程fit()
。我复制了上面的所有内容,只更改了两行(对其进行了评论):
from sklearn.utils import check_X_y
class SelectKBestCustom(SelectKBest):
# Changed here
def fit(self, X, y, discrete_features='auto'):
X, y = check_X_y(X, y, ['csr', 'csc'], multi_output=True)
if not callable(self.score_func):
raise TypeError("The score function should be a callable, %s (%s) "
"was passed."
% (self.score_func, type(self.score_func)))
self._check_params(X, y)
# Changed here also
score_func_ret = self.score_func(X, y, discrete_features)
if isinstance(score_func_ret, (list, tuple)):
self.scores_, self.pvalues_ = score_func_ret
self.pvalues_ = np.asarray(self.pvalues_)
else:
self.scores_ = score_func_ret
self.pvalues_ = None
self.scores_ = np.asarray(self.scores_)
return self
这可以简单地称为:
clf = SelectKBestCustom(mutual_info_classif,k=2)
clf.fit(X, y, discrete_features=[0, 1, 2])
修改强>:
上述解决方案也可用于管道,并且在调用discrete_features
时可以为fit()
参数指定不同的值。
另一种解决方案(不太可取):
尽管如此,如果您只需要SelectKBest
暂时(仅分析结果),我们也可以创建一个自定义函数,可以在内部使用硬编码{{1}调用mutual_info_classif
}}。有点像:
mutual_info_classif
使用上述功能:
discrete_features
答案 1 :(得分:0)
你也可以按如下方式使用部分:
from functools import partial
discrete_mutual_info_classif = partial(mutual_info_classif, iscrete_features=[0, 1, 2])
SelectKBest(score_func=discrete_mutual_info_classif).fit(x, y)