python实现决策树分类(2)


Posted in Python onAugust 30, 2018

在上一篇文章中,我们已经构建了决策树,接下来可以使用它用于实际的数据分类。在执行数据分类时,需要决策时以及标签向量。程序比较测试数据和决策树上的数值,递归执行直到进入叶子节点。

这篇文章主要使用决策树分类器就行分类,数据集采用UCI数据库中的红酒,白酒数据,主要特征包括12个,主要有非挥发性酸,挥发性酸度, 柠檬酸, 残糖含量,氯化物, 游离二氧化硫, 总二氧化硫,密度, pH,硫酸盐,酒精, 质量等特征。

下面是具体代码的实现:

#coding :utf-8
'''
2017.6.26 author :Erin 
     function: "decesion tree" ID3
     
'''
import numpy as np
import pandas as pd
from math import log
import operator 
import random
def load_data():
  
  red = [line.strip().split(';') for line in open('e:/a/winequality-red.csv')]
  white = [line.strip().split(';') for line in open('e:/a/winequality-white.csv')]
  data=red+white
  random.shuffle(data) #打乱data
  x_train=data[:800]
  x_test=data[800:]
  
  features=['fixed','volatile','citric','residual','chlorides','free','total','density','pH','sulphates','alcohol','quality']
  return x_train,x_test,features
 
def cal_entropy(dataSet):
 
  
  numEntries = len(dataSet)
  labelCounts = {}
  for featVec in dataSet:
    label = featVec[-1]
    if label not in labelCounts.keys():
      labelCounts[label] = 0
    labelCounts[label] += 1
  entropy = 0.0
  for key in labelCounts.keys():
    p_i = float(labelCounts[key]/numEntries)
    entropy -= p_i * log(p_i,2)#log(x,10)表示以10 为底的对数
  return entropy
 
def split_data(data,feature_index,value):
  '''
  划分数据集
  feature_index:用于划分特征的列数,例如“年龄”
  value:划分后的属性值:例如“青少年”
  '''
  data_split=[]#划分后的数据集
  for feature in data:
    if feature[feature_index]==value:
      reFeature=feature[:feature_index]
      reFeature.extend(feature[feature_index+1:])
      data_split.append(reFeature)
  return data_split
def choose_best_to_split(data):
  
  '''
  根据每个特征的信息增益,选择最大的划分数据集的索引特征
  '''
  
  count_feature=len(data[0])-1#特征个数4
  #print(count_feature)#4
  entropy=cal_entropy(data)#原数据总的信息熵
  #print(entropy)#0.9402859586706309
  
  max_info_gain=0.0#信息增益最大
  split_fea_index = -1#信息增益最大,对应的索引号
 
  for i in range(count_feature):
    
    feature_list=[fe_index[i] for fe_index in data]#获取该列所有特征值
    #######################################
 
    # print(feature_list)
    unqval=set(feature_list)#去除重复
    Pro_entropy=0.0#特征的熵
    for value in unqval:#遍历改特征下的所有属性
      sub_data=split_data(data,i,value)
      pro=len(sub_data)/float(len(data))
      Pro_entropy+=pro*cal_entropy(sub_data)
      #print(Pro_entropy)
      
    info_gain=entropy-Pro_entropy
    if(info_gain>max_info_gain):
      max_info_gain=info_gain
      split_fea_index=i
  return split_fea_index
    
    
##################################################
def most_occur_label(labels):
  #sorted_label_count[0][0] 次数最多的类标签
  label_count={}
  for label in labels:
    if label not in label_count.keys():
      label_count[label]=0
    else:
      label_count[label]+=1
    sorted_label_count = sorted(label_count.items(),key = operator.itemgetter(1),reverse = True)
  return sorted_label_count[0][0]
def build_decesion_tree(dataSet,featnames):
  '''
  字典的键存放节点信息,分支及叶子节点存放值
  '''
  featname = featnames[:]       ################
  classlist = [featvec[-1] for featvec in dataSet] #此节点的分类情况
  if classlist.count(classlist[0]) == len(classlist): #全部属于一类
    return classlist[0]
  if len(dataSet[0]) == 1:     #分完了,没有属性了
    return Vote(classlist)    #少数服从多数
  # 选择一个最优特征进行划分
  bestFeat = choose_best_to_split(dataSet)
  bestFeatname = featname[bestFeat]
  del(featname[bestFeat])   #防止下标不准
  DecisionTree = {bestFeatname:{}}
  # 创建分支,先找出所有属性值,即分支数
  allvalue = [vec[bestFeat] for vec in dataSet]
  specvalue = sorted(list(set(allvalue))) #使有一定顺序
  for v in specvalue:
    copyfeatname = featname[:]
    DecisionTree[bestFeatname][v] = build_decesion_tree(split_data(dataSet,bestFeat,v),copyfeatname)
  return DecisionTree
 
