使用scikit-learn消除随机森林上的递归特征

布赖恩

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

但是,当我尝试使用该RFECV方法时,出现错误提示AttributeError: 'RandomForestClassifier' object has no attribute 'coef_'

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

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

这是一些示例代码:

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_'
布赖恩

这是我的想法。这是一个非常简单的解决方案,并且由于我要对高度不平衡的数据集进行分类,因此它依赖于自定义精度指标(称为weightedAccuracy)。但是,如果需要,应该很容易将其扩展。

from sklearn import datasets
import pandas
from sklearn.ensemble import RandomForestClassifier
from sklearn import cross_validation
from sklearn.metrics import confusion_matrix


def get_enhanced_confusion_matrix(actuals, predictions, labels):
    """"enhances confusion_matrix by adding sensivity and specificity metrics"""
    cm = confusion_matrix(actuals, predictions, labels = labels)
    sensitivity = float(cm[1][1]) / float(cm[1][0]+cm[1][1])
    specificity = float(cm[0][0]) / float(cm[0][0]+cm[0][1])
    weightedAccuracy = (sensitivity * 0.9) + (specificity * 0.1)
    return cm, sensitivity, specificity, weightedAccuracy

iris = datasets.load_iris()
x=pandas.DataFrame(iris.data, columns=['var1','var2','var3', 'var4'])
y=pandas.Series(iris.target, name='target')

response, _  = pandas.factorize(y)

xTrain, xTest, yTrain, yTest = cross_validation.train_test_split(x, response, test_size = .25, random_state = 36583)
print "building the first forest"
rf = RandomForestClassifier(n_estimators = 500, min_samples_split = 2, n_jobs = -1, verbose = 1)
rf.fit(xTrain, yTrain)
importances = pandas.DataFrame({'name':x.columns,'imp':rf.feature_importances_
                                }).sort(['imp'], ascending = False).reset_index(drop = True)

cm, sensitivity, specificity, weightedAccuracy = get_enhanced_confusion_matrix(yTest, rf.predict(xTest), [0,1])
numFeatures = len(x.columns)

rfeMatrix = pandas.DataFrame({'numFeatures':[numFeatures], 
                              'weightedAccuracy':[weightedAccuracy], 
                              'sensitivity':[sensitivity], 
                              'specificity':[specificity]})

print "running RFE on  %d features"%numFeatures

for i in range(1,numFeatures,1):
    varsUsed = importances['name'][0:i]
    print "now using %d of %s features"%(len(varsUsed), numFeatures)
    xTrain, xTest, yTrain, yTest = cross_validation.train_test_split(x[varsUsed], response, test_size = .25)
    rf = RandomForestClassifier(n_estimators = 500, min_samples_split = 2,
                                n_jobs = -1, verbose = 1)
    rf.fit(xTrain, yTrain)
    cm, sensitivity, specificity, weightedAccuracy = get_enhanced_confusion_matrix(yTest, rf.predict(xTest), [0,1])
    print("\n"+str(cm))
    print('the sensitivity is %d percent'%(sensitivity * 100))
    print('the specificity is %d percent'%(specificity * 100))
    print('the weighted accuracy is %d percent'%(weightedAccuracy * 100))
    rfeMatrix = rfeMatrix.append(
                                pandas.DataFrame({'numFeatures':[len(varsUsed)], 
                                'weightedAccuracy':[weightedAccuracy], 
                                'sensitivity':[sensitivity], 
                                'specificity':[specificity]}), ignore_index = True)    
print("\n"+str(rfeMatrix))    
maxAccuracy = rfeMatrix.weightedAccuracy.max()
maxAccuracyFeatures = min(rfeMatrix.numFeatures[rfeMatrix.weightedAccuracy == maxAccuracy])
featuresUsed = importances['name'][0:maxAccuracyFeatures].tolist()

print "the final features used are %s"%featuresUsed

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用scikit-learn消除随机森林上的递归特征

来自分类Dev

使用scikit-learn进行递归特征消除和网格搜索

来自分类Dev

使用scikit-learn并行生成随机森林

来自分类Dev

