Python3入门机器学习 - 决策树

作者: c6ad47dbfc82 | 来源:发表于2018-03-17 00:21 被阅读30次

    信息熵



    左式的信息熵较高,代表左式的不确定性更强,左式即指数据有三个类别,每个类别占1/3
    右式的信息熵为0,是信息熵可以达到的最小值,代表数据的不确定性最低,即最确定

    绘制决策树的决策边界


    import numpy as np
    import matplotlib.pyplot as plt
    from sklearn import datasets
    
    iris = datasets.load_iris()
    X = iris.data[:,2:]
    y = iris.target
    
    from sklearn.tree import DecisionTreeClassifier
    #criterion="entropy"代表使用信息熵进行划分
    dt_clf = DecisionTreeClassifier(max_depth=2, criterion="entropy")
    dt_clf.fit(X,y)
    
    plot_decision_boundary(dt_clf,axis=[0.5,7.5,0,3])
    plt.scatter(X[y==0,0],X[y==0,1])
    plt.scatter(X[y==1,0],X[y==1,1])
    plt.scatter(X[y==2,0],X[y==2,1])
    plt.show()
    

    使用信息熵寻找最优划分


    from collections import Counter
    from math import log
    
    def split(X,y,d,value):
        index_a = (X[:,d]<=value)
        index_b = (X[:,d]>value)
        return X[index_a],X[index_b],y[index_a],y[index_b]
    
    def entropy(y):
        counter = Counter(y)
        res = 0.0
        for num in counter.values():
            p = num/len(y)
            res += -p*log(p)
        return res
    
    def try_split(X,y):
        
        best_entropy = float('inf')
        best_d,best_v = -1,-1
        
        for d in range(X.shape[1]):
            sorted_index = np.argsort(X[:,d])
            for i in range(1,len(X)):
                if(X[sorted_index[i-1],d]!=X[sorted_index[i],d]):
                    v = (X[sorted_index[i-1],d]+X[sorted_index[i],d])/2
                    X_l,X_r,y_l,y_r = split(X,y,d,v)
                    e = entropy(y_l)+entropy(y_r)
                    if e<best_entropy:
                        best_entropy,best_d,best_v = e,d,v
        return  best_entropy,best_d,best_v
    
    try_split(X,y)
    >>> (0.6931471805599453, 0, 2.45)  #对于第一次划分,得到的信息熵为0.36,是在第0个维度上的2.45处划分的结果
    
    best_entropy,best_d,best_v = try_split(X,y)
    X_l,X_r,y_l,y_r = split(X,y,best_d,best_v)
    entropy(y_l)   #划分结果的y_l信息熵为0,不能继续划分,但我们可以对y_r继续划分
    >>> 0.0
    
    try_split(X_r,y_r)
    >>> (0.4132278899361904, 1, 1.75)
    

    使用基尼系数进行划分


    基尼系数的划分整体和信息熵是一样的,只是使用计算的公式不同


    基尼系数计算公式
    def entropy(y):
        counter = Counter(y)
        res = 1.0
        for num in counter.values():
            p = num/len(y)
            res -= p**2
        return res
    #try_split逻辑和信息熵划分完全一样
    

    决策树的超参数


    #在创建对象的时候,如果不传参数,那么默认会划分到所有分类的基尼系数都为0
    dec_clf = DecisionTreeClassifier()
    dec_clf.fit(X,y)
    plot_decision_boundary(dec_clf,[-1.5,2.5,-1.0,1.5])
    plt.scatter(X[y==0,0],X[y==0,1])
    plt.scatter(X[y==1,0],X[y==1,1])
    plt.show()
    
    过拟合
    • max_depth #最大深度
    • min_samples_split #对于节点来说至少有多少个样本数据
    • min_samples_leaf #对于叶子节点至少要几个样本
    • max_leaf_nodes #最多有多少个叶子节点
    CART决策树的超参数

    决策树解决回归问题


    决策树解决回归问题的思路是,将每个叶子节点内所有样本数据的平均值作为预测结果。

    相关文章

      网友评论

        本文标题:Python3入门机器学习 - 决策树

        本文链接:https://www.haomeiwen.com/subject/mvwkqftx.html