我正在使用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)