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 MySQLdb模块连接操作mysql数据库实例
Apr 08 Python
python中星号变量的几种特殊用法
Sep 07 Python
Python中模块与包有相同名字的处理方法
May 05 Python
pandas.loc 选取指定列进行操作的实例
May 18 Python
详解python的四种内置数据结构
Mar 19 Python
Python 旋转打印各种矩形的方法
Jul 09 Python
Django用户认证系统 组与权限解析
Aug 02 Python
Python之Django自动实现html代码(下拉框,数据选择)
Mar 13 Python
Django REST Swagger实现指定api参数
Jul 07 Python
Python语言编写智力问答小游戏功能
Oct 13 Python
详解Python3.8+PyQt5+pyqt5-tools+Pycharm配置详细教程
Nov 02 Python
plt.figure()参数使用详解及运行演示
Jan 08 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
用mysql内存表来代替php session的类
2009/02/01 PHP
php程序之die调试法 快速解决错误
2009/09/17 PHP
PHP下打开phpMyAdmin出现403错误的问题解决方法
2013/05/23 PHP
php可扩展的验证类实例(可对邮件、手机号、URL等验证)
2015/07/09 PHP
基于PHP实现短信验证码接口(容联运通讯)
2016/09/06 PHP
Yii2配置Nginx伪静态的方法
2017/05/05 PHP
JavaScript 选中文字并响应获取的实现代码
2011/08/28 Javascript
你必须知道的Javascript知识点之"单线程事件驱动"的使用
2013/04/23 Javascript
onbeforeunload与onunload事件异同点总结
2013/06/24 Javascript
js实现图片从左往右渐变切换效果的方法
2015/02/06 Javascript
javascript+HTML5的canvas实现七夕情人节3D玫瑰花效果代码
2015/08/04 Javascript
AngularJS页面访问时出现页面闪烁问题的解决
2016/03/06 Javascript
JavaScript对象数组如何按指定属性和排序方向进行排序
2016/06/15 Javascript
基于HTML+CSS+JS实现增加删除修改tab导航特效代码
2016/08/05 Javascript
vue实现移动端图片裁剪上传功能
2020/08/18 Javascript
AngularJS实现的输入框字数限制提醒功能示例
2017/10/26 Javascript
js中bool值的转换及“&&”、“||”、 “!!”详解
2017/12/21 Javascript
js实现动态增加文件域表单功能
2018/10/22 Javascript
layui实现数据表格点击搜索功能
2020/03/26 Javascript
详解Vuex下Store的模块化拆分实践
2019/07/31 Javascript
uni-app如何实现增量更新功能
2020/01/03 Javascript
vue $router和$route的区别详解
2020/12/02 Vue.js
Vite和Vue CLI的优劣
2021/01/30 Vue.js
Python实现判断字符串中包含某个字符的判断函数示例
2018/01/08 Python
Python实现定期检查源目录与备份目录的差异并进行备份功能示例
2019/02/27 Python
python实现定时压缩指定文件夹发送邮件
2020/12/22 Python
python/Matplotlib绘制复变函数图像教程
2019/11/21 Python
TensorFlow固化模型的实现操作
2020/05/26 Python
国际鲜花速递专家:Floraqueen
2016/11/24 全球购物
房地产项目策划书
2014/02/05 职场文书
英语教学随笔感言
2014/02/20 职场文书
孝敬父母的活动方案
2014/08/28 职场文书
入党宣誓仪式主持词
2015/06/29 职场文书
婚礼答谢词范文
2015/09/29 职场文书
golang elasticsearch Client的使用详解
2021/05/05 Golang
python 常用的异步框架汇总整理
2021/06/18 Python