Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >决策树分类鸢尾花数据集python实现

决策树分类鸢尾花数据集python实现

作者头像
kalifa_lau
发布于 2019-04-01 03:16:11
发布于 2019-04-01 03:16:11
1.3K00
代码可运行
举报
文章被收录于专栏:kalifaの日々kalifaの日々
运行总次数:0
代码可运行

代码行数230,由于每次执行代码选取的训练集不同,所以每次执行得到的正确率也不同,最好的情况是正确率达到83%。

特征值离散化的思路:

既然最终的分类是分成三种,那我猜测每个特征的取值也可以分成三个区间,那也就是求两个分割值。求分割值用双层for循环找使得信息熵最小的下标i和j。

代码整体思路:

1 . 先处理数据,shuffle函数随机抽取80%样本做训练集。 2 . 特征值离散化 3 . 用信息熵来递归地构造树 4 . 用构造好的树来判断剩下20%的测试集,求算法做分类的正确率

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# coding: utf-8

# In[1]:


from sklearn import datasets
import math
import numpy as np


# In[69]:


def getInformationEntropy(arr,leng):
    #print("length = ",leng)
    return -(arr[0]/leng*math.log(arr[0]/leng if arr[0]>0 else 1)+              arr[1]/leng*math.log(arr[1]/leng if arr[1]>0 else 1)+              arr[2]/leng*math.log(arr[2]/leng if arr[2]>0 else 1))

#informationEntropy = getInformationEntropy(num,length)
#print(informationEntropy)


# In[105]:


#离散化特征一的值
def discretization(index):
    
    feature1 = np.array([iris.data[:,index],iris.target]).T
    feature1 = feature1[feature1[:,0].argsort()]

    counter1 = np.array([0,0,0])
    counter2 = np.array([0,0,0])
    
    resEntropy = 100000
    for i in range(len(feature1[:,0])):

        counter1[int(feature1[i,1])] = counter1[int(feature1[i,1])] + 1
        counter2 = np.copy(counter1)

        for j in range(i+1,len(feature1[:,0])):

            counter2[int(feature1[j,1])] =  counter2[int(feature1[j,1])] + 1
            #print(i,j,counter1,counter2)
            #贪心算法求最优的切割点
            if i != j and j != len(feature1[:,0])-1:

                #print(counter1,i+1,counter2-counter1,j-i,np.array(num)-counter2,length-j-1)

                sum = (i+1)*getInformationEntropy(counter1,i+1) +                 (j-i)*getInformationEntropy(counter2-counter1,j-i) +                 (length-j-1)*getInformationEntropy(np.array(num)-counter2,length-j-1)
                if sum < resEntropy:
                    resEntropy = sum
                    res = np.array([i,j])
    res_value = [feature1[res[0],0],feature1[res[1],0]]
    print(res,resEntropy,res_value)
    return res_value
            


# In[122]:


#求合适的分割值
def getRazors():
    a = []
    for i in range(len(iris.feature_names)):
        print(i)
        a.append(discretization(i))

    return np.array(a)


# In[326]:


#随机抽取80%的训练集和20%的测试集
def divideData():
    completeData = np.c_[iris.data,iris.target.T]
    np.random.shuffle(completeData)
    trainData = completeData[range(int(length*0.8)),:]
    testData = completeData[range(int(length*0.8),length),:]
    return [trainData,testData]


# In[213]:


def getEntropy(counter):

    res = 0
    denominator = np.sum(counter)
    if denominator == 0:
        return 0
    for value in counter:
        if value == 0:
            continue
        res += value/denominator * math.log(value/denominator if value>0 and denominator>0 else 1)
    return -res



# In[262]:


def findMaxIndex(dataSet):
    maxIndex = 0
    maxValue = -1
    for index,value in enumerate(dataSet):
        if value>maxValue:
            maxIndex = index
            maxValue = value
    return maxIndex


# In[308]:


def recursion(featureSet,dataSet,counterSet):
    #print("函数开始,剩余特征:",featureSet,"  剩余结果长度:",len(dataSet))
    
    if(counterSet[0]==0 and counterSet[1]==0 and counterSet[2]!=0):
        return iris.target_names[2]
    if(counterSet[0]!=0 and counterSet[1]==0 and counterSet[2]==0):
        return iris.target_names[0]
    if(counterSet[0]==0 and counterSet[1]!=0 and counterSet[2]==0):
        return iris.target_names[1]
    
    if len(featureSet) == 0:
        return iris.target_names[findMaxIndex(counterSet)]
    if len(dataSet) == 0:
        return []
    
    res = 1000
    final = 0
    #print("剩余特征数目", len(featureSet))
    for feature in featureSet:
        i = razors[feature][0]
        j = razors[feature][1]
        #print("i = ",i," j = ",j)
        set1 = []
        set2 = []
        set3 = []
        counter1 = [0,0,0]
        counter2 = [0,0,0]
        counter3 = [0,0,0]
        for data in dataSet:
            index = int(data[-1])
            #print("data ",data," index ",index)
            
            if data[feature]< i :
                set1.append(data)
                counter1[index] = counter1[index]+1
            elif data[feature] >= i and data[feature] <=j:
                set2.append(data)
                counter2[index] = counter2[index]+1
            else:
                set3.append(data)
                counter3[index] = counter3[index]+1

        
        a =( len(set1)*getEntropy(counter1) +         len(set2)*getEntropy(counter2) +         len(set3)*getEntropy(counter3) )/ len(dataSet)
  
        #print("特征编号:",feature,"选取该特征得到的信息熵:",a)
        if a<res :
            res = a
            final = feature

    #返回被选中的特征的下标
    #sequence.append(final)
    #print("最终在本节点上选取的特征编号是:",final)        
    featureSet.remove(final)
    child = [0,0,0,0]
    child[0] = final
    child[1] = recursion(featureSet,set1,counter1)
    child[2] = recursion(featureSet,set2,counter2)
    child[3] = recursion(featureSet,set3,counter3)
    
    return child 

                 

