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验证文件是否可读写代码分享
Dec 11 Python
python搭建服务器实现两个Android客户端间收发消息
Apr 12 Python
python中实现字符串翻转的方法
Jul 11 Python
Python实现Event回调机制的方法
Feb 13 Python
详解django2中关于时间处理策略
Mar 06 Python
Django中如何防范CSRF跨站点请求伪造攻击的实现
Apr 28 Python
python网络编程 使用UDP、TCP协议收发信息详解
Aug 29 Python
用Python 爬取猫眼电影数据分析《无名之辈》
Jul 24 Python
详解python with 上下文管理器
Sep 02 Python
Django展示可视化图表的多种方式
Apr 08 Python
python使用pymysql模块操作MySQL
Jun 16 Python
python中pymysql包操作数据库方法
Apr 19 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
PHP中实现进程间通讯
2006/10/09 PHP
FirePHP 推荐一款PHP调试工具
2011/04/23 PHP
PHP获取MAC地址的函数代码
2011/09/11 PHP
PHP函数篇详解十进制、二进制、八进制和十六进制转换函数说明
2011/12/05 PHP
解析php如何将日志写进syslog
2013/06/28 PHP
joomla数据库操作示例代码
2016/01/06 PHP
Zend Framework框架教程之Zend_Db_Table_Rowset用法实例分析
2016/03/21 PHP
PHP加密解密类实例代码
2016/07/20 PHP
php实现给二维数组中所有一维数组添加值的方法
2017/02/04 PHP
Jquery异步请求数据实例代码
2011/12/28 Javascript
jQuery学习笔记 操作jQuery对象 CSS处理
2012/09/19 Javascript
一个很有趣3D球状标签云兼容IE8
2014/08/22 Javascript
详解JavaScript对W3C DOM模版的支持情况
2015/06/16 Javascript
javascript文本模板用法实例
2015/07/31 Javascript
js实现简单折叠、展开菜单的方法
2015/08/28 Javascript
客户端验证用户名和密码的方法详解
2016/06/16 Javascript
详解使用vue-router进行页面切换时滚动条位置与滚动监听事件
2017/03/08 Javascript
es6学习之解构时应该注意的点
2017/08/29 Javascript
JavaScript程序设计高级算法之动态规划实例分析
2017/11/24 Javascript
vue中$nextTick的用法讲解
2019/01/17 Javascript
layerui代码控制tab选项卡,添加,关闭的实例
2019/09/04 Javascript
JavaScript实现alert弹框效果
2020/11/19 Javascript
在Python中操作字典之setdefault()方法的使用
2015/05/21 Python
python实现遍历文件夹修改文件后缀
2018/08/28 Python
python读取并写入mat文件的方法
2019/07/12 Python
Python操作SQLite/MySQL/LMDB数据库的方法
2019/11/07 Python
python根据文本生成词云图代码实例
2019/11/15 Python
详解淘宝H5 sign加密算法
2020/08/25 HTML / CSS
澳洲的服装老品牌:SABA
2018/02/06 全球购物
个人自我评价范文
2014/02/05 职场文书
一分钟演讲稿
2014/04/30 职场文书
企业安全生产演讲稿
2014/05/09 职场文书
社区综治宣传月活动总结
2014/07/02 职场文书
财务人员岗位职责
2015/02/03 职场文书
工作会议通知
2015/04/15 职场文书
Jsonp劫持学习
2021/04/01 PHP