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脚本内运行linux命令的方法
Jul 02 Python
python日志记录模块实例及改进
Feb 12 Python
Python enumerate索引迭代代码解析
Jan 19 Python
python3.x上post发送json数据
Mar 04 Python
python如何为被装饰的函数保留元数据
Mar 21 Python
通过python顺序修改文件名字的方法
Jul 11 Python
Python实现图片转字符画的代码实例
Feb 22 Python
python简单验证码识别的实现方法
May 10 Python
十分钟搞定pandas(入门教程)
Jun 21 Python
Python列表(list)所有元素的同一操作解析
Aug 01 Python
Python操作Excel工作簿的示例代码(\*.xlsx)
Mar 23 Python
详解python定时简单爬取网页新闻存入数据库并发送邮件
Nov 27 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模板,主要想体现一下思路
2006/12/25 PHP
PHP搭建大文件切割分块上传功能示例
2017/01/04 PHP
搜索附近的人PHP实现代码
2018/02/11 PHP
php 使用 __call实现重载功能示例
2019/11/18 PHP
Laravel框架中队列和工作(Queues、Jobs)操作实例详解
2020/04/06 PHP
javascript Discuz代码中的msn聊天小功能
2008/05/25 Javascript
用Javascript数组处理多个字符串的连接问题
2009/08/20 Javascript
iframe异步加载实现点击左边菜单加载右边内容实例讲解
2013/03/04 Javascript
js 判断浏览器使用的语言示例代码
2014/03/22 Javascript
jquery获得同源iframe内body下标签的值的方法
2014/09/25 Javascript
Javascript中的return作用及javascript return关键字用法详解
2015/11/05 Javascript
jQuery Validate 校验多个相同name的方法
2017/05/18 jQuery
Vue.js移动端左滑删除组件的实现代码
2017/09/08 Javascript
JavaScript设计模式之构造函数模式实例教程
2018/07/02 Javascript
JS删除对象中某一属性案例详解
2020/09/08 Javascript
如何管理Vue中的缓存页面
2021/02/06 Vue.js
让python json encode datetime类型
2010/12/28 Python
Python进阶篇之字典操作总结
2016/11/16 Python
深入理解Python中的*重复运算符
2017/10/28 Python
python文件读写代码实例
2019/10/21 Python
PyTorch中Tensor的数据类型和运算的使用
2020/09/03 Python
CSS3使用transition实现的鼠标悬停淡入淡出
2015/01/09 HTML / CSS
HTML5无刷新改变当前url的代码
2017/03/15 HTML / CSS
美国祛痘、抗衰老药妆品牌:Murad
2016/08/27 全球购物
SEPHORA新西兰官方网站:购买化妆品和护肤品
2016/12/02 全球购物
NBA欧洲商店(英国):NBA Europe Store UK
2018/07/27 全球购物
德国黑胶唱片、街头服装及运动鞋网上商店:HHV
2018/08/24 全球购物
质量标语大全
2014/06/12 职场文书
数学教研活动总结
2014/07/02 职场文书
工人先锋号申报材料
2014/12/29 职场文书
办公室行政主管岗位职责
2015/04/09 职场文书
公司人事管理制度
2015/08/05 职场文书
2019学校运动会开幕词
2019/05/13 职场文书
《中华上下五千年》读后感3篇
2019/11/29 职场文书
手写实现JS中的new
2021/11/07 Javascript
windows10 家庭版下FTP服务器搭建教程
2022/08/05 Servers