gpt4 book ai didi

python - 使用 scikit-learn 对随机森林进行递归特征消除

转载 作者:IT老高 更新时间:2023-10-28 21:17:04 32 4
gpt4 key购买 nike

我正在尝试使用 scikit-learn 和随机森林分类器执行递归特征消除,并使用 OOB ROC 作为对递归过程中创建的每个子集进行评分的方法。

但是,当我尝试使用 RFECV 方法时,我收到一条错误消息 AttributeError: 'RandomForestClassifier' object has no attribute 'coef_'

随机森林本身没有系数,但它们确实有根据基尼分数进行的排名。所以,我想知道如何解决这个问题。

请注意,我想使用一种方法来明确告诉我在最佳分组中选择了我的 pandas DataFrame 中的哪些特征,因为我正在使用递归特征选择来尽量减少数据我将输入到最终的分类器中。

下面是一些示例代码:

from sklearn import datasets
import pandas as pd
from pandas import Series
from sklearn.ensemble import RandomForestClassifier
from sklearn.feature_selection import RFECV

iris = datasets.load_iris()
x=pd.DataFrame(iris.data, columns=['var1','var2','var3', 'var4'])
y=pd.Series(iris.target, name='target')
rf = RandomForestClassifier(n_estimators=500, min_samples_leaf=5, n_jobs=-1)
rfecv = RFECV(estimator=rf, step=1, cv=10, scoring='ROC', verbose=2)
selector=rfecv.fit(x, y)

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/bbalin/anaconda/lib/python2.7/site-packages/sklearn/feature_selection/rfe.py", line 336, in fit
ranking_ = rfe.fit(X_train, y_train).ranking_
File "/Users/bbalin/anaconda/lib/python2.7/site-packages/sklearn/feature_selection/rfe.py", line 148, in fit
if estimator.coef_.ndim > 1:
AttributeError: 'RandomForestClassifier' object has no attribute 'coef_'

最佳答案

这是我为使 RandomForestClassifier 适应 RFECV 所做的工作:

class RandomForestClassifierWithCoef(RandomForestClassifier):
def fit(self, *args, **kwargs):
super(RandomForestClassifierWithCoef, self).fit(*args, **kwargs)
self.coef_ = self.feature_importances_

如果您使用“准确度”或“f1”分数,只需使用此类即可。对于“roc_auc”,RFECV 提示不支持多类格式。使用下面的代码将其更改为二分类,“roc_auc”评分有效。 (使用 Python 3.4.1 和 scikit-learn 0.15.1)

y=(pd.Series(iris.target, name='target')==2).astype(int)

插入您的代码:

from sklearn import datasets
import pandas as pd
from pandas import Series
from sklearn.ensemble import RandomForestClassifier
from sklearn.feature_selection import RFECV

class RandomForestClassifierWithCoef(RandomForestClassifier):
def fit(self, *args, **kwargs):
super(RandomForestClassifierWithCoef, self).fit(*args, **kwargs)
self.coef_ = self.feature_importances_

iris = datasets.load_iris()
x=pd.DataFrame(iris.data, columns=['var1','var2','var3', 'var4'])
y=(pd.Series(iris.target, name='target')==2).astype(int)
rf = RandomForestClassifierWithCoef(n_estimators=500, min_samples_leaf=5, n_jobs=-1)
rfecv = RFECV(estimator=rf, step=1, cv=2, scoring='roc_auc', verbose=2)
selector=rfecv.fit(x, y)

关于python - 使用 scikit-learn 对随机森林进行递归特征消除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24123498/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com