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程序
Apr 04 Python
使用 Python 获取 Linux 系统信息的代码
Jul 13 Python
一个计算身份证号码校验位的Python小程序
Aug 15 Python
200行自定义python异步非阻塞Web框架
Mar 15 Python
Python使用gRPC传输协议教程
Oct 16 Python
Python装饰器简单用法实例小结
Dec 03 Python
详解python配置虚拟环境
Apr 08 Python
Python Pandas数据结构简单介绍
Jul 03 Python
Python绘制股票移动均线的实例
Aug 24 Python
django实现类似触发器的功能
Nov 15 Python
python运用pygame库实现双人弹球小游戏
Nov 25 Python
在keras下实现多个模型的融合方式
May 23 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
消息持续发送的完整例子
2006/10/09 PHP
php中serialize序列化与json性能测试的示例分析
2013/04/27 PHP
浅谈PHP与C#的值类型指向区别的详解
2013/05/21 PHP
Codeigniter生成Excel文档的简单方法
2014/06/12 PHP
CI(Codeigniter)的Setting增强配置类实例
2016/01/06 PHP
PHP 5.6.11 访问SQL Server2008R2的几种情况详解
2016/08/08 PHP
PHP屏蔽关键字实现方法
2016/11/17 PHP
PHP框架Laravel中实现supervisor执行异步进程的方法
2017/06/07 PHP
PHP安装BCMath扩展的方法
2019/02/13 PHP
laravel请求参数校验方法
2019/10/10 PHP
jquery中的on方法使用介绍
2013/12/29 Javascript
javascript:void(0)点击登录没反应怎么解决
2015/11/13 Javascript
跟我学习javascript的undefined与null
2015/11/17 Javascript
jQuery事件绑定用法详解
2016/09/08 Javascript
如何使用jquery实现文字上下滚动效果
2016/10/12 Javascript
Vue结合原生js实现自定义组件自动生成示例
2017/01/21 Javascript
基于JQuery的Ajax方法使用详解
2017/08/16 jQuery
原生JS实现动态加载js文件并在加载成功后执行回调函数的方法
2020/12/30 Javascript
说说Vue.js中的functional函数化组件的使用
2019/02/12 Javascript
如何HttpServletRequest文件对象并储存
2020/08/14 Javascript
[02:32]DOTA2亚洲邀请赛 VG战队巡礼
2015/02/03 DOTA
[43:24]VG vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
python 正则式 概述及常用字符
2009/05/07 Python
python实现堆和索引堆的代码示例
2018/03/19 Python
对Python中DataFrame选择某列值为XX的行实例详解
2019/01/29 Python
python提取照片坐标信息的实例代码
2019/08/14 Python
python+adb命令实现自动刷视频脚本案例
2020/04/23 Python
网页布局中CSS样式无效的十个重要原因详解
2017/08/10 HTML / CSS
LN-CC美国:伦敦时尚生活的缩影
2019/02/19 全球购物
售后专员岗位职责
2013/12/08 职场文书
村委会主任先进事迹
2014/01/15 职场文书
出纳会计岗位职责
2014/03/12 职场文书
做一个有道德的人演讲稿
2014/05/14 职场文书
学校食堂食品安全责任书
2014/07/28 职场文书
小学四年级班主任工作经验交流材料
2015/11/02 职场文书
MySQL系列之十 MySQL事务隔离实现并发控制
2021/07/02 MySQL