机器学习学习笔记(七)之决策树

一、决策树

  • 如何高效的进行决策?特征的先后顺序

二、信息熵

  • 香农:信息是消除随机不定性的东西

  • 定义:H的专业术语称之为信息熵,单位为比特
    在这里插入图片描述

三、决策树的划分依据之一 ——信息增益

  • 定义与公式:
    • 特征A对训练数据集D的信息增益g(D,A)定义为集合D的信息熵H(D)与特征A给定条件下D的信息条件熵H(D|A)之差,即公式为在这里插入图片描述
      在这里插入图片描述
  • 当然决策树的原理不止信息增益这一种,还有其他方法,但是原理都类似
    • ID3:信息增益最大的准则
    • C4.5:信息增益比最大的准则
    • CART:
      • 分类树:基尼系数最小的准则,在sklearn中可以选择划分的默认原则
      • 优势:划分更加细致

四、决策树API

  • sklearn.tree.DecisionTreeClassifier(criterion = ‘gini’,max_depth = None,random_state = None)
    • 决策树分类器
    • criterion:决策树划分依据,默认是’gini’系数,也可以选择信息增益的熵’entropy’
    • max_depth:树的深度大小
    • random_state:随机数种子

五、案例

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
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)
    # 训练集的特征值x_train 测试集的特征值 x_test 训练集的目标值y_train 测试集的目标值y_test

    # 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

if __name__=='__main__':
    decision_iris()

运行结果:
y_predict:
 [0 2 1 2 1 1 1 1 1 0 2 1 2 2 0 2 1 1 1 1 0 2 0 1 2 0 2 2 2 1 0 0 1 1 1 0 0
 0]
直接比对真实值和预测值:
 [ True  True  True  True  True  True  True False  True  True  True  True
  True  True  True  True  True  True False  True  True  True  True  True
  True  True  True  True  True False  True  True  True  True  True  True
  True  True]
准确率为:
 0.9210526315789473

六、决策树可视化

1、保存树的结构到dot文件

  • sklearn.tree.export_graphviz() 该函数能够导出DOT格式
    • tree.export_graphviz(estimator,out_file=‘tree.dot’,feature_names=[’ ‘,’ '])
from sklearn.tree import export_graphviz   
    
#可视化决策树
export_graphviz(estimator,out_file='iris_tree.dot',feature_names=iris.feature_names)

2、网站显示结构

七、决策树总结

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

八、集成学习方法之随机森林

  • 随机森林:是一个包含多个决策树的分类器,并且其输出的类别是由个别树输出的类别的众数决定
  • sklearn.ensemble.RandomForestClassifier(n_estimators=10, criterion=’gini’, max_depth=None, bootstrap=True, random_state=None, min_samples_split=2)
    • 随机森林分类器
    • n_estimators:integer,optional(default = 10)森林里的树木数量120,200,300,500,800,1200
    • Criterion:string,可选(default =“gini”)分割特征的测量方法
    • max_depth:integer或None,可选(默认=无)树的最大深度 5,8,15,25,30
    • max_features="auto”,每个决策树的最大特征数量
      • If “auto”, then max_features=sqrt(n_features).
      • If “sqrt”, then max_features=sqrt(n_features)(same as “auto”).
      • If “log2”, then max_features=log2(n_features).
      • If None, then max_features=n_features.
    • bootstrap:boolean,optional(default = True)是否在构建树时使用放回抽样
    • min_samples_split:节点划分最少样本数
    • min_samples_leaf:叶子节点的最小样本数
  • 超参数:n_estimator, max_depth, min_samples_split,min_samples_leaf
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV

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)
    # 训练集的特征值x_train 测试集的特征值 x_test 训练集的目标值y_train 测试集的目标值y_test

    # 3、决策树预估器
    estimator = RandomForestClassifier()

    # 加入网格搜索与交叉验证
    # 参数准备
    param_dict = {'n_estimators': [120, 200, 300, 500, 800, 1200],'max_depth':[5,8,15,25,30]}
    estimator = GridSearchCV(estimator, param_grid=param_dict, cv=3)
    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)

    # 最佳参数:best_paramas_
    print('最佳参数:\n', estimator.best_params_)
    # 最佳结果:best_score_
    print('最佳结果:\n', estimator.best_score_)
    # 最佳估计器:best_estimator_
    print('最佳估计器:\n', estimator.best_estimator_)
    # 交叉验证结果:cv_results_
    print('交叉验证结果:\n', estimator.cv_results_)

    return None

if __name__=='__main__':
    decision_iris()


运行结果:
y_predict:
 [0 2 1 2 1 1 1 1 1 0 2 1 2 2 0 2 1 1 1 1 0 2 0 1 2 0 2 2 2 2 0 0 1 1 1 0 0
 0]
直接比对真实值和预测值:
 [ True  True  True  True  True  True  True False  True  True  True  True
  True  True  True  True  True  True False  True  True  True  True  True
  True  True  True  True  True  True  True  True  True  True  True  True
  True  True]
准确率为:
 0.9473684210526315
最佳参数:
 {'max_depth': 5, 'n_estimators': 120}
最佳结果:
 0.9551920341394026
最佳估计器:
 RandomForestClassifier(bootstrap=True, ccp_alpha=0.0, class_weight=None,
                       criterion='gini', max_depth=5, max_features='auto',
                       max_leaf_nodes=None, max_samples=None,
                       min_impurity_decrease=0.0, min_impurity_split=None,
                       min_samples_leaf=1, min_samples_split=2,
                       min_weight_fraction_leaf=0.0, n_estimators=120,
                       n_jobs=None, oob_score=False, random_state=None,
                       verbose=0, warm_start=False)
交叉验证结果:

RF的主要优点有:

1) 训练可以高度并行化,对于大数据时代的大样本训练速度有优势。个人觉得这是的最主要的优点。

2) 由于可以随机选择决策树节点划分特征,这样在样本特征维度很高的时候,仍然能高效的训练模型。

3) 在训练后,可以给出各个特征对于输出的重要性

4) 由于采用了随机采样,训练出的模型的方差小,泛化能力强。

5) 相对于Boosting系列的Adaboost和GBDT, RF实现比较简单。

6) 对部分特征缺失不敏感。

RF的主要缺点有:

1)在某些噪音比较大的样本集上,RF模型容易陷入过拟合。

2) 取值划分比较多的特征容易对RF的决策产生更大的影响,从而影响拟合的模型的效果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值