R中决策树的特征重要性计算错误

时间:2019-04-05 13:29:18

标签: python r decision-tree

我在python和R中都训练了决策树,但是我认为在R中计算特征重要性的方式可能是错误的。下面是示例代码,您可以用来重现该问题。假设我要根据性别和国家预测1000人的收入。

x = data.frame(gender=sample(c("M","F"),n,T), country=sample(c("A","I"),n,T))
x$income = ifelse(x$gender=="M", rnorm(n, 100, 10), rnorm(n, 80, 10))
x$income = x$income + ifelse(x$country=="A", rnorm(n, 100, 10), rnorm(n, 80, 10))
write.csv(x, "data.csv")

然后让最大深度为1的R中的决策树拟合。

fit = rpart(income~., data = x, control=rpart.control(maxdepth=1))
caret::varImp(fit)
fit

我对以下功能的重视程度
国家0.2507630,
性别0.2424981
对于仅在国家/地区划分的树

1) root 1000 407373.4 180.5759  
2) country=I 481 147999.6 170.0772 *  
3) country=A 519 157219.6 190.3060 *  

当我以2的最大深度再次尝试时,得到的功能重要性为
国家0.2507630,
性别0.8874599

对于树木,首先像以前一样在国家/地区拆分,然后按性别

1) root 1000 407373.40 180.5759    
  2) country=I 481 147999.60 170.0772    
     4) gender=F 232  40082.49 159.2805 *  
     5) gender=M 249  55676.09 180.1367 *  
  3) country=A 519 157219.60 190.3060    
     6) gender=F 248  57546.77 180.4749 *  
     7) gender=M 271  53767.73 199.3028 *  

但是,如果我在python中运行类似的代码

from io import StringIO
from sklearn.tree import DecisionTreeRegressor
from sklearn.tree.export import export_graphviz
from IPython.display import Image 
from sklearn import tree
import pydot
import pandas as pd

data = pd.read_csv("data.csv")

dtree=DecisionTreeRegressor(max_depth= 1)
X = data[["gender", "country" ]]
X["gender"] = X["gender"] == 'M'
X["country"] = X["country"] == 'A'
y = data[['income']]
dtree.fit(X,y)

# Export as dot file
export_graphviz(dtree, out_file='tree.dot', 
                feature_names = X.columns,filled=True, rounded=True,
                special_characters=True)

(graph,) = pydot.graph_from_dot_file('tree.dot')
graph.write_png('tree.png')
# Display in jupyter notebook
from IPython.display import Image
Image(filename = 'tree.png')

最大深度为1时,我获得的功能重要性为

gender  0, and  
country 1 

,并且最大深度为两个

gender  0.49, and  
country 0.51  

现在我有两个问题
1)在R中,当我选择最大深度= 1且仅在“国家/地区”列发生拆分时,为什么它仍给出性别的特征重要性值。即使性别甚至不是最终模型的一部分。例如在python中,性别的重要性为0。
2)其次,为什么在R中,性别列的特征重要性大于国家列?由于国家栏更为重要,因为最初的分歧发生在国家而不是性别上。就像我们为python获取的值一样。
我的一位同事指出,在R中,每列的特征重要性在每次拆分时计算。例如性别和国家的某些特征重要性值将在第一次划分时计算出来。然后再次在第二次拆分时发生。但是,由于我们已经基于国家/地区进行了划分,因此不会获得任何基于国家/地区的信息,但是会存在性别差异。最后总结了所有这些重要性。因此,我们为以后用于拆分的那些获取更多价值。

0 个答案:

没有答案