zoukankan      html  css  js  c++  java
  • 用决策树(CART)解决iris分类问题

    首先先看Iris数据集

    Sepal.Length——花萼长度 Sepal.Width——花萼宽度

    Petal.Length——花瓣长度 Petal.Width——花瓣宽度

    通过上述4中属性可以预测花卉属于Setosa,Versicolour,Virginica 三个种类中的哪一类

    决策树 by CART

    决策树有挺多种,这里讲下CART

    CART的执行过程是这样的:

    1. 用特征值k和下限tk二分子集
    2. 不断二分,直到到达最大深度或者划分不能再减少不纯度为止

    这一下sklearn都会自动帮我们完成,我们调用就行了

    如何避免过拟合问题

    减小最大深度等等

    一个tip:

    ​ min_* 的调大

    ​ max_*的调小

    ​ 就是DecisionTreeClassifier里面的参数,具体看文档_(:з」∠)_

    损失函数的比较

    sklearn提供了两种损失函数gini和entropy

    gini是通过计算每个节点的不纯度,具体公式如下↓

    (J(k,t_k) = frac{m_{left}}{m}G_{left} + frac{m_{right}}{m}G_{right})

    entropy在这里就不再赘述了

    sklearn默认的是调用gini,因为gini的速度会快点,而且两者最后的效果是差不多的,真要比的话entropy产生的决策树会更平衡点

    接下来我们来看代码

    from sklearn.datasets import load_iris
    from sklearn.tree import DecisionTreeClassifier
    import numpy as np
    
    iris = load_iris()
    X = iris.data[:, 2:] # petal length and width
    y = iris.target		#目标值
    
    tree_clf = DecisionTreeClassifier(max_depth=2, random_state=42)	#定义最大深度和确定随机种子
    tree_clf.fit(X, y)	#训练
    print(tree_clf.predict_proba([[5, 1.5]]))	#预测返回的是可能性
    
    #以上代码运行后将会产生如下输出 [[ 0.          0.90740741  0.09259259]]
    #分别代表属于每一种类别可能的概率
    #也可以用如下代码
    print(tree_clf.predict[[5,1.5]])	#直接输出属于哪一类
    

    看下上面生成的决策树的样子

    注:

    ​ valuse是它划分到各个类的数量

    ​ samples 指的是当前节点的数据个数

    ​ 从左表橙色的点可以看出,gini=0意味着划分到了相同的类别里面

    ps.以上代码及图片来自《Hands-On Machine Learning with Scikit-Learn》一书

    如需转载请注明出处

    喜欢要不支持下(:з」∠)

  • 相关阅读:
    用C++发邮件
    python打包程序py2exe实战
    分享:Python: 数据分析资源
    Socket传输文件时进行校验(简单解决TCP粘包问题)
    第二回 基类的架造方法应该为子类想的多一些
    第一回 要想知道为什么抽象出基类,应该先对基类有一个比较明确的认识
    树型结构~无限级联下拉列表框
    为什么我要将数据库上下文进行抽象,为它生产一个基类有用吗~目录
    将不确定变为确定~真的是SqlDataReader引起的超时?
    张学友 《她来听我的演唱会》
  • 原文地址:https://www.cnblogs.com/MartinLwx/p/9162300.html
Copyright © 2011-2022 走看看