美文网首页
0#05决策树

0#05决策树

作者: dogo_L1L | 来源:发表于2018-09-16 11:26 被阅读0次

    0x00 数据准备

    我们还是使用之前得那个气球模型,用来笔算

    黄色,小,成人,用手打,不爆炸
    黄色,小,成人,用脚踩,爆炸
    黄色,小,小孩,用手打,不爆炸
    黄色,小,小孩,用脚踩,不爆炸
    黄色,大,成人,用手打,爆炸
    黄色,大,成人,用脚踩,爆炸
    黄色,大,小孩,用手打,不爆炸
    黄色,大,小孩,用脚踩,爆炸
    紫色,小,成人,用手打,不爆炸
    紫色,小,小孩,用手打,不爆炸
    紫色,大,成人,用脚踩,爆炸
    紫色,大,小孩,用脚踩,爆炸
    

    或者使用make_blobs自动生成一些聚类数据:

    %matplotlib inline
    import numpy as np
    import matplotlib.pyplot as plt
    import seaborn as sns;sns.set()
    
    from sklearn.datasets import make_blobs
    """
    n_samples:样本点的个数
    
    n_features:每个样本的特征数
    
    centers:聚类的类数
    
    cluster_std:聚类得标准差
    
    center_box:据类点生成的范围
    
    shuffle:洗牌
    
    random_state:随机数种子
    
    """
    X,y = make_blobs(n_samples=300,centers=4,random_state=0,cluster_std=1.0)
    plt.scatter(X[:,0],X[:,1],c=y,s=50,cmap='rainbow')
    

    0x01 笔算机器学习

    1.先将输入的字符串进行数据化
    数据化后

    0,0,0,0,0
    0,0,0,1,1
    0,0,1,0,0
    0,0,1,1,0
    0,1,0,0,1
    0,1,0,1,1
    0,1,1,0,0
    0,1,1,1,1
    1,0,0,0,0
    1,0,1,0,0
    1,1,0,1,1
    1,1,1,1,1
    
    1. 决策树得算法
      决策数是一棵树,所以就相当与对数据进行分类,为了方便理解,手算得时候不使用数据化后得内容.
    对于原始数据
        6个爆炸
        6个不爆炸
        
    第一次分类:(按颜色分类)
        黄色中:
            4不爆炸
            4爆炸
                第二次分类:(大小)
                小中:
                    3不爆炸
                    1爆炸
                        第三次分类:(年龄)
                        成人中:
                            1不
                            1爆炸
                                第四次分类:(操作)
                                用手打中:
                                    1不爆炸
                                    (结束)
                                用脚中:
                                    1爆炸
                                    (结束)
                        小孩中:
                            2不爆炸
                            (结束)
                大中:
                    3爆炸
                    1不爆炸
                        第三次分类:(年龄)
                        成人中:
                            2爆炸
                            (结束)
                                
                        小孩中:
                            1不爆炸
                            1爆炸
                                第四次分类:(操作)
                                    用手打中:
                                        1不爆炸
                                        (结束)
                                    用脚中:
                                        1爆炸
                                        (结束)
        紫色中:
            4不爆炸
            4爆炸
                第二次分类:(大小)
                小中:
                    2不爆炸
                    (结束)
                大中:
                    2爆炸
                    (结束)
    

    很明显只是一次次得分类,但是知道分类结果只剩下单一得爆炸或者不爆炸为止.
    画出原理图:


    决策树.png

    笔算就这样结束了,但是这个只是一个普通得决策树.
    比如说:
    为什么颜色是第一次区分?
    明显得颜色对这次并没有任何得帮助,我却用来作为第一次区分,明显增加了分类得层数.
    所以为了决定区分得顺序,决策树有很多种算法,最有名得是
    C4.5,CART和ID3.
    其中最大得区别就是决定顺序得方式.
    CART是利用gini函数

    ID3是利用gain函数


    信息熵.png

    C4.5 是利用 gain ratio(信息增益率)
    信息熵的差值:
    含有某种元素下的信息熵与不考虑该条件得信息熵

    0x03 使用决策树

    %matplotlib inline
    import numpy as np
    import matplotlib.pyplot as plt
    import seaborn as sns;sns.set()
    
    from sklearn.datasets import make_blobs
    """
    n_samples:样本数量
    centers:聚类中类的个数
    random_state:随机数得种子
    cluster_std:每个类得标准差
    """
    X,y = make_blobs(n_samples=300,centers=4,random_state=0,cluster_std=1.0,center_box=(-10,10))
    plt.scatter(X[:,0],X[:,1],c=y,s=50,cmap='rainbow')
    
    # 是用决策树进行训练
    from sklearn.tree import DecisionTreeClassifier
    """
    criterion:  使用的算法
                "gini"表示是用Gini函数,即CART算法
                "entropy"表示信息熵,即ID3算法
    splitter:分类器,
                best表示是用最好得分类器
                random表示是用随机得分类器 
    max_depth:树的最大深度。
            如果没有,那么节点增加,
            直到所有的叶子是纯
            或直到所有叶中含有比min_samples_split样本较少
    min_samples_split:分裂内部节点所需的样本的最小数目
    min_samples_leaf:是在叶节点所需的样本的最小数目
                        用来防止过拟合
    """
    tree = DecisionTreeClassifier().fit(X,y)
    
    # 可视化函数
    def visualize_classifier(model,X,y,ax=None,cmap='rainbow'):
        #gca将figure转为axis
        ax = ax or plt.gca()
        ax.scatter(X[:,0],X[:,1],c=y,s=30,cmap=cmap,clim=(y.min(),y.max()),zorder=3)
        ax.axis('tight')
        ax.axis('off')
        #获取(xmin,xmax)
        xlim=ax.get_xlim()
        ylim=ax.get_ylim()
        model.fit(X,y)
        #*xlim表示这个中还有多个参数,即:
        #linspace中得   start=xlim的xmin
        #              stop=xlim的xmax
        xx,yy = np.meshgrid(np.linspace(*xlim,num=200),np.linspace(*ylim,num=200))
        #ravel将矩阵转为向量
        #c_将2个向量和并为一个2D的坐标矩阵
        Z=model.predict(np.c_[xx.ravel(),yy.ravel()]).reshape(xx.shape)
        n_classes = len(np.unique(y))
        """
        画出等高线
        x,y:z的坐标
        z:结果
        alpha:透明度
        levels:等高线得值
                int:绘制 n+1得轮廓线
                阵列:绘制制定得轮廓线的颜色
                要在vmin和vmax之间
        cmap:调色板
        vmin:颜色的最大值
        vmax:颜色得最小值
        """
        contours=ax.contourf(xx,yy,Z,alpha=0.3,levels=np.arange(n_classes+1)-0.5,cmap=cmap,clim=(y.min(),y.max()),zorder=1)
        ax.set(xlim=xlim,ylim=ylim)
    
    #调用可视化函数
    visualize_classifier(DecisionTreeClassifier(),X,y)
    
    决策树的图形化.png

    相关文章

      网友评论

          本文标题:0#05决策树

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