如何使用来自离散和连续特征的混合物中的共同信息进行选择



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

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

现在,我想在管道中使用相同的共同信息选择。我想做这样的事情

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

但是无法将离散功能蒙版传递给SelectKBest。我要忽略的语法要执行一些语法,还是我必须写自己的分数功能包装器?

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

这是当前的fit()方法 SelectKbest(从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

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

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])

编辑:上述解决方案也可以在管道中有用,在调用fit()时,discrete_features参数可以分配不同的值。

另一个解决方案(较不优选(:不过,如果您只需要暂时使用SelectKBest(只需分析结果(即可使用CC_11,我们还可以制作一个自定义功能,可以用硬编码的discrete_features在内部调用mutual_info_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)

您也可以使用局部如下:

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)

最新更新