阿喽哈~小伙伴们,今天我们来唠一唠决策树 ♣ ♣ ♣

决策树应该是很多小伙伴入门机器学习的时候最先接触到的分类算法之一,决策树分为分类树和回归树,今天我们只说分类树~

简单回顾一下分类树的算法原理:分类树的底层算法分为三种,分别是ID3, C4.5和CART树。

  • ID3算法以信息增益来决定每一次分裂的节点,它不能处理连续型变量,也不可以剪枝;
  • C4.5算法为了克服ID3算法的弊端(信息增益倾向划分拥有较多属性的特征,举个极端的例子:比如身份证号列),以信息增益率来决定划分的特征节点,它可以处理连续变量(二分法),也可以进行简单的剪枝;
  • 以上两种算法只能做分类算法,不可以做回归算法,CART算法可以做分类也可以做回归,做分类问题时,以GINI系数为标准,决定划分的节点,可以处理连续变量,可以剪枝。

具体更深入的算法原理这里就不多说啦,本篇的重点是演示如何使用Sklearn实现分类树以及简单的调参,上代码~

1、导入各种包

一般在敲代码之前可以先导入需要用到的包,这样代码比较好看,而且也方便管理,是一个良好的编码习惯哦

import pandas as pd
import numpy as np
import seaborn as snsfrom sklearn import tree  # 导入模型
from sklearn.model_selection import train_test_split  # 制作数据集和测试集
from sklearn.preprocessing import OrdinalEncoder
import graphviz
from sklearn.metrics import roc_curve, aucimport matplotlib.pyplot as plt
%matplotlib inline
plt.rcParams['font.size'] = 24

2、数据准备

为了方便大家代码复现,本次使用的是python自带的泰坦尼克号生还数据集,共981个样本,特征涉及性别、年龄、船票价格、是否有同伴等等,标签列有两个,分别是‘survived’和‘alive’,都表示该乘客是否生还,所以我们取一列就可以了

data = sns.load_dataset('titanic')  # 导入泰坦尼克号生还数据
data

3、数据预处理

首先进行数据的预处理,首先可以看到‘deck’列存在缺失值,我们可以看看总体数据缺失的情况

data.replace(to_replace=r'^\s*$', value=np.nan, regex=True, inplace=True)   # 把各类缺失类型统一改为NaN的形式
data.isnull().mean()

共4列数据存在缺失值,‘deck’缺失率超过70%,予以删除,剩余特征的缺失值使用其均值或是众数进行填补

细心地童鞋可能发现了有好几列重复的特征,‘embarked’和‘embark_town’都表示出发港口,‘sex’、‘who’、‘adult_male’都表示性别,‘pclass’和‘class’都是船票类型,‘sibsp’和‘alone’都表示是否有同伴,对于这几个特征,所以我们保留其中一个就可以了

del data['deck']   # 删除‘deck’列
del data['who']
del data['adult_male']
del data['class']
del data['alone']data['age'].fillna(np.mean(data.age), inplace=True)   # 年龄特征使用均值对缺失值进行填补
data['embarked'].fillna(data['embarked'].mode(dropna=False)[0], inplace=True)   # 文本型特征视同众数进行缺失值填补x = data.drop(['alive', 'survived', 'embark_town'], axis=1)   # 取出用于建模的特征列X
label = data['survived']   # 取出标签列Y

sklean中的决策树算法是无法进行字符串的处理的,所以要先进行数据编码,这里我们就使用最简单的特征编码,转化完毕后特征全部变为数值型

oe = OrdinalEncoder()   # 定义特征转化函数# 把需要转化的特征都写进去
x[['sex', 'embarked']] = oe.fit_transform(x[['sex', 'embarked']])
x.head()

# 划分训练集、测试集
xtrain, xtest, ytrain, ytest = train_test_split(x, label, test_size=0.3)
xtrain.head()

ok,现在可以把我们的数据集扔进决策树算法去跑一跑啦

4、训练模型

"""
# sklearn封装的决策树算法及所有超参数
sklearn.tree.DecisionTreeclassifier (criterion=gini, splitter='best', max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features=None, random _state=None, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, class_weight=None, presort=False)
"""

决策树的剪枝操作可以很好地防止模型过拟合,因为在用训练集训练模型时,如果不控制决策树的深度或叶子结点个数等参数,树就会一直生长下去,直到每个结点都无法再划分下去,算法才会停止,这时候模型在训练集上的预测精度会很高,但是会把训练集中的随机因素或是噪音点都当做信息学习到模型里,这样我们的模型就会过于片面,面对其他数据集的时候可能预测能力会很差。

接下来我会训练两个模型,同样的数据集,第一个不剪枝,第二个进行剪枝处理,然后在测试集上测试预测精度,让我看一看两个模型的精度如何吧~

