【问题标题】:How do I SelectKBest using mutual information from a mixture of discrete and continuous features?如何使用来自离散和连续特征混合的互信息选择KBest?
【发布时间】:2017-09-24 09:25:26
【问题描述】:

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

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

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

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

但无法将离散特征掩码传递给SelectKBest。是否有一些我忽略的语法可以做到这一点,还是我必须编写自己的得分函数包装器?

【问题讨论】:

    标签: scikit-learn feature-selection


    【解决方案1】:

    很遗憾,我找不到 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
    

    现在我们将使用更改后的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 参数分配不同的值。

    另一种解决方案(不太可取): 尽管如此,如果您只是需要暂时使用SelectKBestmutual_info_classif(只是分析结果),我们还可以创建一个自定义函数,它可以在内部使用硬编码的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)
    

    【讨论】:

      【解决方案2】:

      你也可以像下面这样使用分部:

      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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-07
        • 2020-09-21
        • 1970-01-01
        • 2019-05-21
        • 1970-01-01
        • 2015-07-28
        相关资源
        最近更新 更多