gpt4 book ai didi

python - 被 GradientBoostingClassifier 的 apply 函数搞糊涂了

转载 作者:太空狗 更新时间:2023-10-29 21:51:49 27 4
gpt4 key购买 nike

应用功能可以引用here

我的困惑更多来自this sample ,我在下面的代码片段中添加了一些打印以输出更多调试信息,

grd = GradientBoostingClassifier(n_estimators=n_estimator)
grd_enc = OneHotEncoder()
grd_lm = LogisticRegression()
grd.fit(X_train, y_train)
test_var = grd.apply(X_train)[:, :, 0]
print "test_var.shape", test_var.shape
print "test_var", test_var
grd_enc.fit(grd.apply(X_train)[:, :, 0])
grd_lm.fit(grd_enc.transform(grd.apply(X_train_lr)[:, :, 0]), y_train_lr)

输出如下,搞不懂6.3.10. 等数字是什么意思?它们与最终的分类结果有什么关系?

test_var.shape (20000, 10)
test_var [[ 6. 6. 6. ..., 10. 10. 10.]
[ 10. 10. 10. ..., 3. 3. 3.]
[ 6. 6. 6. ..., 11. 10. 10.]
...,
[ 6. 6. 6. ..., 10. 10. 10.]
[ 6. 6. 6. ..., 11. 10. 10.]
[ 6. 6. 6. ..., 11. 10. 10.]]

最佳答案

要了解梯度提升,您首先需要了解单个树。我将展示一个小例子。

设置如下:一个在 Iris 数据集上训练的小型 GB 模型,用于预测一朵花是否属于第 2 类。

# import the most common dataset
from sklearn.datasets import load_iris
from sklearn.ensemble import GradientBoostingClassifier
X, y = load_iris(return_X_y=True)
# there are 150 observations and 4 features
print(X.shape) # (150, 4)
# let's build a small model = 5 trees with depth no more than 2
model = GradientBoostingClassifier(n_estimators=5, max_depth=2, learning_rate=1.0)
model.fit(X, y==2) # predict 2nd class vs rest, for simplicity
# we can access individual trees
trees = model.estimators_.ravel()
print(len(trees)) # 5
# there are 150 observations, each is encoded by 5 trees, each tree has 1 output
applied = model.apply(X)
print(applied.shape) # (150, 5, 1)
print(applied[0].T) # [[2. 2. 2. 5. 2.]] - a single row of the apply() result
print(X[0]) # [5.1 3.5 1.4 0.2] - the pbservation corresponding to that row
print(trees[0].apply(X[[0]])) # [2] - 2 is the result of application the 0'th tree to the sample
print(trees[3].apply(X[[0]])) # [5] - 5 is the result of application the 3'th tree to the sample

你可以看到序列中的每个数字[2. 2. 2. 5. 2.]制作人 model.apply()对应于单个树的输出。但是这些数字是什么意思?

我们可以通过视觉检查轻松分析决策树。这是一个绘制一个的函数

# a function to draw a tree. You need pydotplus and graphviz installed 
# sudo apt-get install graphviz
# pip install pydotplus

from sklearn.externals.six import StringIO
from IPython.display import Image
from sklearn.tree import export_graphviz
import pydotplus
def plot_tree(clf):
dot_data = StringIO()
export_graphviz(clf, out_file=dot_data, node_ids=True,
filled=True, rounded=True,
special_characters=True)
graph = pydotplus.graph_from_dot_data(dot_data.getvalue())
return Image(graph.create_png())

# now we can plot the first tree
plot_tree(trees[0])

enter image description here

可以看到每个节点都有一个数字(从0到6)。如果我们将单个示例插入这棵树,它将首先转到节点 #1(因为特征 x3 的值为 0.2 < 1.75 ),然后到节点 #2(因为特征 x2 的值为 1.4 < 4.95 .

以同样的方式,我们可以分析产生输出5的树3。 :

plot_tree(trees[3])

enter image description here

这里我们的观察首先到达节点 #4,然后到达节点 #5,因为 x1=3.5>2.25x2=1.4<4.85 .因此,它以数字 5 结尾。

就这么简单! apply() 生成的每个数字是样本最终所在的对应树的节点的序号。

这些数字与最终分类结果的关系是通过value相应树中的叶子。在二进制分类的情况下,value在所有叶子中加起来,如果它是正的,那么“正”类获胜,否则“负”类获胜。在多类分类的情况下,每个类的值相加,总值最大的类获胜。

在我们的例子中,第一棵树(其节点#2)给出了值 -1.454,​​其他树也给出了一些值,它们的总和为 -4.84。它是负的,因此,我们的示例不属于第 2 类。

values = [trees[i].tree_.value[int(leaf)][0,0] for i, leaf in enumerate(applied[0].ravel())]
print(values) # [-1.454, -1.05, -0.74, -1.016, -0.58] - the values of nodes [2,2,2,5,2] in the corresponding trees
print(sum(values)) # -4.84 - sum of these values is negative -> this is not class 2

关于python - 被 GradientBoostingClassifier 的 apply 函数搞糊涂了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50111612/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com