lf = tree.DecisionTreeClassifier(class_weight='balanced', max_depth=None)# 载入决策树分类模型
clf = clf.fit(xtrain, ytrain)   # 决策树拟合,得到模型
score = clf.score(xtest, ytest)   #返回预测的准确度clf_new = tree.DecisionTreeClassifier(class_weight='balanced', max_depth=10)   # 载入决策树分类模型
clf_new = clf_new.fit(xtrain, ytrain)   # 决策树拟合,得到模型
score_new = clf_new.score(xtest, ytest)   #返回预测的准确度print(" 决策树_未剪枝:{} \n".format(score), "决策树_剪枝:{}".format(score_new))

看一下结果,未剪枝的决策树在测试集上的准确度反而更高,别慌,遇到事情不要慌哈哈哈,我们来想一想:有时模型准确度会受到原数据的label分布影响,尤其像信贷数据这种,逾期样本(label为1)的个数往往只占数据集十分之一,甚至更少。所以我们往往对于分类模型来说,会使用AUC值来判断模型的预测能力,AUC可以很好地解决数据不平衡带来的问题,那我们下面再来看一看两个模型的AUC值吧

5、模型效果

# 未剪枝决策树 预测测试集
y_test_proba = clf.predict_proba(xtest)
false_positive_rate, recall, thresholds = roc_curve(ytest, y_test_proba[:, 1])
# 未剪枝决策树AUC
roc_auc = auc(false_positive_rate, recall)  # 剪枝决策树 预测测试集
y_test_proba_new = clf_new.predict_proba(xtest)
false_positive_rate_new, recall_new, thresholds_new = roc_curve(ytest, y_test_proba_new[:, 1])
# 剪枝决策树AUC
roc_auc_new = auc(false_positive_rate_new, recall_new)  # 画出两个模型ROC曲线
plt.plot(false_positive_rate, recall, color='blue', label='AUC_orig=%0.3f' % roc_auc)
plt.plot(false_positive_rate_new, recall_new, color='orange', label='AUC_jianzhi=%0.3f' % roc_auc_new)
plt.legend(loc='best', fontsize=15, frameon=False)
plt.plot([0, 1], [0, 1], 'r--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.0])
plt.ylabel('Recall')
plt.xlabel('Fall-out')
plt.show()

从图上就可以看出,黄色实线代表剪枝决策树,AUC值为0.764,大于未剪枝的决策树,而且ROC面积也明显高于未剪枝的决策树,和我们预想的是一样的,小伙伴们在用决策树的时候一定要记得剪枝哦~

6、调参

sklearn中的决策树算法有很多超参数,通过对超参数的可以在一定程度上提高模型的性能,我们这里尝试调整max_depth最大深度这个参数

# 定义空列表,用来存放每一个树的深度所对应的AUC值
auc_test = []
for i in range(20):clf = tree.DecisionTreeClassifier(class_weight='balanced', max_depth = i + 1)clf = clf.fit(xtrain, ytrain)y_test_proba = clf.predict_proba(xtest)false_positive_rate, recall, thresholds = roc_curve(ytest, y_test_proba[:, 1])  roc_auc = auc(false_positive_rate, recall)  auc_test.append(roc_auc)plt.plot(range(1,21),auc_test,color="red",label="max_depth")
plt.legend()
plt.show()

随着树的增加,AUC值是逐渐下降的,根据这个图就可以选择最合适的max_depth

6、特征重要性

clf = tree.DecisionTreeClassifier(class_weight='balanced', max_depth=5)
clf = clf.fit(xtrain, ytrain)   # 决策树拟合,得到模型#特征重要性
feature_name = ['ALLMONEY',  'CAPARTY01',  'DJK5NNSYYFS', 'FINAL_SCORE',   'LOANCARDLEDGER', 'MARRIAGESTATUS']clf.feature_importances_
[*zip(feature_name,clf.feature_importances_)]

# 横向柱状图
plt.barh(np.arange(len(feature_name)), clf.feature_importances_, align='center')
plt.yticks(np.arange(len(feature_name)), feature_name, fontsize=15)
plt.xticks(fontsize=10)
plt.xlabel('Importances', fontsize=15)
plt.xlim(0,1)
plt.show()

可以看到,所有的特征都有特征重要性,但在实际应用中,并不是所有的特征都会被用到,这也是由于我们剪枝的原因,一些不重要的特征可能就不会出现在决策树中,也就是说在整颗树中没有这个结点,所以如果碰到特征重要性为0的情况,也是正常的

7、画出决策树并保存

dot_data = tree.export_graphviz(clf, feature_names=feature_name, class_names=['good', 'bad'], filled=True, rounded=True)
graph = graphviz.Source(dot_data)
graph

树有点大哈哈哈放不下了,这时候我们可以以图片或者pdf的形式把树保存到电脑里,便于观察~

mytree = graphviz.Source(dot_data, format='pdf')
mytree.render('D:/weiyu/汇报/早会分享/decision_tree')

本人才疏学浅,若有理解有误的地方,还请各路大佬批评指正♡♡♡

ok!感恩的心~

sklearn实现决策树(分类树)相关推荐

  1. sklearn 决策树(分类树、回归树)的 重要参数、属性、方法理解

    文章目录 决策分类树 引入 重要参数 1,criterion 2,splitter 3,max_depth 4,min_samples_leaf 5,min_samples_split 6,max_f ...

  2. 【菜菜的sklearn课堂笔记】决策树-分类树

    视频作者:菜菜TsaiTsai 链接:[技术干货]菜菜的机器学习sklearn[全85集]Python进阶_哔哩哔哩_bilibili 关键概念:节点 根节点:没有进边,有出边.包含最初的,针对特征的 ...

  3. python+sklearn训练决策树分类模型(绘制学习曲线和验证曲线)

    本文所用文件的链接 链接:https://pan.baidu.com/s/1RWNVHuXMQleOrEi5vig_bQ 提取码:p57s 关于决策树的初级应用,可以看我之前的文章: https:// ...

  4. 决策树(分类树、回归树)

    决策树 前言:第一篇博客,最近看完决策树,想着归纳一下,也方便自己以后回顾.写的会比较全面一些,可能会有很多不太正确的地方,欢迎大家交流指正 : ) 决策树模型: 决策树模型是运用于分类以及回归的一种 ...

  5. python中sklearn实现决策树及模型评估_sklearn实现决策树

    sklearn是一个功能非常强大的工具,可以用几行代码实现丰富的机器学习算法. 本文介绍使用sklearn实现决策树 决策树是经典的机器学习算法,很多复杂的机器学习算法都是由决策时演变而来.它是一种使 ...

  6. Lesson 8.1Lesson 8.2 决策树的核心思想与建模流程CART分类树的建模流程与sklearn评估器参数详解

    Lesson 8.1 决策树的核心思想与建模流程 从本节课开始,我们将介绍经典机器学习领域中最重要的一类有监督学习算法--树模型(决策树). 可此前的聚类算法类似,树模型也同样不是一个模型,而是一类模 ...

  7. 【sklearn学习】决策树、分类树、剪枝策略

    模块sklarn.tree sklearn中决策树的类都在"tree"这个模块之下,这个模块总共包含五个类: tree.DecisionTreeClassifier 分类树 tre ...

  8. python决策树分类 导入数据集_python+sklearn实现决策树(分类树)

    整理今天的代码-- 采用的是150条鸢尾花的数据集fishiris.csv # 读入数据,把Name列取出来作为标签(groundtruth) import pandas as pd data = p ...

  9. 机器学习Sklearn实战——梯度提升树二分类原理

    一.算法使用 (一)创建 (二)参数调整 cross_val_score:求单一参数最合适的值(KNN) GridSearchCV网格搜索:多参数组合最优的值 标准:准确率,精确率,召回率,F1 (三 ...

最新文章

  1. 关于页面莫名空白的解决方式
  2. 洛谷 P1071 潜伏者
  3. 数据结构(二)算法基础与复杂度
  4. mysql隔离级别 举例_mysql的事务隔离级别举例
  5. hdfs web_ui深入讲解、服务启动日志分析、NN SNN关系
  6. SAP UI5 初学者教程之三:开始接触第一个 SAP UI5 控件 试读版
  7. 【ABAP系列】SAP ABAP 从FTP服务器读取文件到本地
  8. koa2 session mysql_koa2+vue+axios搭建一个博客台管理系统之session踩坑
  9. fastlane php,Fastlane自动化打包笔记
  10. 破解Windows7开机密码
  11. 算高差改正数的计算机程序,水准测量中的高差改正数应该怎么算?我们是六个点,而且每次只能观测两个点,也就是有六个测段...
  12. SAP 业务交易事件BTE(Business Transaction Event)
  13. react antd Table 表格 td超出自动换行
  14. Java 架构师眼中的 HTTP 协议
  15. java bulk_Elasticsearch Java High Level REST Client(Bulk API)
  16. Halcon编程实验-(4)车牌号数字+字母的识别【目的:OCR识别的应用】
  17. 简述余弦函数cos(x)和反余弦函数acos(x)------(附Demo案例)
  18. 转一篇关于制作三维立体画的文章以及其源码
  19. 微信小游戏个人开发者是怎样盈利的
  20. 关于数据处理的一些方法(dataframe)

热门文章

  1. WIZnet正式发布W5500
  2. C/C++ 复制数组【简单易懂,代码可以直接运行】
  3. 信息论与编码冯桂周林著答案_信息论与编码技术+(冯桂+林其伟+陈东华+著)+清华出版社+课后答案.pdf...
  4. Linux设备上的Onvif实现18: ONVIF视频监视功能开发问题总结
  5. CloudCompare功能介绍-Curvature 曲率
  6. 前端条码打印方案(表格+中文+一维码+二维码)
  7. u盘提示磁盘未被格式化
  8. 电脑计算机管理打开错误,右键打开wndows7计算机管理就显示CompMgmtLauncher.exe错误的解决办法...
  9. vue代码可以反编译吗_微信小程序源码提取反编译
  10. 计算机专业能报考人力资源管理吗,我是一名计算机专业的应届毕业生,想转行从事人力..._人力资源师_帮考网...