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编写分析Python程序性能的工具的教程
Apr 01 Python
python dict 字典 以及 赋值 引用的一些实例(详解)
Jan 20 Python
python学习教程之Numpy和Pandas的使用
Sep 11 Python
Python 逐行分割大txt文件的方法
Oct 10 Python
pip命令无法使用的解决方法
Jun 12 Python
Python动态导入模块的方法实例分析
Jun 28 Python
Python实现App自动签到领取积分功能
Sep 29 Python
使用python批量化音乐文件格式转换的实例
Jan 09 Python
使用Python3+PyQT5+Pyserial 实现简单的串口工具方法
Feb 13 Python
Matplotlib绘制雷达图和三维图的示例代码
Jan 07 Python
Python基于pandas爬取网页表格数据
May 11 Python
python如何设置静态变量
Sep 07 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实现的功能是显示8条基色色带
2006/10/09 PHP
php中global和$GLOBALS[]的分析之一
2012/02/02 PHP
PHP超级全局变量数组小结
2012/10/04 PHP
PHP判断远程图片或文件是否存在的实现代码
2014/02/20 PHP
WordPress免插件实现面包屑导航的示例代码
2020/08/20 PHP
Javascript Select操作大集合
2009/05/26 Javascript
js触发onchange事件的方法说明
2014/03/08 Javascript
js给网页加上背景音乐及选择音效的方法
2015/03/03 Javascript
jQuery插件datalist实现很好看的input下拉列表
2015/07/14 Javascript
基于JS分页控件实现简单美观仿淘宝分页按钮效果
2016/11/07 Javascript
谈谈Vue.js——vue-resource全攻略
2017/01/16 Javascript
关于Node.js中Buffer的一些你可能不知道的用法
2017/03/28 Javascript
vue-cli如何快速构建vue项目
2017/04/26 Javascript
nodejs多版本管理总结
2018/04/03 NodeJs
详解通过源码解析Node.js中cluster模块的主要功能实现
2018/05/16 Javascript
vue element-ui之怎么封装一个自己的组件的详解
2019/05/20 Javascript
vue 导航守卫和axios拦截器有哪些区别
2020/12/19 Vue.js
简单讲解Python中的数字类型及基本的数学计算
2016/03/11 Python
pyqt5 实现工具栏文字图片同时显示
2019/06/13 Python
python程序变成软件的实操方法
2019/06/24 Python
使用pyecharts生成Echarts网页的实例
2019/08/12 Python
给大家整理了19个pythonic的编程习惯(小结)
2019/09/25 Python
python计算auc的方法
2020/09/09 Python
python模拟点击在ios中实现的实例讲解
2020/11/26 Python
Python实现Appium端口检测与释放的实现
2020/12/31 Python
详解CSS3媒体查询响应式布局bootstrap 框架原理实战(推荐)
2020/11/16 HTML / CSS
娇韵诗香港官网:Clarins香港
2020/08/13 全球购物
您熟悉ORM(Object-Relation Mapping)吗?请谈谈您所理解的ORM
2016/02/08 面试题
医学生自我评价
2014/01/27 职场文书
2014年应届大学生毕业自我鉴定
2014/01/31 职场文书
会计工作决心书
2014/03/11 职场文书
《金色的脚印》教后反思
2014/04/23 职场文书
服务员态度差检讨书
2014/10/28 职场文书
2015年度学校卫生工作总结
2015/05/12 职场文书
因工资原因离职的辞职信范文
2015/05/12 职场文书
详解SQL报错盲注
2022/07/23 SQL Server