3.5决策树算法

1.认识决策树

决策树思想的来源非常朴素,程序设计中的条件分支结构就是if-then结构,最早的决策树就是利用这类结构分割数据的一种分类学习方法
怎么理解这句话?通过一个对话例子

image
想一想这个女生为什么把年龄放在最上面判断!!!!!!!!!
如何高效的进行决策?
   特征的先后顺序

2.决策树的原理

image
这个里面有年龄、是否有工作、是否有自己的房子、信贷情况这四个特征,我们可以通过那个特征可以很快的做出决策。
先看房子,再工作->是否贷款只看了两个特征
年龄,信贷情况,工作看了三个特征
先看房子,再工作->是否贷款只看了两个特征年龄,信贷情况,工作看了三个特征
image
那么我们怎么知道这些特征哪个更好放在最上面,那么决策树的真是划分是这样的
image

决策树解决的问题就是有很多个特征,我们通过那些特征可以很快的做出正确的判断

2.1信息熵

为了解决上面的问题,我们引入了信息熵和信息增益。
H的专业术语称之为信息熵,单位为比特。
image
信息和消除不确定性是相联系的

问题: 回到我们前面的贷款案例,怎么去划分?可以利用当得知某个特征(比如是否有房子)之后,我们能够减少的不确定性大小。越大我们可以认为这个特征很重要。那怎么去衡量减少的不确定性大小呢?

2.2 信息增益

2.2.1 定义和公式

定义与公式
特征A对训练数据集D的信息增益g(D,A),定义为集合D的信息熵H(D)与特征A给定条件下D的信息条件熵H(D|A)之差,即公式为:
image
公式的详细解释:

image

注:信息增益表示得知特征X的信息而息的不确定性减少的程度使得类Y的信息熵减少的程度

2.2.2 贷款特征重要计算

image

我们以年龄特征来计算:

1、g(D, 年龄) = H(D) -H(D|年龄) = 0.971-[5/15H(青年)+5/15H(中年)+5/15H(老年]

2、H(D) = -(6/15log(6/15)+9/15log(9/15))=0.971

3、H(青年) = -(3/5log(3/5) +2/5log(2/5))
H(中年)=-(3/5log(3/5) +2/5log(2/5))
H(老年)=-(4/5og(4/5)+1/5log(1/5))

我们以A1、A2、A3、A4代表年龄、有工作、有自己的房子和贷款情况。最终计算的结果g(D, A1) = 0.313, g(D, A2) = 0.324, g(D, A3) = 0.420,g(D, A4) = 0.363。所以我们选择A3 作为划分的第一个特征。这样我们就可以一棵树慢慢建立

2.3 基尼系数

基尼系数是1减去所有概率的平方
image
在上面的例子就是
image
image
我们会发现当一定会被批准或者拒绝的时候他的Gini系数等于0,当他是平均的时候最大,所以我们只需要找这个Gini最小的来做下一级分类的标准就可以。
然后我们看这个例子:
image
image
image

2.4决策树的三种算法实现

当然决策树的原理不止信息增益这一种,还有其他方法。但是原理都类似,我们就不去举例计算。
ID3
信息增益 最大的准则
C4.5
信息增益比 最大的准则
CART
分类树: 基尼系数 最小的准则 在sklearn中可以选择划分的默认原则
优势:划分更加细致(从后面例子的树显示来理解)

3.决策树的API

决策树API
class sklearn.tree.DecisionTreeClassifier(criterion=’gini’, max_depth=None,random_state=None)
决策树分类器
criterion:默认是’gini’系数,也可以选择信息增益的熵’entropy’
max_depth:树的深度大小
random_state:随机数种子
其中会有些超参数:max_depth:树的深度大小
其它超参数我们会结合随机森林讲解

用决策树的时候不需要特征工程:
1.获取数据集
2.划分数据集
3.决策树预估器
4.模型评估

4决策树对鸢尾花进行分类

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import GridSearchCV
from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.tree import DecisionTreeClassifier
def decision_iris():
    """
    用决策树对鸢尾花进行分类
    :return:
    """
    # 1)获取数据集
    iris = load_iris()

    # 2)划分数据集
    x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=22)

    # 3)决策树预估器
    estimator = DecisionTreeClassifier(criterion="entropy")
    estimator.fit(x_train, y_train)

    # 4)模型评估
    # 方法1:直接比对真实值和预测值
    y_predict = estimator.predict(x_test)
    print("y_predict:\n", y_predict)
    print("直接比对真实值和预测值:\n", y_test == y_predict)

    # 方法2:计算准确率
    score = estimator.score(x_test, y_test)
    print("准确率为:\n", score)



    return None

image

我们发现没有CNN准确率强,是因为其CNN适合于小数据

4决策树可视化处理

保存树的结构到dot文件

1、sklearn.tree.export_graphviz() 该函数能够导出DOT格式
tree.export_graphviz(estimator,out_file='tree.dot’,feature_names=[‘’,’’])
导出的dot文件,打开这个网址http://webgraphviz.com/ 复制进去进去dot就可以显示树的结构

# 可视化决策树
export_graphviz(estimator, out_file="iris_tree.dot", feature_names=iris.feature_names)

image

5.总结

优点:
简单的理解和解释,树木可视化。
缺点:
决策树学习者可以创建不能很好地推广数据的过于复杂的树,这被称为过拟合。
改进:
减枝cart算法(决策树API当中已经实现,随机森林参数调优有相关介绍)
随机森林

6.泰坦尼克号案例分析

1)获取数据
2)数据处理
缺失值处理
特征值->字典类型(比较号提取特征)
3)准备好特征值 目标值
4)划分数据集
5)特征工程:字典特征提取
6)决策树预估器流程
7)模型评估

def decisioncls():
    """
    决策树进行乘客生存预测
    :return:
    """
    # 1、获取数据
    titan = pd.read_csv("http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt")

    # 2、数据的处理
    x = titan[['pclass', 'age', 'sex']]

    y = titan['survived']

    # print(x , y)
    # 缺失值需要处理,将特征当中有类别的这些特征进行字典特征抽取
    x['age'].fillna(x['age'].mean(), inplace=True)

    # 对于x转换成字典数据x.to_dict(orient="records")
    # [{"pclass": "1st", "age": 29.00, "sex": "female"}, {}]

    dict = DictVectorizer(sparse=False)

    x = dict.fit_transform(x.to_dict(orient="records"))

    print(dict.get_feature_names())
    print(x)

    # 分割训练集合测试集
    x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3)

    # 进行决策树的建立和预测
    dc = DecisionTreeClassifier(max_depth=5)

    dc.fit(x_train, y_train)

    print("预测的准确率为:", dc.score(x_test, y_test))

    return None

image

image
image
image
image

可以看一下这个视频,帮助理解决策树算法

posted @ 2023-06-10 20:28  哎呦哎(iui)  阅读(48)  评论(0编辑  收藏  举报