def classify(Tree, featnames, X):
  classLabel=''
  root = list(Tree.keys())[0]
  firstDict = Tree[root]
  featindex = featnames.index(root) #根节点的属性下标
  #classLabel='0'
  for key in firstDict.keys():  #根属性的取值,取哪个就走往哪颗子树
    if X[featindex] == key:
      if type(firstDict[key]) == type({}):
        classLabel = classify(firstDict[key],featnames,X)
      else:
        classLabel = firstDict[key]
  return classLabel
 
  
if __name__ == '__main__':
  x_train,x_test,features=load_data()
  split_fea_index=choose_best_to_split(x_train)
  newtree=build_decesion_tree(x_train,features)
  #print(newtree)
  #classLabel=classify(newtree, features, ['7.4','0.66','0','1.8','0.075','13','40','0.9978','3.51','0.56','9.4','5'] )
  #print(classLabel)
  
  count=0
  for test in x_test:
    label=classify(newtree, features,test)
    
    if(label==test[-1]):
      count=count+1
  acucy=float(count/len(x_test))
  print(acucy)

测试的准确率大概在0.7左右。至此决策树分类算法结束。本文代码地址

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python使用reportlab将目录下所有的文本文件打印成pdf的方法
May 20 Python
Python检测网站链接是否已存在
Apr 07 Python
Python采用Django开发自己的博客系统
Sep 29 Python
Python解析excel文件存入sqlite数据库的方法
Nov 15 Python
Python PyQt4实现QQ抽屉效果
Apr 20 Python
如何用python写一个简单的词法分析器
Dec 18 Python
pytorch标签转onehot形式实例
Jan 02 Python
python对数组进行排序,并输出排序后对应的索引值方式
Feb 28 Python
Python爬虫爬取、解析数据操作示例
Mar 27 Python
python 基于opencv实现高斯平滑
Dec 18 Python
python中yield的用法详解
Jan 13 Python
Flask response响应的具体使用
Jul 15 Python
python实现决策树分类
Aug 30 #Python
python实现多人聊天室
Mar 31 #Python
Python实现将数据写入netCDF4中的方法示例
Aug 30 #Python
Python使用爬虫抓取美女图片并保存到本地的方法【测试可用】
Aug 30 #Python
Python使用一行代码获取上个月是几月
Aug 30 #Python
Python实现的读取/更改/写入xml文件操作示例
Aug 30 #Python
python实现录音小程序
Oct 26 #Python
You might like
收音机发烧友应当熟知的100条知识
2021/03/02 无线电
PHP学习笔记之三 数据库基本操作
2011/01/17 PHP
PHP常用排序算法实例小结【基本排序,冒泡排序,快速排序,插入排序】
2017/02/07 PHP
PHP递归实现文件夹的复制、删除、查看大小操作示例
2017/08/11 PHP
基于php数组中的索引数组和关联数组详解
2018/03/12 PHP
yii2 上传图片的示例代码
2018/11/02 PHP
eval与window.eval的差别分析
2011/03/17 Javascript
使用jquery写个更改表格行顺序的小功能
2014/04/29 Javascript
通过js来制作复选框的全选和不选效果
2014/05/22 Javascript
jquery+ajax实现跨域请求的方法
2015/01/20 Javascript
IE6兼容透明背景图片及解决方案
2015/08/19 Javascript
CSS javascript 结合实现悬浮固定菜单效果
2015/08/23 Javascript
jquery实现点击弹出可放大居中及关闭的对话框(附demo源码下载)
2016/05/10 Javascript
基于vue的下拉刷新指令和滚动刷新指令
2016/12/23 Javascript
vue2.0实现导航菜单切换效果
2017/05/08 Javascript
浅谈vue实现数据监听的函数 Object.defineProperty
2017/06/08 Javascript
详解Vue.js分发之作用域槽
2017/06/13 Javascript
Angular使用过滤器uppercase/lowercase实现字母大小写转换功能示例
2018/03/27 Javascript
详解JavaScript的内存空间、赋值和深浅拷贝
2019/04/17 Javascript
弱类型语言javascript中 a,b 的运算实例小结
2019/08/07 Javascript
node.js中fs文件系统模块的使用方法实例详解
2020/02/13 Javascript
vue 根据选择的月份动态展示日期对应的星期几
2021/02/06 Vue.js
python调用新浪微博API项目实践
2014/07/28 Python
python的pip安装以及使用教程
2018/09/18 Python
基于MATLAB和Python实现MFCC特征参数提取
2019/08/13 Python
Python实现Wordcloud生成词云图的示例
2020/03/30 Python
解决Pycharm双击图标启动不了的问题(JetBrains全家桶通用)
2020/08/07 Python
python 中 .py文件 转 .pyd文件的操作
2021/03/04 Python
CSS3近阶段篇之酷炫的3D旋转透视
2016/04/28 HTML / CSS
深入理解css中vertical-align属性
2017/04/18 HTML / CSS
移动通信专业自荐信范文
2013/11/12 职场文书
生产现场工艺工程师岗位职责
2013/11/28 职场文书
烹饪大赛策划方案
2014/05/26 职场文书
医院财务人员岗位职责
2015/04/14 职场文书
八年级作文之友情
2019/11/25 职场文书
将图片保存到mysql数据库并展示在前端页面的实现代码
2021/05/02 MySQL