我在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中,每列的特征重要性在每次拆分时计算。例如性别和国家的某些特征重要性值将在第一次划分时计算出来。然后再次在第二次拆分时发生。但是,由于我们已经基于国家/地区进行了划分,因此不会获得任何基于国家/地区的信息,但是会存在性别差异。最后总结了所有这些重要性。因此,我们为以后用于拆分的那些获取更多价值。