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深入学习之对象的属性
Aug 31 Python
python网络编程之数据传输UDP实例分析
May 20 Python
python统计日志ip访问数的方法
Jul 06 Python
Python操作Access数据库基本步骤分析
Sep 19 Python
利用python模拟实现POST请求提交图片的方法
Jul 25 Python
基于python进行桶排序与基数排序的总结
May 29 Python
python用BeautifulSoup库简单爬虫实例分析
Jul 30 Python
Python中Proxypool库的安装与配置
Oct 19 Python
python3中property使用方法详解
Apr 23 Python
python求最大值最小值方法总结
Jun 25 Python
基于python SMTP实现自动发送邮件教程解析
Jun 02 Python
python开发入门——列表生成式
Sep 03 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
超级简单的图片防盗(HTML),好用
2007/04/08 Javascript
理解Javascript_15_作用域分配与变量访问规则,再送个闭包
2010/10/20 Javascript
IE、FF、Chrome浏览器中的JS差异介绍
2013/08/13 Javascript
javascript数字时钟示例分享
2014/04/23 Javascript
JavaScript修改浏览器tab标题小技巧
2015/01/06 Javascript
jQuery源码分析之jQuery.fn.each与jQuery.each用法
2015/01/23 Javascript
jquery插件jSignature实现手动签名
2015/05/04 Javascript
在JavaScript中处理数组之reverse()方法的使用
2015/06/09 Javascript
javascript实现查找数组中最大值方法汇总
2016/02/13 Javascript
JavaScript实现页面定时刷新(定时器,meta)
2016/10/12 Javascript
AngularJS控制器controller给模型数据赋初始值的方法
2017/01/04 Javascript
vue如何将v-for中的表格导出来
2018/05/07 Javascript
layui弹出层按钮提交iframe表单的方法
2018/08/20 Javascript
使用nodejs分离html文件里的js和css详解
2019/04/12 NodeJs
vue表单数据交互提交演示教程
2019/11/13 Javascript
vue实现下载文件流完整前后端代码
2020/11/17 Vue.js
[06:33]3.19 DOTA2发布会 海涛、冷冷、2009见证希望
2014/03/21 DOTA
[00:13]天涯墨客二技能展示
2018/08/25 DOTA
python判断、获取一张图片主色调的2个实例
2014/04/10 Python
简单谈谈Python中的几种常见的数据类型
2017/02/10 Python
python编写朴素贝叶斯用于文本分类
2017/12/21 Python
pandas or sql计算前后两行数据间的增值方法
2018/04/20 Python
Python类和对象的定义与实际应用案例分析
2018/12/27 Python
基于python3 pyQt5 QtDesignner实现窗口化猜数字游戏功能
2019/07/15 Python
python之yield和Generator深入解析
2019/09/18 Python
django2.2安装错误最全的解决方案(小结)
2019/09/24 Python
python3的UnicodeDecodeError解决方法
2019/12/20 Python
美国现代家具网站:Design Within Reach
2018/07/19 全球购物
超市仓管员岗位职责范本
2014/09/18 职场文书
基层党支部整改方案
2014/10/25 职场文书
事业单位个人查摆问题及整改措施
2014/10/28 职场文书
工程项目经理岗位职责
2015/02/02 职场文书
幼儿园老师个人总结
2015/02/28 职场文书
2015年服务员工作总结
2015/04/08 职场文书
2016年“5.12”护士节慰问信
2015/11/30 职场文书
delete in子查询不走索引问题分析
2022/07/07 MySQL