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 ZipFile模块详解
Nov 01 Python
Python深入学习之装饰器
Aug 31 Python
将Emacs打造成强大的Python代码编辑工具
Nov 20 Python
Python如何import文件夹下的文件(实现方法)
Jan 24 Python
基于python3实现socket文件传输和校验
Jul 28 Python
python批量下载网站马拉松照片的完整步骤
Dec 05 Python
Python合并2个字典成1个新字典的方法(9种)
Dec 19 Python
在脚本中单独使用django的ORM模型详解
Apr 01 Python
Python发起请求提示UnicodeEncodeError错误代码解决方法
Apr 21 Python
Python+Selenium随机生成手机验证码并检查页面上是否弹出重复手机号码提示框
Sep 21 Python
python调用百度API实现人脸识别
Nov 17 Python
Python爬虫实现selenium处理iframe作用域问题
Jan 27 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
基于HBase Thrift接口的一些使用问题及相关注意事项的详解
2013/06/03 PHP
PHP图片等比缩放类SimpleImage使用方法和使用实例分享
2014/04/10 PHP
php的sso单点登录实现方法
2015/01/08 PHP
PHP单例模式是什么 php实现单例模式的方法
2016/05/14 PHP
laravel学习笔记之模型事件的几种用法示例
2017/08/15 PHP
thinkphp5.1 文件引入路径问题及注意事项
2018/06/13 PHP
用JavaScript对JSON进行模式匹配(Part 1-设计)
2010/07/17 Javascript
JavaScript Scoping and Hoisting 翻译
2012/07/03 Javascript
js+JQuery返回顶部功能如何实现
2012/12/03 Javascript
jQuery之按钮组件的深入解析
2013/06/19 Javascript
JQuery页面的表格数据的增加与分页的实现
2013/12/10 Javascript
Javascript设置对象的ReadOnly属性(示例代码)
2013/12/25 Javascript
jQuery qrcode生成二维码的方法
2016/04/03 Javascript
jQuery EasyUI封装简化操作
2016/09/18 Javascript
实现单层json按照key字母顺序排序的示例
2017/12/06 Javascript
nodeJS微信分享
2017/12/20 NodeJs
JS实现的抛物线运动效果示例
2018/01/30 Javascript
微信小程序学习笔记之登录API与获取用户信息操作图文详解
2019/03/29 Javascript
NodeJS多种创建WebSocket监听的方式(三种)
2020/06/04 NodeJs
Python实现统计单词出现的个数
2015/05/28 Python
深入浅析python 中的匿名函数
2018/05/21 Python
Python字典的核心底层原理讲解
2019/01/24 Python
浅谈Pycharm最有必要改的几个默认设置项
2020/02/14 Python
Python grpc超时机制代码示例
2020/09/14 Python
CSS3文本换行word-wrap解决英文文本超过固定宽度不换行
2013/10/10 HTML / CSS
英国性感内衣和睡衣品牌:Bluebella
2018/01/26 全球购物
英国布鲁姆精品店:Bloom Boutique
2018/03/01 全球购物
狼和鹿教学反思
2014/02/05 职场文书
拉拉队口号
2014/06/16 职场文书
正风肃纪剖析材料范文
2014/10/10 职场文书
初中生思想道德自我评价
2015/03/09 职场文书
退休教师欢送会致辞
2015/07/31 职场文书
2016年六一儿童节开幕词
2016/03/04 职场文书
传单、海报早OUT了,另类传单营销方案送给你!
2019/07/15 职场文书
叶县这家生产军用电台的兵工厂,人称“四机部”,走出一上将
2022/02/18 无线电
java实现web实时消息推送的七种方案
2022/07/23 Java/Android