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之关于循环的小伎俩
Oct 02 Python
Mac中升级Python2.7到Python3.5步骤详解
Apr 27 Python
python jieba分词并统计词频后输出结果到Excel和txt文档方法
Feb 11 Python
python 3.6.4 安装配置方法图文教程
Sep 18 Python
Python 调用 Windows API COM 新法
Aug 22 Python
Python3 sys.argv[ ]用法详解
Oct 24 Python
pyhton中__pycache__文件夹的产生与作用详解
Nov 24 Python
django的autoreload机制实现
Jun 03 Python
如何使用Pytorch搭建模型
Oct 26 Python
Python+unittest+DDT实现数据驱动测试
Nov 30 Python
pycharm 多行批量缩进和反向缩进快捷键介绍
Jan 15 Python
Python Pygame实战在打砖块游戏的实现
Mar 17 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 安全过滤函数代码
2011/05/07 PHP
利用phpexcel把excel导入数据库和数据库导出excel实现
2014/01/09 PHP
PHP中unset,array_splice删除数组中元素的区别
2014/07/28 PHP
PHP-Java-Bridge使用笔记
2014/09/22 PHP
PHP中加密解密函数与DES加密解密实例
2014/10/17 PHP
ThinkPHP框架里隐藏index.php
2016/04/12 PHP
你必须知道的JavaScript 变量命名规则详解
2013/05/07 Javascript
js获取对象为null的解决方法
2013/11/21 Javascript
javascript轻松实现当鼠标移开时已弹出子菜单自动消失
2013/12/29 Javascript
extJS中常用的4种Ajax异步提交方式
2014/03/07 Javascript
javascript字符串循环匹配实例分析
2015/07/17 Javascript
js判断子窗体是否关闭的方法
2015/08/11 Javascript
整理Javascript流程控制语句学习笔记
2015/11/29 Javascript
Bootstrap.css与layDate日期选择样式起冲突的解决办法
2017/04/07 Javascript
浅析 NodeJs 的几种文件路径
2017/06/07 NodeJs
微信小程序开发之toast提示插件使用示例
2017/06/08 Javascript
使用JavaScript实现表格编辑器(实例讲解)
2017/08/02 Javascript
vue-cli3.0如何使用CDN区分开发、生产、预发布环境
2018/11/22 Javascript
vue之封装多个组件调用同一接口的案例
2020/08/11 Javascript
[56:46]Liquid vs IG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
Python常见文件操作的函数示例代码
2011/11/15 Python
Python守护进程(daemon)代码实例
2015/03/06 Python
程序员的七夕用30行代码让Python化身表白神器
2019/08/07 Python
Python django搭建layui提交表单,表格,图标的实例
2019/11/18 Python
python中安装django模块的方法
2020/03/12 Python
简单掌握CSS3中resize属性的用法
2016/04/01 HTML / CSS
荷兰演唱会和体育比赛订票网站:viagogo荷兰
2018/04/08 全球购物
怀旧收藏品和经典纪念品:Betty’s Attic
2018/08/29 全球购物
MADE法国:提供原创设计师家具
2018/09/18 全球购物
Penhaligon’s英国官网:成立于1870年的英国香水制造商
2021/02/18 全球购物
网页设计个人找工作求职信
2013/11/28 职场文书
个人违纪检讨书
2014/09/15 职场文书
经典法律座右铭(50句)
2019/08/15 职场文书
浅谈Python类的单继承相关知识
2021/05/12 Python
如何更改Win11声音输出设备?Win11声音输出设备四种更改方法
2022/04/08 数码科技
MySQL事务的隔离级别详情
2022/07/15 MySQL