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实现测试磁盘性能的方法
Mar 12 Python
深入解析Python中的urllib2模块
Nov 13 Python
Python中py文件转换成exe可执行文件的方法
Jun 14 Python
python算法与数据结构之冒泡排序实例详解
Jun 22 Python
python3 requests库实现多图片爬取教程
Dec 18 Python
Tensorflow 自定义loss的情况下初始化部分变量方式
Jan 06 Python
python 控制台单行刷新,多行刷新实例
Feb 19 Python
Python图像处理库PIL的ImageDraw模块介绍详解
Feb 26 Python
python GUI库图形界面开发之PyQt5菜单栏控件QMenuBar的详细使用方法与实例
Feb 28 Python
python实现超级马里奥
Mar 18 Python
django xadmin中form_layout添加字段显示方式
Mar 30 Python
python中pivot()函数基础知识点
Jan 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
新版PHP极大的增强功能和性能
2006/10/09 PHP
wiki-shan写的php在线加密的解密程序
2008/09/07 PHP
php与mysql建立连接并执行SQL语句的代码
2011/07/04 PHP
php实现中文转数字
2016/02/18 PHP
ThinkPHP下表单令牌错误与解决方法分析
2017/05/20 PHP
phpStudy2016 配置多个域名期间遇到的问题小结
2017/10/19 PHP
PHP5.5基于mysqli连接MySQL数据库和读取数据操作实例详解
2019/02/16 PHP
PHP __call()方法实现委托示例
2019/05/20 PHP
jquery 1.3.2 IE8中的一点点的小问题解决方法
2009/07/10 Javascript
获取客户端电脑日期时间js代码(jquery)
2012/09/12 Javascript
基于datagrid框架的查询
2013/04/08 Javascript
Javascript中 关于prototype属性实现继承的原理图
2013/04/16 Javascript
7款吸引人眼球的jQuery/CSS3特效实例分享
2013/04/25 Javascript
解决checkbox的attr(checked)一直为undefined问题
2014/06/16 Javascript
jQuery对指定元素中指定字符串进行替换的方法
2015/03/17 Javascript
jQuery实现响应鼠标事件的图片透明效果【附demo源码下载】
2016/06/16 Javascript
Javascript 高性能之递归,迭代,查表法详解及实例
2017/01/08 Javascript
Node.js Express 框架 POST方法详解
2017/01/23 Javascript
使用gulp搭建本地服务器并实现模拟ajax
2017/04/05 Javascript
关于vue.js v-bind 的一些理解和思考
2017/06/06 Javascript
小程序点赞收藏功能的实现代码示例
2018/09/07 Javascript
vue中v-show和v-if的异同及v-show用法
2019/06/06 Javascript
vue3.0 加载json的方法(非ajax)
2020/10/26 Javascript
[02:07]2017国际邀请赛中国区预选赛直邀战队前瞻
2017/06/23 DOTA
Swift 3.0在集合类数据结构上的一些新变化总结
2016/07/11 Python
python Matplotlib数据可视化(2):详解三大容器对象与常用设置
2020/09/30 Python
PHP面试题集
2016/12/18 面试题
枚举与#define宏的区别
2014/04/30 面试题
应届生新闻编辑求职信
2013/11/19 职场文书
绩效工资分配方案
2014/01/18 职场文书
公务员平时考核实施方案
2014/03/11 职场文书
安全标语大全
2014/06/10 职场文书
空气的环保标语
2014/06/12 职场文书
销售员态度差检讨书
2014/10/26 职场文书
2015年元宵节活动总结
2015/02/06 职场文书
面试通知短信
2015/04/20 职场文书