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的Django框架使用的一些实用建议
Apr 03 Python
Python和JavaScript间代码转换的4个工具
Feb 22 Python
Python与Java间Socket通信实例代码
Mar 06 Python
Python科学画图代码分享
Nov 29 Python
使用sklearn之LabelEncoder将Label标准化的方法
Jul 11 Python
从运行效率与开发效率比较Python和C++
Dec 14 Python
Python操作Mongodb数据库的方法小结
Sep 10 Python
python实现批量处理将图片粘贴到另一张图片上并保存
Dec 12 Python
Python 实现数组相减示例
Dec 27 Python
Python生成六万个随机,唯一的8位数字和数字组成的随机字符串实例
Mar 03 Python
python如何输出反斜杠
Jun 18 Python
Jupyter Notebook 远程访问配置详解
Jan 11 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同时支持GIF、png、JPEG
2006/10/09 PHP
PHP安装攻略:常见问题解答(二)
2006/10/09 PHP
PHP mail 通过Windows的SMTP发送邮件失败的解决方案
2009/05/27 PHP
php中全局变量global的使用演示代码
2011/05/18 PHP
ThinkPHP打水印及设置水印位置的方法
2016/10/14 PHP
Prototype 1.5.0_rc1 及 Prototype 1.5.0 Pre0小抄本
2006/09/22 Javascript
匹配任意字符的正则表达式写法
2010/04/29 Javascript
JSCode all of Brower 全局屏蔽网页右键功能 具体实现
2013/06/05 Javascript
extjs render 用法介绍
2013/09/11 Javascript
javascript使用location.search的示例
2013/11/05 Javascript
js使用eval解析json(js中使用json)
2014/01/17 Javascript
IE中鼠标经过option触发mouseout的解决方法
2015/01/29 Javascript
每天一篇javascript学习小结(面向对象编程)
2015/11/20 Javascript
JS实现根据文件字节数返回文件大小的方法
2016/08/02 Javascript
详解微信小程序设置底部导航栏目方法
2017/06/29 Javascript
详谈js原型继承的一些问题
2017/09/06 Javascript
vue微信分享 vue实现当前页面分享其他页面
2017/12/02 Javascript
基于Vue-Cli 打包自动生成/抽离相关配置文件的实现方法
2018/12/09 Javascript
动态内存分配导致影响Javascript性能的问题
2018/12/18 Javascript
JavaScript变量提升和严格模式实例分析
2019/01/27 Javascript
js+canvas实现两张图片合并成一张图片的方法
2019/11/01 Javascript
vuex state中的数组变化监听实例
2019/11/06 Javascript
完美解决vue 中多个echarts图表自适应的问题
2020/07/19 Javascript
Python自动化测试Eclipse+Pydev 搭建开发环境
2016/08/15 Python
python数据结构链表之单向链表(实例讲解)
2017/07/25 Python
用Python写一个自动木马程序
2019/09/17 Python
基于Python 中函数的 收集参数 机制
2019/12/21 Python
Baby Tulai澳大利亚:美国婴儿背带品牌
2018/10/15 全球购物
Sneaker Studio罗马尼亚网站:购买运动鞋
2018/11/04 全球购物
高中生职业生涯规划书
2014/02/24 职场文书
团队经理竞聘书
2014/03/31 职场文书
财务工作疏忽检讨书
2014/09/11 职场文书
2015年转正工作总结范文
2015/04/02 职场文书
鸦片战争观后感
2015/06/09 职场文书
python scipy 稀疏矩阵的使用说明
2021/05/26 Python
使用python求解迷宫问题的三种实现方法
2022/03/17 Python