导出Scikit Learn随机森林以在Hadoop平台上使用

来自分类Dev

SciKit-Learn:使用随机森林时的 JoblibException

来自分类Dev

scikit-learn管道中具有递归特征消除功能的网格搜索返回错误

来自分类Dev

使用scikit随机森林sample_weights

来自分类Dev

scikit随机森林的使用sample_weights

来自分类Dev

如何使用递归特征消除?

来自分类Dev

使用scikit-learn处理分类特征

来自分类Dev

使用scikit-learn处理分类特征

来自分类Dev

为什么scikit-learn的随机森林使用这么多内存?

来自分类Dev

scikit-learn中具有rbf内核的SVM使用递归功能消除的ValueError

来自分类Dev

scikit-learn中具有rbf内核的SVM使用递归功能消除的ValueError

来自分类Dev

scikit-learn / python中带有字符的随机森林

来自分类Dev

Scikit使用随机森林学习分类数据

来自分类Dev

Python - 使用 scikit 学习随机森林关于值格式的错误

来自分类Dev

使用 LinearRegression Python 进行递归特征消除

来自分类Dev

随机森林模型中具有递归特征消除的特征选择错误

来自分类Dev

使用scikit-learn删除低方差的特征

来自分类Dev

scikit学习随机森林的输入

来自分类Dev

随机森林分类-SciKit vs Weka具有100个特征的预测

来自分类Dev

SciKit-Learn随机森林子样本大小如何等于原始训练数据大小?

来自分类Dev

如何在scikit-learn中保存一个随机森林?

来自分类Dev

scikit-learn:随机森林的class_weight和sample_weight参数

来自分类Dev

在随机森林模型(Python,scikit-learn)中访问单个树的底层(tree_)对象

来自分类Dev

如何在Python scikit-learn中从随机森林中的每棵树输出回归预测?

来自分类Dev

使用scikit-learn训练多维数据

来自分类Dev

使用scikit-learn让熊猫玩得开心

Related 相关文章

  1. 1

    使用scikit-learn消除随机森林上的递归特征

  2. 2

    使用scikit-learn进行递归特征消除和网格搜索

  3. 3

    使用scikit-learn并行生成随机森林

  4. 4

    导出Scikit Learn随机森林以在Hadoop平台上使用

  5. 5

    SciKit-Learn:使用随机森林时的 JoblibException

  6. 6

    scikit-learn管道中具有递归特征消除功能的网格搜索返回错误

  7. 7

    使用scikit随机森林sample_weights

  8. 8

    scikit随机森林的使用sample_weights

  9. 9

    如何使用递归特征消除?

  10. 10

    使用scikit-learn处理分类特征

  11. 11

    使用scikit-learn处理分类特征

  12. 12

    为什么scikit-learn的随机森林使用这么多内存?

  13. 13

    scikit-learn中具有rbf内核的SVM使用递归功能消除的ValueError

  14. 14

    scikit-learn中具有rbf内核的SVM使用递归功能消除的ValueError

  15. 15

    scikit-learn / python中带有字符的随机森林

  16. 16

    Scikit使用随机森林学习分类数据

  17. 17

    Python - 使用 scikit 学习随机森林关于值格式的错误

  18. 18

    使用 LinearRegression Python 进行递归特征消除

  19. 19

    随机森林模型中具有递归特征消除的特征选择错误

  20. 20

    使用scikit-learn删除低方差的特征

  21. 21

    scikit学习随机森林的输入

  22. 22

    随机森林分类-SciKit vs Weka具有100个特征的预测

  23. 23

    SciKit-Learn随机森林子样本大小如何等于原始训练数据大小?

  24. 24

    如何在scikit-learn中保存一个随机森林?

  25. 25

    scikit-learn:随机森林的class_weight和sample_weight参数

  26. 26

    在随机森林模型(Python,scikit-learn)中访问单个树的底层(tree_)对象

  27. 27

    如何在Python scikit-learn中从随机森林中的每棵树输出回归预测?

  28. 28

    使用scikit-learn训练多维数据

  29. 29

    使用scikit-learn让熊猫玩得开心

热门标签

归档