我一直在探索scikit-learn,使用熵和基尼分裂标准制定决策树,并探索差异.
我的问题是,我如何"打开引擎盖"并确切地找出树在每个级别上分裂的属性及其相关的信息值,以便我可以看到这两个标准在哪里做出不同的选择?
到目前为止,我已经探索了文档中概述的9种方法.它们似乎不允许访问此信息.但是这些信息肯定是可以访问的吗?我正在设想一个包含节点和增益条目的列表或字典.
如果我错过了一些完全明显的东西,感谢您的帮助和道歉.
我正在尝试使用Python中的scikit-learn设计一个简单的决策树(我在Windows操作系统上使用Anaconda的Ipython Notebook和Python 2.7.3),并将其可视化如下:
from pandas import read_csv, DataFrame
from sklearn import tree
from os import system
data = read_csv('D:/training.csv')
Y = data.Y
X = data.ix[:,"X0":"X33"]
dtree = tree.DecisionTreeClassifier(criterion = "entropy")
dtree = dtree.fit(X, Y)
dotfile = open("D:/dtree2.dot", 'w')
dotfile = tree.export_graphviz(dtree, out_file = dotfile, feature_names = X.columns)
dotfile.close()
system("dot -Tpng D:.dot -o D:/dtree2.png")
Run Code Online (Sandbox Code Playgroud)
但是,我收到以下错误:
AttributeError: 'NoneType' object has no attribute 'close'
Run Code Online (Sandbox Code Playgroud)
我使用以下博客文章作为参考:Blogpost链接
以下stackoverflow问题对我来说似乎也不起作用:问题
有人可以帮助我如何在scikit-learn中可视化决策树吗?
有这么多的帖子这样有关如何提取sklearn决策树的规则,但我找不到任何有关使用熊猫。
以这个数据和模型为例,如下
# Create Decision Tree classifer object
clf = DecisionTreeClassifier(criterion="entropy", max_depth=3)
# Train Decision Tree Classifer
clf = clf.fit(X_train,y_train)
Run Code Online (Sandbox Code Playgroud)
结果:
预期:
关于此示例,有8条规则。
从左到右,请注意该数据帧是 df
r1 = (df['glucose']<=127.5) & (df['bmi']<=26.45) & (df['bmi']<=9.1)
……
r8 = (df['glucose']>127.5) & (df['bmi']>28.15) & (df['glucose']>158.5)
Run Code Online (Sandbox Code Playgroud)
我不是提取sklearn决策树规则的大师。获取大熊猫布尔条件将有助于我为每个规则计算样本和其他指标。因此,我想将每个规则提取到熊猫的布尔条件。
我使用R包GBM可能是我预测建模的首选.有关于这个算法,但在一个"坏"这么多伟大的事情是,我不能轻易使用型号代码进球我要编写能够在SAS或其他系统中使用的代码外河的新数据(我将开始与SAS(无法访问IML)).
假设我有以下数据集(来自GBM手册)和型号代码:
library(gbm)
set.seed(1234)
N <- 1000
X1 <- runif(N)
X2 <- 2*runif(N)
X3 <- ordered(sample(letters[1:4],N,replace=TRUE),levels=letters[4:1])
X4 <- factor(sample(letters[1:6],N,replace=TRUE))
X5 <- factor(sample(letters[1:3],N,replace=TRUE))
X6 <- 3*runif(N)
mu <- c(-1,0,1,2)[as.numeric(X3)]
SNR <- 10 # signal-to-noise ratio
Y <- X1**1.5 + 2 * (X2**.5) + mu
sigma <- sqrt(var(Y)/SNR)
Y <- Y + rnorm(N,0,sigma)
# introduce some missing values
#X1[sample(1:N,size=500)] <- NA
X4[sample(1:N,size=300)] <- NA
X3[sample(1:N,size=30)] <- NA
data <- data.frame(Y=Y,X1=X1,X2=X2,X3=X3,X4=X4,X5=X5,X6=X6)
# fit initial model
gbm1 <- gbm(Y~X1+X2+X3+X4+X5+X6, # formula
data=data, # dataset …Run Code Online (Sandbox Code Playgroud) 我目前正在使用以下代码查看决策树.有没有办法我们可以将一些计算字段输出为输出?
例如,是有可能在树的叶子在每个节点显示输入属性的总和,特征1的从"X"的数据数组,即总和.
from sklearn import datasets
iris = datasets.load_iris()
X = iris.data[:]
y = iris.target
#%%
from sklearn.tree import DecisionTreeClassifier
alg=DecisionTreeClassifier( max_depth=5,min_samples_leaf=2, max_leaf_nodes = 10)
alg.fit(X,y)
#%%
## View tree
import graphviz
from sklearn import tree
dot_data = tree.export_graphviz(alg,out_file=None, node_ids = True, proportion = True, class_names = True, filled = True, rounded = True)
graph = graphviz.Source(dot_data)
graph
Run Code Online (Sandbox Code Playgroud)
我正在使用构建决策树
clf = tree.DecisionTreeClassifier()
clf = clf.fit(X_train, Y_train)
Run Code Online (Sandbox Code Playgroud)
一切正常.但是,我如何探索决策树?
例如,如何找到X_train中的哪些条目出现在特定的叶子中?
我需要从我在python中安装的xgboost模型中提取决策规则.我使用0.6a2版本的xgboost库,我的python版本是3.5.2.
我的最终目标是使用这些拆分来容纳变量(根据拆分).
我没有遇到这个版本的任何属性,可以给我分裂.
plot_tree给了我类似的东西.然而,它是树的可视化.
我需要像/sf/answers/2784051931/这样的xgboost模型
我在3类数据集上使用scikit-learn DecissionTreeClassifier.在我拟合分类器后,我访问tree_属性上的所有叶节点,以获得最终在每个类的给定节点中的实例数量.
clf = tree.DecisionTreeClassifier(max_depth=5)
clf.fit(X, y)
# lets assume there is a leaf node with id 5
print clf.tree_.value[5]
Run Code Online (Sandbox Code Playgroud)
这将打印出来:
>>> array([[ 0., 1., 68.]])
Run Code Online (Sandbox Code Playgroud)
但是...我怎么知道该数组中哪个位置属于哪个类?分类器具有classes_属性,该属性也是列表
>>> clf.classes_
array(['CLASS_1', 'CLASS_2', 'CLASS_3'], dtype=object)
Run Code Online (Sandbox Code Playgroud)
也许value数组上的索引1匹配classes数组的索引1上的类,依此类推?
我正在创建决策树,我的数据属于以下类型
X1 |X2 |X3|.....X50|Y
_____________________________________
1 |5 |7 |.....0 |1
1.5|34 |81|.....0 |1
4 |21 |21|.... 1 |0
65 |34 |23|.....1 |1
Run Code Online (Sandbox Code Playgroud)
我正在尝试执行以下代码:
X_train = data.iloc[:,0:51]
Y_train = data.iloc[:,51]
clf = DecisionTreeClassifier(criterion = "entropy", random_state = 100,
max_depth=8, min_samples_leaf=15)
clf.fit(X_train, y_train)
Run Code Online (Sandbox Code Playgroud)
我想要的是可以预测特定类别的决策规则(在这种情况下为“ 0”)。例如,
when X1 > 4 && X5> 78 && X50 =100 Then Y = 0 ( Probability =84%)
When X4 = 56 && X39 < 100 Then Y = 0 ( Probability = 93%)
...
Run Code Online (Sandbox Code Playgroud)
因此,基本上我希望所有叶子节点,附加的决策规则以及Y = 0的概率到来,从而预测Class …
python machine-learning decision-tree python-3.x scikit-learn