赞
踩
决策树模型可以用来做 回归/分类 任务。
每次选择一个属性/特征,依据特征的阈值,将特征空间划分为 与 坐标轴平行的一些决策区域。如果是分类问题,每个决策区域的类别为该该区域中多数样本的类别;如果为回归问题,每个决策区域的回归值为该区域中所有样本值的均值。
决策树复杂程度 依赖于 特征空间的几何形状。根节点->叶子节点的一条路径产生一条决策规则。
决策树最大优点:可解释性强
决策树最大缺点:不是分类正确率最高的模型
决策树的学习是一个NP-Complete问题,所以实际中使用启发性的规则来构建决策树。
step1:选最好的特征来划分数据集
step2:对上一步划分的子集重复步骤1,直至停止条件(节点纯度/分裂增益/树深度)
不同的特征衡量标准,产生了不同的决策树生成算法:
算法 | 最优特征选择标准 |
---|---|
ID3 | 信息增益: G a i n ( A ) = H ( D ) − H ( D ∣ A ) Gain(A)=H(D)-H(D|A) Gain(A)=H(D)−H(D∣A) |
C4.5 | 信息增益率: G a i n R a t i o ( A ) = G a i n ( A ) / S p l i t ( A ) GainRatio(A)=Gain(A)/Split(A) GainRatio(A)=Gain(A)/Split(A) |
CART | gini指数增益: G i n i ( D ) − G i n i ( D ∣ A ) Gini(D)-Gini(D|A) Gini(D)−Gini(D∣A) |
k个类别,类别分布的gini 指数如下,gini指数越大,样本的不确定性越大:
G
i
n
i
(
D
)
=
∑
k
=
1
K
p
k
(
1
−
p
k
)
=
1
−
∑
k
=
1
K
p
k
2
Gini(D) =\sum_{k=1}^Kp_k(1-p_k)=1-\sum_{k=1}^Kp_k^2
Gini(D)=k=1∑Kpk(1−pk)=1−k=1∑Kpk2
CART – Classification and Regression Trees 的缩写1984年提出的一个特征选择算法,对特征进行是/否判断,生成一棵二叉树。且每次选择完特征后不对特征进行剔除操作,所有同一条决策规则上可能出现重复特征的情况。
Scikit-learn(sklearn)是机器学习中常用的第三方模块,其建立在NumPy、Scipy、MatPlotLib之上,包括了回归,降维,分类,聚类方法。
sklearn 通过以下两个类实现了 决策分类树 和 决策回归树
sklearn 实现了ID3和Cart 算法,criterion默认为"gini"系数,对应为CART算法。还可设置为"entropy",对应为ID3。(计算机最擅长做的事:规则重复计算,sklearn通过对每个特征的每个切分点计算信息增益/gini增益,得到当前数据集合最优的特征及最优划分点)
sklearn.tree.DecisionTreeClassifier(criterion=’gini’*,splitter=’best’, max_depth=None,
min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0,
max_features=None, random_state=None, max_leaf_nodes=None,
min_impurity_decrease=0.0, min_impurity_split=None, class_weight=None, presort=False)
DecisionTreeRegressor(criterion=’mse’, splitter=’best’,
max_depth=None, min_samples_split=2, min_samples_leaf=1,
min_weight_fraction_leaf=0.0, max_features=None, random_state=None,
max_leaf_nodes=None, min_impurity_decrease=0.0,
min_impurity_split=None, presort=False)
Criterion | 选择属性的准则–gini–cart算法 |
---|---|
splitter | 特征划分点的选择策略:best 特征的所有划分点中找最优 |
random 部分划分点中找最优 | |
max_depth | 决策树的最大深度,none/int 限制/不限制决策树的深度 |
min_samples_split | 节点 继续划分需要的最小样本数,如果少于这个数,节点将不再划分 |
min_samples_leaf | 限制叶子节点的最少样本数量,如果叶子节点的样本数量过少会被剪枝 |
min_weight_fraction_leaf | 叶子节点的剪枝规则 |
max_features | 选取用于分类的特征的数量 |
random_state | 随机数生成的一些规则、 |
max_leaf_nodes | 限制叶子节点的数量,防止过拟合 |
min_impurity_decrease | 表示结点减少的最小不纯度,控制节点的继续分割规律 |
min_impurity_split | 表示结点划分的最小不纯度,控制节点的继续分割规律 |
class_weight | 设置各个类别的权重,针对类别不均衡的数据集使用 |
不适用于决策树回归 | |
presort | 控制决策树划分的速度 |
采用sklearn内置数据集鸢尾花数据集做实验。
导入第三方库
from sklearn import tree
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_iris
import graphviz
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, precision_score, recall_score
import joblib
plt.switch_backend('agg')
def demo1():
# 全数据集拟合,决策树可视化
iris = load_iris()
x, y = load_iris(return_X_y = True) # x[list]-feature,y[]-label
clf = tree.DecisionTreeClassifier() # 实例化了一个类,可以指定类参数,定制决策树模型
clf = clf.fit(x,y) # 训练模型
print("feature name ", iris.feature_names) # 特征列表, 自己的数据可视化时,构建一个特征列表即可
print("label name ",iris.target_names) # 类别列表
dot_data = tree.export_graphviz(clf, out_file = None, feature_names = iris.feature_names, class_names = iris.target_names )
graph = graphviz.Source(dot_data) # 能绘制树节点的一个接口
graph.render("iris") # 存成pdf图
tree.export_graphviz 参数 | |
---|---|
feature_names | 特征列表list,和训练时的特征列表排列顺序对其即可 |
class_names | 类别l列表ist,和训练时的label列表排列顺序对其即可 |
filled | False/True,会依据criterion的纯度将节点显示成不同的颜色 |
value中的值显示的是各个类别样本的数量(二分类就是[负样本数,正样本数])
def demo2(): # n-折实验 iris = load_iris() iris_feature = iris.data # 与demo1中的x,y是同样的数据 iris_target = iris.target # 数据集合划分参数: train_x, test_x, train_y, test_y = train_test_split(iris_feature,iris_target,test_size = 0.2, random_state = 1) dt_model = DecisionTreeClassifier() dt_model.fit(train_x, train_y) # 模型训练 predict_y = dt_model.predict(test_x) # 模型预测输出 # score = dt_model.score(test_x,test_y) # 模型测试性能: 输入:feature_test,target_test , 输出acc # print(score) # 性能指标 print("label: \n{0}".format(test_y[:5])) # 输出前5个label print("predict: \n{0}".format(predict_y[:5])) # 输出前5个label # sklearn 内置acc, recall, precision统计接口 print("test acc: %.3f"%(accuracy_score(test_y, predict_y))) # print("test recall: %.3f"%(recall_score(test_y, predict_y))) # 多类别统计召回率需要指定平均方式 # print("test precision: %.3f"%(precision_score(test_y, predict_y))) # 多类别统计准确率需要指定平均方式
def model_search(feas,labels):
# 模型参数选择,全数据5折交叉验证,出结果
min_impurity_de_entropy = np.linspace(0, 0.01, 10) # 纯度增益下界,划分后降低量少于这个值,将不进行分裂
min_impurity_split_entropy = np.linspace(0, 0.4, 10) # 当前节点纯度小于这个值将不分裂,较高版本中已经取消这个参数
max_depth_entropy = np.arange(1,11) # 决策树的深度
# param_grid = {"criterion" : ["entropy"], "min_impurity_decrease" : min_impurity_de_entropy,"max_depth" : max_depth_entropy,"min_impurity_split" : min_impurity_split_entropy }
param_grid = {"criterion" : ["entropy"], "max_depth" : max_depth_entropy, "min_impurity_split" : min_impurity_split_entropy }
clf = GridSearchCV(DecisionTreeClassifier(), param_grid, cv = 5) # 遍历以上超参, 通过多次五折交叉验证得出最优的参数选择
clf.fit(feas, label)
print("best param:", clf.best_params_) # 输出最优参数选择
print("best score:", clf.best_score_)
模型保存
joblib.dump(clf,“./dtc_model.pkl”)
模型导入
model_path = “./dtc_model.pkl”
clf = joblib.load(model_path)
1.五折交叉验证,数据集划分随机数设置 random_state
train_test_split(feas, labels, test_size = 0.2, random_state = 1 )
2.模型随机数设置 andom_state
DecisionTreeClassifier(random_state = 1)
1.官网类接口说明:
https://scikit-learn.org/dev/modules/generated/sklearn.tree.DecisionTreeClassifier.html#sklearn.tree.DecisionTreeClassifier
可视化接口说明https://scikit-learn.org/stable/modules/generated/sklearn.tree.export_graphviz.html
2.决策树超参数调参技巧:https://www.jianshu.com/p/230be18b08c2
3.Sklearn.metrics 简介及应用示例:https://blog.csdn.net/Yqq19950707/article/details/90169913
4.sklearn的train_test_split()各函数参数含义解释(非常全):https://www.cnblogs.com/Yanjy-OnlyOne/p/11288098.html
5.sklearn.tree.DecisionTreeClassifier 详细说明:https://www.jianshu.com/p/8f3f1e706f11
6.使用scikit-learn中的metrics以及DecisionTreeClassifier重做《机器学习实战》中的隐形眼镜分类问题:http://keyblog.cn/article-235.html
7.决策树算法:https://www.cnblogs.com/yanqiang/p/11600569.html
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。