我已经使用scikit-learn绘制了随机森林中的特征重要性。为了改善使用随机森林的预测,如何使用图信息删除特征?即,如何根据绘图信息发现某个特征是无用的还是随机森林性能的下降甚至更差?该图基于属性feature_importances_
,我使用分类器sklearn.ensemble.RandomForestClassifier
。
我知道还有其他用于特征选择的技术,但是在这个问题中,我想重点介绍如何使用特征feature_importances_
。
此类功能重要性图的示例:
我已经使用scikit-learn绘制了随机森林中的特征重要性。为了改善使用随机森林的预测,如何使用图信息删除特征?即,如何根据绘图信息发现某个特征是无用的还是随机森林性能的下降甚至更差?该图基于属性feature_importances_
,我使用分类器sklearn.ensemble.RandomForestClassifier
。
我知道还有其他用于特征选择的技术,但是在这个问题中,我想重点介绍如何使用特征feature_importances_
。
此类功能重要性图的示例:
Answers:
您可以简单地使用该feature_importances_
属性来选择重要性得分最高的要素。因此,例如,您可以使用以下功能根据重要性选择K个最佳功能。
def selectKImportance(model, X, k=5):
return X[:,model.feature_importances_.argsort()[::-1][:k]]
或者,如果您使用管道,请使用以下类
class ImportanceSelect(BaseEstimator, TransformerMixin):
def __init__(self, model, n=1):
self.model = model
self.n = n
def fit(self, *args, **kwargs):
self.model.fit(*args, **kwargs)
return self
def transform(self, X):
return X[:,self.model.feature_importances_.argsort()[::-1][:self.n]]
因此,例如:
>>> from sklearn.datasets import load_iris
>>> from sklearn.ensemble import RandomForestClassifier
>>> iris = load_iris()
>>> X = iris.data
>>> y = iris.target
>>>
>>> model = RandomForestClassifier()
>>> model.fit(X,y)
RandomForestClassifier(bootstrap=True, class_weight=None, criterion='gini',
max_depth=None, max_features='auto', max_leaf_nodes=None,
min_samples_leaf=1, min_samples_split=2,
min_weight_fraction_leaf=0.0, n_estimators=10, n_jobs=1,
oob_score=False, random_state=None, verbose=0,
warm_start=False)
>>>
>>> newX = selectKImportance(model,X,2)
>>> newX.shape
(150, 2)
>>> X.shape
(150, 4)
显然,如果您希望基于除“前k个功能”以外的其他条件进行选择,则可以相应地调整功能。