fsel = ske.ExtraTreesClassifier().fit(X, y)model = SelectFromModel(fsel, prefit=True)
我正在尝试使用ExtraTreesClassifier训练数据集。函数SelectFromModel()如何决定特征的重要性值,并返回什么?
回答:
如SelectFromModel
的文档中所述:
threshold : string, float, optional default None
用于特征选择的阈值。重要性大于或等于该阈值的特征将被保留,而其他特征将被丢弃。如果是“median”(分别是“mean”),则阈值是特征重要性的中位数(分别是均值)。还可以使用缩放因子(例如,“1.25*mean”)。如果是None,并且估计器的参数penalty设置为l1,无论是显式还是隐式(例如,Lasso),则使用的阈值为1e-5。否则,默认使用“mean”。
在你的例子中,threshold
是默认值None
,将使用你的ExtraTreesClassifier中feature_importances_
的均值作为阈值。
示例
from sklearn.datasets import load_irisfrom sklearn.ensemble import ExtraTreesClassifierfrom sklearn.feature_selection import SelectFromModeliris = load_iris()X, y = iris.data, iris.targetclf = ExtraTreesClassifier()model = SelectFromModel(clf)SelectFromModel(estimator=ExtraTreesClassifier(bootstrap=False, class_weight=None, criterion='gini', max_depth=None, max_features='auto', max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=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), norm_order=1, prefit=False, threshold=None)model.fit(X, y)print(model.threshold_)#0.25print(model.estimator_.feature_importances_)#array([0.09790258, 0.02597852, 0.35586554, 0.52025336])print(model.estimator_.feature_importances_.mean())#0.25
如你所见,拟合后的model
是SelectFromModel
的一个实例,使用ExtraTreesClassifier()
作为估计器。阈值是0.25
,这也是拟合估计器的特征重要性的均值。根据特征重要性和阈值,模型将仅保留输入数据的第三个和第四个特征(那些重要性大于阈值的特征)。你可以使用拟合后的SelectFromModel()
类的transform
方法从输入数据中选择这些特征。