如何使用来自离散和连续特征混合的互信息来选择KBest?

时间:2017-04-26 19:46:57

标签: 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)

但无法将离散要素掩码传递给SelectKBest。是否有一些语法可以解决这个问题,或者我是否必须编写自己的分数函数包装器?

2 个答案:

答案 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)