这里说几个决策树有关的概念:
那么对于决策树来说,怎么才能实现局部最优呢?需要有一些指标来帮助决策树模型,判断哪个条件是最重要的,对下面的例子来说:高,富,帅到底哪个是最重要的呢?决策树为了找出最佳节点和最佳的分枝⽅法,创建了几个指标来帮助实现局部最优,简单说一下,对公式感兴趣的也可以自己搜搜看:
决策树算法的原理,绝对是每个人都懂的,也每天都在使用的,简单举个例子大家就知道了:
每个人都不经意之间使用到决策树,比如我想买房子:
1.先考虑要100平以上的,就会排除100平一下,在100平以上的房子中选择,
2.在考虑有没有学区,排除没有学区的房子,在100平以上有学区的房子中选择,
等等,这就是决策树的算法思想
决策树算法的构造, 实际上就是对原有数据集, 选取⼀定的属性测试条件, 不断进⾏切分的过程。
下面举一个‘高富帅’的例子,来说下决策树的一些基本概念:
节点 | 意义 |
---|---|
根节点 | 没有进边,有出边,一般指最初的,针对特征的提问。例如正方形的“高吗?” |
中间节点 | 既有进边也有出边,进边只有⼀条,出边可以有很多条。例如椭圆形的的“帅吗?”,“富吗?” |
叶⼦节点 | 有进边,没有出边,例如菱形的的“注定单身”,“多人运动” |
⼦节点和⽗节点 | 在两个相连的节点中,更接近根节点的是⽗节点,另⼀个是⼦节点。例如:帅吗?是富吗?的父节点 |
![]() |
PS:
代码实现分类树模型:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
#全部行都能输出
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"
#显示中文,解决图中无法显示中文的问题
plt.rcParams['font.sans-serif']=['Simhei']
plt.rcParams['axes.unicode_minus']=False
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import GridSearchCV
from sklearn.datasets import load_iris # 用的数据集, 鸢尾花集
# 导入数据,切分测试集数据集
iris = load_iris()
X = pd.DataFrame(data = iris.data, columns=iris.feature_names)
y = iris.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
#学习曲线初步调参
train_score_list = []
test_score_list = []
cross_score_list = []
for i in range(1,10):
dtc = DecisionTreeClassifier(max_depth=i)# 调最大深度
dtc.fit(X_train, y_train)
train_score = dtc.score(X_train, y_train)
test_score = dtc.score(X_test, y_test)
cross_score = cross_val_score(dtc, X_train, y_train, cv=5).mean()
train_score_list.append(train_score)
test_score_list.append(test_score)
cross_score_list.append(cross_score)
#画图
plt.plot(range(1,10 ), train_score_list , label='train_score' )
plt.plot(range(1,10 ), test_score_list , label='test_score' )
plt.plot(range(1,10 ), cross_score_list , label='cross_score' )
plt.legend()
#网格搜索多参数调参
dtc = DecisionTreeClassifier(random_state=666)
grid_range = {
"max_depth":[2,3,4],
"min_samples_leaf":range(2, 40,5),
"max_leaf_nodes":range(3, 8),
"min_samples_split":range(10, 31, 2)}
grid = GridSearchCV(dtc , param_grid=grid_range, n_jobs=-1, verbose=2, cv=5 ).fit(X_train, y_train)
grid.best_score_# 最优分数
grid.best_params_# 最优分数参数组合
grid.score(X_test, y_test)#测试集分数
grid.score(X_train, y_train)#训练集分数