基本算法分类决策树,基础

发表时间:2020-05-15

分类决策树算法原理

分类决策树算法概述

决策树是其他算法的基础,是一个基学习器,是高级算法的基础

在这里插入图片描述

决策树其实是模拟了人决策的过程。
根节点:第一个节点(如房产)
非叶节点:中间节点(如车辆、年收入)
一步一步:逐步判断
叶节点:最终结果(可以贷款1、不可以贷款0)

在这里插入图片描述

决策树分类标准

分类标准有哪些和参考博客

参考博客:张小瓜
参考博客:信息增益比 vs 信息增益

在这里插入图片描述

在这里插入图片描述

1、ID3算法–>熵
2、C4.5算法–>信息增益率
3、CART决策树–>基尼系数

先理解熵的计算

熵值衡量标准和计算公式

在这里插入图片描述

p∈[0,1], log p∈(-∞,0], 那么p*log p是一个复数,因此在前面加符号,使熵值为正。

熵值的手算实例

在这里插入图片描述

log2(2/10):第一个2是底
A集合相当于专卖店
B集合相当于杂货店

1、 ID3算法–>信息增益

ID3算法的手算实例

在这里插入图片描述
以是否出去打球为例子:
outlook:天气情况
temperature: 温度情况
humidity:湿度信息
windy:刮风情况
play:是否去打球

第一遍遍历:是否出去打球的熵

在这里插入图片描述

后面的图查看我自己的word文档

ID3算法的总结

在这里插入图片描述
**信息增益的核心思想:**信息增益越大,说明该特征对减少样本的不确定性程度的能力越大,也就代表这个特征越好。
取数?=频数

2、 C4.5算法–>信息增益率

C4.5算法的手算实例

在这里插入图片描述

在这里插入图片描述

C4.5算法的总结

在这里插入图片描述
因此, 熵值较小的特征带来的收益比较大。

3、 CART决策树–>基尼系数

CART算法的手算实例

CART算法的总结

在这里插入图片描述

在这里插入图片描述

决策树剪枝和优缺点介绍

决策树的剪枝

在这里插入图片描述

决策树很容易过拟合,所以剪枝很重要。
预剪枝:边建立树边剪
后剪枝:建立了决策树之后才剪,比较慢和消耗计算机(所以用的比较少)

在这里插入图片描述

1、限制树的深度

假设n个样本丢进决策树,到了第5层左边两个叶子节点分别有1个和2个,第四层最左边中间节点就是 3个,第3层最左边中间节点有10个,那么第四层和第五层的样本数太少了,泛化能力就比第三层弱很多,所以可以去掉。

2、限制叶子节点的个数和叶子节点的样本数

假设n样本丢进决策树,在第三层设置向下’分裂‘的阈值是20,就保证了第三层节点的样本个数。

3、基尼系数阈值

为基尼系数设定阈值,如果基尼系数低于某个阈值就不向下”分裂“

决策树优缺点

优点

1、容易可视化
2、决策树对缺失值不敏感,逻辑回归则比较敏感
3、作为基学习器,构成高级算法

缺点

1、决策树类别较多时候,错误率增加的会比较快,不利于多分类。不过一般情况下都是二分类问题
2、过拟合问题较难调教

代码实战

决策树API参数详解

电信用户流失预测

"""
电信用户流失预测
"""
import pandas as pd
#可视化混淆矩阵
def cm_plot(y,yp):
    from sklearn.metrics import confusion_matrix
    import matplotlib.pyplot as plt
    
    cm = confusion_matrix(y, yp)
    plt.matshow(cm, cmap=plt.cm.Blues)
    plt.colorbar()
    for x in range(len(cm)):
        for y in range(len(cm)):
            plt.annotate(cm[x,y],xy=(y,x),horizontalalignment='center',
                         verticalalignment='center')
            plt.ylabel('True label')
            plt.xlabel('Predicted label')
    return plt

datas = pd.read_excel(r'/Users/dx/Desktop/Python数据分析与机器学习/8.决策树之分类树/决策树算法/决策树/电信客户流失数据.xlsx')

#将变量结果划分开
data = datas.ix[:,:-1]
target =datas.ix[:,-1]

'''
导入模块对数据进行切分
'''
from sklearn.model_selection import train_test_split
data_train, data_test, target_train, target_test = \
    train_test_split(data,target,test_size = 0.2, random_state = 0)
    
# 定义决策树
from sklearn import tree
# 使用基尼系数衡量,最大树深6
dtr = tree.DecisionTreeClassifier(criterion = 'gini', max_depth = 6,
                                  random_state = 42)
