python使用sklearn实现决策树的方法示例


Posted in Python onSeptember 12, 2019

1. 基本环境

安装 anaconda 环境, 由于国内登陆不了他的官网 https://www.continuum.io/downloads, 不过可以使用国内的镜像站点: https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/

添加绘图工具 Graphviz http://www.graphviz.org/Download_windows.php

安装后, 将bin 目录内容添加到环境变量path 即可

参考blog : https://3water.com/article/169878.htm

官网技术文档 : http://scikit-learn.org/stable/modules/tree.html#tree-algorithms-id3-c4-5-c5-0-and-cart

2. 遇到的一些问题

csv 文件读取 https://docs.python.org/3.5/library/csv.html?highlight=csv#module-csv

https://docs.python.org/2/library/csv.html?highlight=csv#module-csv

3. 实现

数据文件:

python使用sklearn实现决策树的方法示例 

这是一个给定 4 个属性, age, income, student, credit_rating 以及 一个 标记属性 class_buys_computer 的数据集, 我们需要根据这个数据集进行分析并构建一颗决策树

代码实现:

核心就是调用 tree 的 DecisionTreeClassifier 方法对数据进行 训练得到一颗决策树

# -*- coding: utf-8 -*-
"""
Created on Sun Dec 25 11:25:40 2016

@author: Administrator
"""

from sklearn.feature_extraction import DictVectorizer
import csv
from sklearn import tree
from sklearn import preprocessing
from sklearn.externals.six import StringIO
import pydotplus
from IPython.display import Image

# Read in the csv file and put features into list of dict and list of class label
allElectornicsData = open('AllElectronics.csv', 'r')
reader = csv.reader(allElectornicsData)
# headers = reader.next()  python2.7 supported  本质获取csv 文件的第一行数据
#headers = reader.__next__()  python 3.5.2 
headers = next(reader)

print(headers)

featureList = []
labelList = []

for row in reader:
  labelList.append(row[len(row) - 1])
  rowDict = {}
  for i in range(1, len(row) - 1):
    rowDict[headers[i]] = row[i]
  featureList.append(rowDict)

print(featureList)
print(labelList)

# Vetorize features
vec = DictVectorizer()
dummyX = vec.fit_transform(featureList).toarray()

print("dummyX: " + str(dummyX))
print(vec.get_feature_names())
print("labelList: " + str(labelList))

# vectorize class labels
lb = preprocessing.LabelBinarizer()
dummyY = lb.fit_transform(labelList)
print("dummyY: ", str(dummyY))

# Using decision tree for classification    ===========【此处调用为算法核心】============
#clf = tree.DecisionTreeClassifier(criterion='entropy')
clf = tree.DecisionTreeClassifier(criterion='gini')
clf = clf.fit(dummyX, dummyY)
print("clf: ", str(clf))

# Visualize model
# dot -Tpdf iris.dot -o ouput.pdf
with open("allElectronicInformationGainOri.dot", 'w') as f:
  f = tree.export_graphviz(clf, feature_names = vec.get_feature_names(), out_file = f)


# predict
oneRowX = dummyX[0, :]
print("oneRowX: " + str(oneRowX))

newRowX = oneRowX
newRowX[0] = 1
newRowX[2] = 0
print("newRowX: " + str(newRowX))

predictedY = clf.predict(newRowX)
print("predictedY: " + str(predictedY))

输出结果:

ID3 算法

python使用sklearn实现决策树的方法示例

CART 算法

python使用sklearn实现决策树的方法示例

4. 决策树的优缺点

决策树的优势

  1. 简单易用,而且输出的结果易于解释,树能够被图形化,加深了直观的理解。
  2. 几乎不需要对数据进行预处理。
  3. 算法的开销不大,而且决策树一旦建立,对于未知样本的分类十分快,最坏情况下的时间复杂度是O(w),w是树的最大深度。
  4. 能够用于多类的分类。
  5. 能够容忍噪点。

决策树的劣势

  1. 容易过拟合。
  2. 容易被类别中占多数的类影响而产生bias,所以推荐在送入算法之间先平衡下数据中各个类别所占的比例。
  3. 决策树采用的是自顶向下的递归划分法,因此自定而下到了末端枝叶包含的数据量会很少,我们会依据很少的数据量取做决策,这样的决策是不具有统计意义的,这就是数据碎片的问题。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python写的一个文本编辑器
