决策树(Decision Tree)是一种非参数的有监督学习方法,它能够从一系列有特征和标签的数据中总结出决策规则,并用树状图的形状呈现这些规则,以解决分类和回归问题。

1、决策树要解决的问题

  • 如何从数据表中找出最佳节点和和最佳分支
  • 如何让决策树停止生长,防止过拟合

2、决策树—熵

子节点的不纯度肯定比父节点的不纯度要低,叶子节点的不纯度肯定是最低的。 熵的意思就是指一个集合中的不纯度。

2.1 熵的计算公式

决策树与随机森林 - 图1
熵值越大,代表集合就越不纯

2.2 另一种—Gini系数

决策树与随机森林 - 图2

3、信息增益

原始的熵值减去一个以某个特征值的熵

3.1 谁来做根节点

信息增益最多的代表纯度下降最快,做为根节点。

4、相关算法

4.1 信息增益(ID3)

会存在一些问题,比如把样本的ID也当做一个特征来计算,则此时的熵值为0,信息增益肯定是最高的,但是此时它作为根节点肯定是不符合的。

4.2 信息增益率(C4.5)

信息增益率 = 信息增益 / 自身的熵值

4.3 Gini系数(CART)

5、决策树中的损失函数

决策树与随机森林 - 图3 (t代表每个叶子节点,H(t)代表熵值或者Gini系数,Nt表示叶子节点中的样本数)

正则化:决策树与随机森林 - 图4(Tleaf 表示叶子节点的个数)

6、决策树剪枝

6.1 预剪枝

在构建过程中能够提前停止

6.2 后剪枝

在构建完成后进行剪枝

在sklearn中有 max_path、min_samples_leaf、min_samples_split、min_impurity_decrease等属性来控制

7、集成算法 — 随机森林

随机森林属于一种集成学习。集成学习本身不是一种机器学习算法,而是通过在数据上建成多个模型的建模结果。 三种集成算法:装袋法(Bagging),提升法(boosting)、stacking

7.1 集成算法

装袋法: 构建多个相互独立的评估器,然后对其多数预测进行平均或者多数表决原则来决定最终结果。代表是随机森林。
提升法:评估器之间是相关的,核心思想是结合弱评估器的力量一次次对难以评估的样本进行预测,从而构成一个强预测器。代表有Adaboost和梯度提升树。

7.2 随机森林

随机森林相当于构建了很多决策树,让这些决策树共同去决策分类结果。
随机森林中随机的理解:

  • 对数据的随机 —- 随机去样本点的60%(这样做的目的是为了让某些树选不到异常点,使得结果更优,这里采用的是有放回采样bootstraping)
  • 对特征的随机 —- 随机选取几个特征

8、sklearn中的决策树

DecisionTreeClassifier —- 分类树
DecisionTreeRegressor —- 回归树
ExtraTreeRegressor —- 高随机版本的回归树
ExtraTreeClassifier —- 高随机版本的分类树
export_graphviz —- 专门用于画图的库

8.1 库中如何选取criterion参数?

  • 如果 数据特征比较多,选取gini系数,(熵容易发生过拟合)
  • 当发现拟合程度不够的时候,选取熵(熵的拟合效果永远可以达到100%)

8.2 sklearn实现决策树

  1. """
  2. 决策树
  3. """
  4. from sklearn import datasets
  5. from sklearn.tree import DecisionTreeClassifier
  6. import pandas as pd
  7. from sklearn.model_selection import train_test_split
  8. from sklearn.tree import export_graphviz
  9. import graphviz
  10. wine = datasets.load_wine()
  11. X, Y = wine.data, wine.target
  12. csv = pd.concat([pd.DataFrame(X), pd.DataFrame(Y)], axis=1)
  13. X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.3)
  14. clf = DecisionTreeClassifier(criterion="entropy")
  15. clf.fit(X_train, Y_train)
  16. score = clf.score(X_test, Y_test)
  17. feature_name = ["酒精", "苹果酸", "灰", "灰的碱性", "镁", "总酚", "类黄酮", "非黄烷类酚类", "花青素", "颜色强度", "色调", "od280", "铺氨酸"]
  18. dot_data = export_graphviz(
  19. clf
  20. , feature_names=feature_name
  21. , class_names=["琴酒", "雪莉", "贝尔摩德"]
  22. , rounded=True
  23. , filled=True
  24. )
  25. graph = graphviz.Source(dot_data)
  26. graph.format = "png"
  27. graph.view()
  28. # 获取哪个特征的重要性 zip把两个list对应,返回一个tuple
  29. importtant = [*zip(feature_name, clf.feature_importances_)]
  30. print(importtant)

但是在训练过程中你会发现每次执行后的结果都会不同(决策树是通过优化节点,来生成最佳节点最佳树的过程,但是最佳节点不能保障这棵树是最优的),so,接下来就是提到的随机森林了,通过建立更多的树,最后选取一个最优的树来

9、sklearn生成随机森林

  1. from sklearn.ensemble import RandomForestClassifier
  2. # n_estimators越大越好,不过在达到一定值后效果开始波动,而且还非常占用内存,训练时间也会很长,所以我们需要内存,训练时间、训练效果中取得平衡点。
  3. rfc = RandomForestClassifier(n_estimators=100)
  4. # 用训练集数据训练模型
  5. rfc.fit(x_train, y_train)