如何在“随机森林”中获得每个目标的预测属性?

时间:2016-09-09 22:16:45

标签: python machine-learning classification feature-extraction

我最近一直在使用feature_importance_模型,而且它们对1st and 2nd attributes属性非常有用!

了解哪些变量更能预测特定目标会很有用。

例如,如果target 0更能预测错误3rd and 4th attributes,但target 1更能预测feature_importance_,该怎么办?

有没有办法分别为每个目标获取sklearn数组?使用scipypandasnumpy或{{ 1}}最好。

# Iris dataset
DF_iris = pd.DataFrame(load_iris().data,
                       index = ["iris_%d" % i for i in range(load_iris().data.shape[0])],
                       columns = load_iris().feature_names)

Se_iris = pd.Series(load_iris().target,
                       index = ["iris_%d" % i for i in range(load_iris().data.shape[0])],
                       name = "Species")
# Import modules
from sklearn.ensemble import RandomForestClassifier
from sklearn.cross_validation import train_test_split

# Split Data
X_tr, X_te, y_tr, y_te = train_test_split(DF_iris, Se_iris, test_size=0.3, random_state=0)

# Create model
Mod_rf = RandomForestClassifier(random_state=0)
Mod_rf.fit(X_tr,y_tr)

# Variable Importance
Mod_rf.feature_importances_
# array([ 0.14334485,  0.0264803 ,  0.40058315,  0.42959169])

# Target groups
Se_iris.unique()
# array([0, 1, 2])

1 个答案:

答案 0 :(得分:1)

这不是RF的工作原理。由于没有简单的特色投票" (这发生在线性模型中)很难回答问题是什么"特征X更能预测目标Y"甚至意味着。 RF捕获的重要性是什么?一般来说,在决策过程中使用此功能的可能性是多少?#34;。解决问题的一个问题是,如果你问一下,在一般情况下,在决策过程中使用此功能的可能性导致标签Y "你必须运行相同的程序,但删除叶子中不包含标签Y的所有子树 - 这样你就可以删除不能解决问题的部分决策过程"是Y还是不是Y&# 34;而是试着回答哪个"而不是Y"它是。然而,在实践中,由于RF的非常随机性,削减其深度等,这可能几乎不会减少任何东西。坏消息是,我从未见过它在任何标准RF库中实现,你可以自己做,就像我说的那样:

for i = 1 to K (K is number of distinct labels)
  tmp_RF = deepcopy(RF)
  for tree in tmp_RF:
    tree = remove_all_subtrees_that_do_not_contain_given_label(tree, i)
    for x in X (X is your dataset)
      features_importance[i] += how_many_times_each_feature_is_used(tree, x) / |X| 
  features_importance[i] /= |tmp_RF|
return features_importance 

特别是您可以使用现有的feature_importance代码,只需执行

即可
for i = 1 to K (K is number of distinct labels)
  tmp_RF = deepcopy(RF)
  for tree in tmp_RF:
    tree = remove_all_subtrees_that_do_not_contain_given_label(tree, i)
  features_importance[i] = run_regular_feature_importance(tmp_RF)
return features_importance