Jan 23 Python
Python基础入门之seed()方法的使用
May 15 Python
Python自动扫雷实现方法
Jul 25 Python
Python快速从注释生成文档的方法
Dec 26 Python
python数据类型判断type与isinstance的区别实例解析
Oct 31 Python
使用Python 正则匹配两个特定字符之间的字符方法
Dec 24 Python
Python 的AES加密与解密实现
Jul 09 Python
简单了解python装饰器原理及使用方法
Dec 18 Python
设置jupyter中DataFrame的显示限制方式
Apr 12 Python
Python脚本破解压缩文件口令实例教程(zipfile)
Jun 14 Python
keras实现VGG16 CIFAR10数据集方式
Jul 07 Python
如何获取numpy array前N个最大值
May 14 Python
Python环境Pillow( PIL )图像处理工具使用解析
Sep 12 #Python
Python列表删除元素del、pop()和remove()的区别小结
Sep 11 #Python
python conda操作方法
Sep 11 #Python
多版本python的pip 升级后, pip2 pip3 与python版本失配解决方法
Sep 11 #Python
浅谈Django+Gunicorn+Nginx部署之路
Sep 11 #Python
初次部署django+gunicorn+nginx的方法步骤
Sep 11 #Python
python 如何将数据写入本地txt文本文件的实现方法
Sep 11 #Python
You might like
php数组函数序列之next() - 移动数组内部指针到下一个元素的位置,并返回该元素值
2011/10/31 PHP
PHP基于pdo的数据库操作类【可支持mysql、sqlserver及oracle】
2018/05/21 PHP
thinkphp框架使用JWTtoken的方法详解
2019/10/10 PHP
CL vs ForZe BO5 第五场 2.13
2021/03/10 DOTA
jQuery使用手册之一
2007/03/24 Javascript
JS滚轮事件onmousewheel使用介绍
2013/11/01 Javascript
js document.write()使用介绍
2014/02/21 Javascript
运用jQuery定时器的原理实现banner图片切换
2014/10/22 Javascript
AngularJS入门教程(二):AngularJS模板
2014/12/06 Javascript
深入理解JavaScript的React框架的原理
2015/07/02 Javascript
JS+CSS实现滑动切换tab菜单效果
2015/08/25 Javascript
Angular Js文件上传之form-data
2015/08/28 Javascript
JavaScript前端开发之实现二进制读写操作
2015/11/04 Javascript
jQuery-1.9.1源码分析系列(十)事件系统之事件体系结构
2015/11/19 Javascript
使用JavaScript实现ajax的实例代码
2016/05/11 Javascript
简单实现js浮动框
2016/12/13 Javascript
Vue2.0中集成UEditor富文本编辑器的方法
2018/03/03 Javascript
vue watch深度监听对象实现数据联动效果
2018/08/16 Javascript
前后端如何实现登录token拦截校验详解
2018/09/03 Javascript
解决layui追加或者动态修改的表单元素“没效果”的问题
2019/09/18 Javascript
python发送邮件的实例代码(支持html、图片、附件)
2013/03/04 Python
django实现登录时候输入密码错误5次锁定用户十分钟
2017/11/05 Python
Python语言快速上手学习方法
2018/12/14 Python
解决python中导入win32com.client出错的问题
2019/07/26 Python
pytorch实现mnist分类的示例讲解
2020/01/10 Python
解决Python 写文件报错TypeError的问题
2020/10/23 Python
python time.strptime格式化实例详解
2021/02/03 Python
韩国三星集团旗下时尚品牌官网:SSF SHOP
2016/08/02 全球购物
小区门卫管理制度
2014/01/29 职场文书
学雷锋志愿者活动方案
2014/08/21 职场文书
专家推荐信怎么写
2015/03/25 职场文书
致短跑运动员加油稿
2015/07/21 职场文书
关于开学的感想
2015/08/10 职场文书
python 提取html文本的方法
2021/05/20 Python
Vue+Element UI实现概要小弹窗的全过程
2021/05/30 Vue.js
磁贴还没死, 微软Win11可修改注册表找回Win10开始菜单
2021/11/21 数码科技