决策树(Decision Tree)是一种非参数的有监督学习方法,它能够从一系列有特征和标签的数据中总结出决策规则,并用树状图的形状呈现这些规则,以解决分类和回归问题。
1、决策树要解决的问题
- 如何从数据表中找出最佳节点和和最佳分支
- 如何让决策树停止生长,防止过拟合
2、决策树—熵
子节点的不纯度肯定比父节点的不纯度要低,叶子节点的不纯度肯定是最低的。 熵的意思就是指一个集合中的不纯度。
2.1 熵的计算公式
2.2 另一种—Gini系数
3、信息增益
3.1 谁来做根节点
信息增益最多的代表纯度下降最快,做为根节点。
4、相关算法
4.1 信息增益(ID3)
会存在一些问题,比如把样本的ID也当做一个特征来计算,则此时的熵值为0,信息增益肯定是最高的,但是此时它作为根节点肯定是不符合的。
4.2 信息增益率(C4.5)
4.3 Gini系数(CART)
5、决策树中的损失函数
(t代表每个叶子节点,H(t)代表熵值或者Gini系数,Nt表示叶子节点中的样本数)
正则化:(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实现决策树
"""决策树"""from sklearn import datasetsfrom sklearn.tree import DecisionTreeClassifierimport pandas as pdfrom sklearn.model_selection import train_test_splitfrom sklearn.tree import export_graphvizimport graphvizwine = datasets.load_wine()X, Y = wine.data, wine.targetcsv = pd.concat([pd.DataFrame(X), pd.DataFrame(Y)], axis=1)X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.3)clf = DecisionTreeClassifier(criterion="entropy")clf.fit(X_train, Y_train)score = clf.score(X_test, Y_test)feature_name = ["酒精", "苹果酸", "灰", "灰的碱性", "镁", "总酚", "类黄酮", "非黄烷类酚类", "花青素", "颜色强度", "色调", "od280", "铺氨酸"]dot_data = export_graphviz(clf, feature_names=feature_name, class_names=["琴酒", "雪莉", "贝尔摩德"], rounded=True, filled=True)graph = graphviz.Source(dot_data)graph.format = "png"graph.view()# 获取哪个特征的重要性 zip把两个list对应,返回一个tupleimporttant = [*zip(feature_name, clf.feature_importances_)]print(importtant)
但是在训练过程中你会发现每次执行后的结果都会不同(决策树是通过优化节点,来生成最佳节点最佳树的过程,但是最佳节点不能保障这棵树是最优的),so,接下来就是提到的随机森林了,通过建立更多的树,最后选取一个最优的树来
9、sklearn生成随机森林
from sklearn.ensemble import RandomForestClassifier# n_estimators越大越好,不过在达到一定值后效果开始波动,而且还非常占用内存,训练时间也会很长,所以我们需要内存,训练时间、训练效果中取得平衡点。rfc = RandomForestClassifier(n_estimators=100)# 用训练集数据训练模型rfc.fit(x_train, y_train)