# In[322]:



def judge(data,tree):

    root = "unknow"
    while(len(tree)>0):
        if isinstance(tree,str) and tree in iris.target_names:
            return tree
        root = tree[0]
        if(isinstance(root,str)):
            return root
        
        if isinstance(root,int):
            if data[root]<razors[root][0] and tree[1] != [] :
                tree = tree[1]
            elif tree[2] != [] and (tree[1]==[] or (data[root]>=razors[root][0] and data[root]<=razors[root][1])):
                tree = tree[2]
            else :
                tree = tree[3]
    return root            

# In[327]:


if __name__ == '__main__':
    
    iris = datasets.load_iris()
    num = [0,0,0]
    for row in iris.data:
        num[int(row[-1])] = num[int(row[-1])] + 1

    length = len(iris.target)
    [trainData,testData] = divideData()
    
    razors = getRazors()

    tree = recursion(list(range(len(iris.feature_names))),           trainData,[np.sum(trainData[:,-1]==0),            np.sum(trainData[:,-1]==1),np.sum(trainData[:,-1]==2)])
    print("本次选取的训练集构建出的树: ",tree)
    index = 0
    right = 0
    for data in testData:
        result = judge(testData[index],tree)
        truth = iris.target_names[int(testData[index][-1])]
                       
        print("result is ",result ,"  truth is ",truth)
        index = index + 1
        if result == truth:
            right = right + 1
    print("正确率 : ",right/index)
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019.03.28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
python实现决策树
熵:用于表示随机变量不确定性的度量 。假设X是一个取值有限的随机变量,其概率分布为:
西西嘛呦
2020/08/26
7580
python实现决策树
python导入鸢尾花数据集_python数据挖掘学习笔记】十九.鸢尾花数据集可视化、线性回归、决策树花样分析…
#2018-04-05 16:57:26 April Thursday the 14 week, the 095 day SZ SSMR
全栈程序员站长
2022/07/31
2.6K0
基于感知机Perceptron的鸢尾花分类实践
本文代码参考了此处:fengdu78,本人添加了感知机算法的对偶形式,并对不同的参数下的迭代次数进行比较。
Michael阿明
2020/07/13
2.2K0
ML学习笔记之XGBoost实现对鸢尾花数据集分类预测
import xgboost as xgb import numpy as np import pandas as pd from sklearn.model_selection import train_test_split if __name__ == '__main__': iris_feature_E = "sepal lenght", "sepal width", "petal length", "petal width" iris_feature = "the length
Jetpropelledsnake21
2019/12/24
8440
实验一:鸢尾花数据集分类「建议收藏」
利用机器学习算法构建模型,根据鸢尾花的花萼和花瓣大小,区分鸢尾花的品种。实现一个基础的三分类问题。
全栈程序员站长
2022/08/02
8K0
实验一:鸢尾花数据集分类「建议收藏」
机器学习之鸢尾花-决策树
Decision Trees (DTs) 是一种用来 classification 和 regression 的无参监督学习方法。其目的是创建一种模型从数据特征中学习简单的决策规则来预测一个目标变量的值。
python与大数据分析
2022/03/11
4950
机器学习之鸢尾花-决策树
Python笔记:并查集(DSU)结构简介
并查集(Disjoint Set Union)是一种常用的处理不相交集合间的合并与查找功能的树形结构,配合与之对应的联合-搜索算法(Union Find Algorithm),可以将不相交集合间的合并与查找功能的时间复杂度大幅缩减至 O ( l o g N ) O(logN) O(logN)乃至 O ( 1 ) O(1) O(1)的量级。
codename_cys
2021/03/26
4.1K0
【说站】python决策树算法的实现步骤
python决策树算法的实现步骤 步骤 1、计算数据集S中的每个属性的熵 H(xi) 2、选取数据集S中熵值最小(或者信息增益,两者等价)的属性 3、在决策树上生成该属性节点 4、使用剩余结点重复以上步骤生成决策树的属性节点 实例 import numpy as np import math from collections import Counter   # 创建数据 def create_data():     X1 = np.random.rand(50, 1)*100     X2 = np.
很酷的站长
2022/11/24
3440
【说站】python决策树算法的实现步骤
分别用逻辑回归和决策树实现鸢尾花数据集分类
学习了决策树和逻辑回归的理论知识,决定亲自上手尝试一下。最终导出决策树的决策过程的图片和pdf。逻辑回归部分参考的是用逻辑回归实现鸢尾花数据集分类,感谢原作者xiaoyangerr 注意:要导出为pdf先必须安装graphviz(这是一个软件)并且安装pydotplus这个包,把它的graphviz加入系统的环境变量path,否则会报错 决策树 from sklearn.datasets import load_iris from sklearn import tree from sklearn.mo
Aidol
2020/07/23
1.5K0
分别用逻辑回归和决策树实现鸢尾花数据集分类
决策树(Decision Tree,DT)
Quinlan在1986年提出的ID3算法、1993年提出的C4.5算法 Breiman等人在1984年提出的CART算法
Michael阿明
2020/07/13
1.7K0
决策树(Decision Tree,DT)
鸢尾花完整的python代码(鸢尾花分类)
逻辑回归(Logistic Regression)是用于处理因变量为分类变量的回归问题,常见的是二分类或二项分布问题,也可以处理多分类问题,它实际上是属于一种分类方法。
全栈程序员站长
2022/07/31
2.2K0
鸢尾花完整的python代码(鸢尾花分类)
决策树实现鸢尾花三分类
Iris(鸢尾花)数据集是多重变量分析的数据集。 数据集包含150行数据,分为3类,每类50行数据。 每行数据包含4个属性:Sepal Length(花萼长度)、Sepal Width(花萼宽度)、Petal Length(花瓣长度)和Petal Width(花瓣宽度)。可通过这4个属性预测鸢尾花卉属于三个种类(Setosa,Versicolour,Virginica)中的哪一类。
海天一树
2018/08/17
6080
决策树实现鸢尾花三分类
分类-KNN算法(鸢尾花分类实战)
K近邻(K Nearest Neighbors,KNN)算法是最简单的分类算法之一,也就是根据现有训练数据判断输入样本是属于哪一个类别。
唔仄lo咚锵
2022/11/30
9400
分类-KNN算法(鸢尾花分类实战)
鸢尾花(Iris)数据集入门
鸢尾花(Iris)数据集是机器学习领域中最经典的数据集之一。它由三种不同品种的鸢尾花的测量数据组成:山鸢尾(setosa)、变色鸢尾(versicolor)和维吉尼亚鸢尾(virginica)。 在这篇文章中,我们将使用Markdown代码格式详细介绍鸢尾花数据集的基本信息以及如何加载和探索这个数据集。
大盘鸡拌面
2023/10/20
2.8K0
进阶的决策树,从ID3升级到C4.5,模型大升级
上一篇文章当中介绍了一种最简单构造决策树的方法——ID3算法,也就是每次选择一个特征进行拆分数据。这个特征有多少个取值那么就划分出多少个分叉,整个建树的过程非常简单。如果错过了上篇文章的同学可以从下方传送门去回顾一下:
TechFlow-承志
2020/05/29
1.1K0
进阶的决策树,从ID3升级到C4.5,模型大升级
使用Python实现决策树算法
决策树是一种常用的机器学习算法,它可以用于分类和回归任务。在本文中,我们将使用Python来实现一个基本的决策树分类器,并介绍其原理和实现过程。
Echo_Wish
2024/04/08
3710
【机器学习】决策树代码练习
1.分类决策树模型是表示基于特征对实例进行分类的树形结构。决策树可以转换成一个if-then规则的集合,也可以看作是定义在特征空间划分上的类的条件概率分布。
算法进阶
2022/06/02
4020
【机器学习】决策树代码练习
机器学习-决策树的优化
今天我们会使用真实的数据来建一棵决策树,编写代码,将其可视化,这样您即可明白决策树是如何在幕后工作的。这里我们使用sklearn中自带的数据集Iris flower data set,该数据集由来自三种鸢尾 ( Iris setosa , Iris virginica和Iris versicolor )中的每一种的50个样品组成。从每个样品测量四个特征 :萼片和花瓣的长度和宽度,以厘米为单位。基于这四个特征的组合,Fisher开发了一种线性判别模型,以区分物种。
XXXX-user
2019/08/29
6020
机器学习-决策树的优化
python机器学习实现鸢尾花的分类
鸢尾花(学名:Iris tectorum Maxim)属百合目、鸢尾科,可供观赏,花香气淡雅,可以调制香水,其根状茎可作中药,全年可采,具有消炎作用。
用户6719124
2019/11/17
6.3K0
【机器学习基础】数学推导+纯Python实现机器学习算法4:决策树之ID3算法
作为机器学习中的一大类模型,树模型一直以来都颇受学界和业界的重视。目前无论是各大比赛各种大杀器的XGBoost、lightgbm还是像随机森林、Adaboost等典型集成学习模型,都是以决策树模型为基础的。传统的经典决策树算法包括ID3算法、C4.5算法以及GBDT的基分类器CART算法。
黄博的机器学习圈子
2020/06/21
9000
推荐阅读
相关推荐
python实现决策树
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验