gpt4 book ai didi

python - sklearn 的 DecisionTreeClassifier 中的 "splitter"属性有什么作用?

转载 作者:太空狗 更新时间:2023-10-29 22:20:56 25 4
gpt4 key购买 nike

sklearn DecisionTreeClassifier 有一个名为“splitter”的属性,默认设置为“best”,将其设置为“best”或“random”有什么作用?我无法从官方文档中找到足够的信息。

最佳答案

有两件事需要考虑,criterionsplitter。在所有的解释中,我将使用 wine 数据集示例:

标准:

用于评价特征重要性。默认值是 gini,但您也可以使用 entropy。基于此,模型将定义每个特征对于分类的重要性。

示例:

使用“gini”标准的 Wine 数据集的特征重要性为:

                             alcohol -> 0.04727507393151268
malic_acid -> 0.0
ash -> 0.0
alcalinity_of_ash -> 0.0
magnesium -> 0.0329784450464887
total_phenols -> 0.0
flavanoids -> 0.1414466773122087
nonflavanoid_phenols -> 0.0
proanthocyanins -> 0.0
color_intensity -> 0.0
hue -> 0.08378677906228588
od280/od315_of_diluted_wines -> 0.3120425747831769
proline -> 0.38247044986432716

使用“熵”标准的 Wine 数据集具有以下特征重要性:

                             alcohol -> 0.014123729330936566
malic_acid -> 0.0
ash -> 0.0
alcalinity_of_ash -> 0.02525179137252771
magnesium -> 0.0
total_phenols -> 0.0
flavanoids -> 0.4128453371544815
nonflavanoid_phenols -> 0.0
proanthocyanins -> 0.0
color_intensity -> 0.22278576133186542
hue -> 0.011635633063349873
od280/od315_of_diluted_wines -> 0.0
proline -> 0.31335774774683883

结果随 random_state 而变化,所以我认为只有数据集的一个子集用于计算它。

分离器:

拆分器用于决定使用哪个特征和哪个阈值。

  • 使用best,如果采用最重要的特征,则模型
  • 使用random,如果随机取特征但具有相同分布的模型(在gini中,proline的重要性为38%所以它会在 38% 的情况下被采用)

示例:

在使用 criterion="gini", splitter="best" 训练 1000 个 DecisionTreeClassifier 之后,这里是第一次拆分时使用的“特征编号”的分布, “阈值”

feature selection distribution

它始终选择特征 12 (=proline),threshold 为 755。这是其中一个训练模型的头部:

enter image description here

通过对 splitter="random" 做同样的事情,结果是:

enter image description here

由于使用了不同的特征,阈值变化更大,这里是过滤模型的结果,特征 12 作为第一个分割:

enter image description here

我们可以看到该模型也随机采用 threshold 进行拆分。通过查看特征 12 在类方面的分布,我们有:

enter image description here

红线是 splitter="best" 时使用的阈值。现在,使用随机,模型将随机选择一个 threshold 值(我认为正态分布具有特征的均值/标准差,但我不确定)导致以绿灯为中心的分布和最小最大值为蓝色(用 1353 个随机训练的模型 wtarting 用特征 12 进行分割)

enter image description here

重现代码:

from sklearn import datasets
from sklearn.tree import DecisionTreeClassifier, plot_tree, _tree
import numpy as np
import matplotlib.pyplot as plt

wine = datasets.load_wine()

# Feature importance

clf = DecisionTreeClassifier(criterion="gini", splitter='best', random_state=42)
clf = clf.fit(wine.data, wine.target)

for name, val in zip(wine.feature_names, clf.feature_importances_):
print(f"{name:>40} -> {val}")

print("")
clf = DecisionTreeClassifier(criterion="entropy", splitter='best', random_state=42)
clf = clf.fit(wine.data, wine.target)

for name, val in zip(wine.feature_names, clf.feature_importances_):
print(f"{name:>40} -> {val}")

# Feature selected first and threshold

features = []
tresholds = []
for random in range(1000):
clf = DecisionTreeClassifier(criterion="gini", splitter='best', random_state=random)
clf = clf.fit(wine.data, wine.target)
features.append(clf.tree_.feature[0])
tresholds.append(clf.tree_.threshold[0])

# plot distribution
fig, (ax, ax2) = plt.subplots(1, 2, figsize=(20, 5))
ax.hist(features, bins=np.arange(14)-0.5)
ax2.hist(tresholds)
ax.set_title("Number of the first used for split")
ax2.set_title("Value of the threshold")
plt.show()

# plot model
plt.figure(figsize=(20, 12))
plot_tree(clf)
plt.show()

# plot filtered result
threshold_filtered = [val for feat, val in zip(features, tresholds) if feat==12]
fig, ax = plt.subplots(1, 1, figsize=(20, 10))
ax.hist(threshold_filtered)
ax.set_title("Number of the first used for split")
plt.show()

feature_number = 12
X1, X2, X3 = wine.data[wine.target==0][:, feature_number], wine.data[wine.target==1][:, feature_number], wine.data[wine.target==2][:, feature_number]

fig, ax = plt.subplots()
ax.set_title(f'feature {feature_number} - distribution')
ax.boxplot([X1, X2, X3])
ax.hlines(755, 0.5, 3.5, colors="r", linestyles="dashed")
ax.hlines(min(threshold_filtered), 0.5, 3.5, colors="b", linestyles="dashed")
ax.hlines(max(threshold_filtered), 0.5, 3.5, colors="b", linestyles="dashed")
ax.hlines(sum(threshold_filtered)/len(threshold_filtered), 0.5, 3.5, colors="g", linestyles="dashed")
plt.xlabel("Class")
plt.show()

关于python - sklearn 的 DecisionTreeClassifier 中的 "splitter"属性有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46756606/

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