dtr.fit(data_train, target_train)


'''
训练集预测和混淆矩阵
'''
train_predicted = dtr.predict(data_train)
from sklearn import metrics
print(metrics.classification_report(target_train, train_predicted))
cm_plot(target_train, train_predicted).show()


'''
测试集预测和混淆矩阵
'''
test_predicted = dtr.predict(data_test)
print(metrics.classification_report(target_test, test_predicted))
cm_plot(target_test, test_predicted).show()
dtr.score(data_test, target_test)

'''
决策树可视化:
修改dtr为自己的变量名
修改feature_name为自己的数据
最终生成一个.dot
'''
#将数据打包
dot_data = \
    tree.export_graphviz(
            dtr,
            out_file = None,
            feature_names = data.columns,
            filled = True,
            impurity = False,
            rounded = True
    )

'''
导入pydotplus库解读.dot文件
只用修改颜色“#FFF2DD”
'''
import pydotplus

graph = pydotplus.graph_from_dot_data(dot_data)
graph.get_nodes()[7].set_fillcolor('#FFF2DD')

from IPython.display import Image
Image(graph.create_png())#生成图片

#导出决策树图
graph.write_png('dtr.png')  

训练集和测试集预测结果中中recall分别为0.57和0.45,所以模型不好,存在过拟合,所以需要改进

电信用户流失预测改进

修改min_samples_leaf和max_depth,最佳参数需要不断试验,用起来比较麻烦,所以决策树都是作为基学习器使用。

"""
电信用户流失预测
"""
import pandas as pd
#可视化混淆矩阵
def cm_plot(y,yp):
    from sklearn.metrics import confusion_matrix
    import matplotlib.pyplot as plt
    
    cm = confusion_matrix(y, yp)
    plt.matshow(cm, cmap=plt.cm.Blues)
    plt.colorbar()
    for x in range(len(cm)):
        for y in range(len(cm)):
            plt.annotate(cm[x,y],xy=(y,x),horizontalalignment='center',
                         verticalalignment='center')
            plt.ylabel('True label')
            plt.xlabel('Predicted label')
    return plt

datas = pd.read_excel(r'/Users/dx/Desktop/Python数据分析与机器学习/8.决策树之分类树/决策树算法/决策树/电信客户流失数据.xlsx')

#将变量结果划分开
data = datas.iloc[:,:-1]
target =datas.iloc[:,-1]

'''
导入模块对数据进行切分
'''
from sklearn.model_selection import train_test_split
data_train, data_test, target_train, target_test = \
    train_test_split(data,target,test_size = 0.2, random_state = 0)
    
# 定义决策树
from sklearn import tree
# 使用基尼系数衡量,最大树深6
#可以设置叶子节点最少样本数提高recall
#要找到最佳参数,需要自己多次试验
dtr = tree.DecisionTreeClassifier(criterion = 'gini', max_depth = 10,
                                  min_samples_leaf = 5,
                                  random_state = 42)
dtr.fit(data_train, target_train)


'''
训练集预测和混淆矩阵
'''
train_predicted = dtr.predict(data_train)
from sklearn import metrics
print(metrics.classification_report(target_train, train_predicted))
cm_plot(target_train, train_predicted).show()


'''
测试集预测和混淆矩阵
'''
test_predicted = dtr.predict(data_test)
print(metrics.classification_report(target_test, test_predicted))
cm_plot(target_test, test_predicted).show()
dtr.score(data_test, target_test)

'''
决策树可视化:
修改dtr为自己的变量名
修改feature_name为自己的数据
最终生成一个.dot
'''
#将数据打包
dot_data = \
    tree.export_graphviz(
            dtr,
            out_file = None,
            feature_names = data.columns,
            filled = True,
            impurity = False,
            rounded = True
    )

'''
导入pydotplus库解读.dot文件
只用修改颜色“#FFF2DD”
'''
import pydotplus

graph = pydotplus.graph_from_dot_data(dot_data)
graph.get_nodes()[7].set_fillcolor('#FFF2DD')

from IPython.display import Image
Image(graph.create_png())#生成图片

#导出决策树图
graph.write_png('dtr.png')   
#如果老版本Graphviz不支持中文,因此要把列名改为英文,就可以在导出的图片中显示了    

文章来源互联网,如有侵权,请联系管理员删除。邮箱:417803890@qq.com / QQ:417803890

微配音

Python Free

邮箱:417803890@qq.com
QQ:417803890

皖ICP备19001818号-4
© 2019 copyright www.pythonf.cn - All rights reserved

微信扫一扫关注公众号:

联系方式

Python Free