百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

步步为营KDD:决策树算法

off999 2024-11-26 07:24 38 浏览 0 评论

概述

算法原理

1.首先,找到能够最好地将数据集分裂的特性(feature,或叫属性),

2.然后,对分裂后的子集执行同样的操作,

3.直到没有属性能够继续分裂或子集中的实例都属于同一个类为止。

采用(所有列别所有可能值包含的信息的期望值)来度量数据集的信息量,信息增益等于分裂前的熵减去分裂后的熵。

数据类型

数值型和标称型,树构造算法只适用于标称型数据,因此数据值数据必须离散化。

优点

计算复杂度不高,输出结果易于理解,对中间值的缺失不敏感,可以处理不相关特征数据。

缺点

可能会产生过度匹配问题。

香农熵(Shannon entropy)

该算法最关键的一环就是如何找到最好的分裂特性。利用信息论(information theory)可获得分裂前和分裂后的信息。分裂前和分裂后信息发生的变化被称作信息增益(information gain)。通过对每个特性进行分裂测试,我们可以知道提供最大信息增益的特性。能够提供最大信息增益的分裂就是我们想要的分裂。

若要计算信息增益,我们需要知道如何量化度量分裂前和分裂后的信息。熵(entropy,拼音:shang)是由鲁道夫·克劳修斯(Rudolf Clausius)提出的度量体系混乱程度的量。香浓(Shannon)将熵的概念引入到信息论中来。

在信息论中,熵被用来衡量一个随机变量出现的期望值。假设一个随机变量X的值域是{x1, x2......, xn},则该随机变量的熵值H定义为:

其中,E表示期望函数,I(X)表示X的信息量,也是随机变量。I(xi)是值xi的信息定义。I(xi)的公式如下:

如果用p表示X的概率质量函数(probability mass function),则熵的公式可以表示为:

b是对数的底,可以是2、e、10。当b=2时,熵的单位是bit;当b=e时,熵的单位是nat;当b=10时,熵的单位是dit。

由以上公式可知,当随机变量只含有一个值时,那么出现该值得概率就是100%,也就是p = 1,log p = 0。熵值就是0。当随机变量含有多个值时,熵值就会增大。

代码实现

以下代码采用python实现使用信息增益获取最优分裂特性的决策树算法:


#!/usr/bin/env python
# _*_ coding: utf-8 _*_

from math import log
import operator

'''
计算数据集的香浓熵

基本思想:
首先计算数据集中各个类的概率,
然后对各个类的概率计算以2为底的对数得到该类的信息量,
最后让各个类的概率乘以对应的对数并相减得到数据集的熵。
'''
def calcShannonEnt(dataSet):
    entries_count = len(dataSet)
    labelCounts={}
    for row in dataSet:
        label = row[-1]
        if(label not in labelCounts.keys()):
            labelCounts[label] = 0
        labelCounts[label] += 1
    entropy=0.0
    for key in labelCounts:
        prob = float(labelCounts[key])/entries_count
        entropy -= prob * log(prob, 2)
    return entropy

'''
分裂数据集

基本思想:
迭代数据集的每个实例,
当实例的指定属性的值等于指定值时,获取该实例的其他属性的值构成新实例,
将新实例添加到新的数据集中。
'''
def splitDataSet(dataSet, axis, value):
    splited_dataSets = []
    for row in dataSet:
        if row[axis] == value:
            reducedRow = row[:axis]
            reducedRow.extend(row[axis+1:])
            splited_dataSets.append(reducedRow)
    return splited_dataSets

'''
选择指定数据集用于分裂的最好的特性(属性)

基本思想:
对数据集中的每个特性进行分裂,并计算分裂后的信息增益,
选择产生最大信息增益的特性作为最优特性。
'''
def chooseBestFeatureToSplit(dataSet):
    features_count = len(dataSet[0]) - 1
    baseEntropy = calcShannonEnt(dataSet)
    bestInfoGain = 0.0
    bestFeature = -1
    for i in range(features_count):
        featureVals = [row[i] for row in dataSet]
        distinctVals = set(featureVals)
        newEntropy = 0.0
        for val in distinctVals:
            subDataSet = splitDataSet(dataSet, i, val)
            prob = len(subDataSet) / float(len(dataSet))
            newEntropy += prob * calcShannonEnt(subDataSet)
        infoGain = baseEntropy - newEntropy
        if infoGain > bestInfoGain:
            bestInfoGain = infoGain
            bestFeature = i
    return bestFeature

'''
当所有属性都参与分裂,而子集的实例仍属于多个类时,则采用占比最大的类。
'''
def majorityCnt(classList):
    classCount = {}
    for vote in classList:
        if vote not in classCount.keys():
            classCount[vote] = 0
        classCount[vote] += 1
    sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True)
    return sortedClassCount[0][0]

'''
创建树结构
'''
def createTree(dataSet, labels):
    featureLabels = labels[:]
    classList = [row[-1] for row in dataSet]
    if classList.count(classList[0]) == len(classList):
        return classList[0]
    if len(dataSet[0]) == 1:
        return majorityCnt(classList)
    bestFeatureIndex = chooseBestFeatureToSplit(dataSet)
    bestFeatureLabel = featureLabels[bestFeatureIndex]
    myTree = {bestFeatureLabel:{}}
    del(featureLabels[bestFeatureIndex])
    featureVals = [row[bestFeatureIndex] for row in dataSet]
    distinctVals = set(featureVals)
    for value in distinctVals:
        subFeatureLabels = featureLabels[:]
        myTree[bestFeatureLabel][value] = createTree(splitDataSet(dataSet, bestFeatureIndex, value), subFeatureLabels)
    return myTree

'''
根据树结构对测试向量进行分类
'''
def classify(inputTree, featLabels, testVec):
    firstStr = inputTree.keys()[0]
    secondDict = inputTree[firstStr]
    featIndex = featLabels.index(firstStr)
    classLabel = "unknown"
    for key in secondDict.keys():
        if testVec[featIndex] == key:
            if type(secondDict[key]).__name__ == 'dict':
                classLabel = classify(secondDict[key], featLabels, testVec)
            else:
                classLabel = secondDict[key]
    return classLabel

'''
创建测试数据集
'''
def createDataSet():
    dataSet = [
        [1,1,'yes'],
        [1,1,'yes'],
        [1,0,'no'],
        [0,1,'no'],
        [0,1,'no']
        ]
    labels = ['no surfacing', 'flippers']
    return dataSet, labels

相关推荐

台式机显卡天梯(笔记本显卡排行天梯图)

丽台显卡性能排行第一的是:丽台QuadroRTX8000第二是:丽台QuadroP620第三的是:丽台QuadroP2000第四是:丽台Quadrop4000第五是:丽台Quadrop1...

win7更换壁纸(win7更换壁纸显示黑色)

1、首先点开桌面左下角的开始按钮然后在弹出的界面中找到控制面板并打开。2、在控制面板界面的个性化专栏中找到在找到屏幕保护程序并打开。3、在打开的新界面中找到屏幕保护程序并将选项更改为“无”保存后就完成...

如何获取windows7正版(如何获得正版win7)

关于这个问题,获得Windows7激活密钥的方法有几种:1.在购买Windows7时,通常会附带一张带有激活密钥的正版产品密钥卡。您可以查看产品盒内的卡片或说明书,以获取此密钥。2.如果您购买...

重装系统win7旗舰版62位(如何用重装系统win7旗舰版)

要重装Windows7系统,可以按照以下步骤进行操作:1.准备计算机:确保计算机已经安装了Windows11操作系统,因为Windows7的兼容性问题可能会影响安装过程。如果计算机上没有安装W...

tp link app(TP LINKapp下载)

tplink手机app官方版是一款专为TP-LINK路由器手机设置应用,能够更好的管理TP-LINK路由器。tplink手机客户端特色1.实时获取路由器状态消息2.本地管理局域网内的TP-LINK路由...

如何彻底关掉windows更新(如果关闭windows更新)

方法一:Windows设置  要想关闭Win10自动更新,比较简单的一种方法就是进入到Windows设置中,将Windows更新直接关闭。步骤如下:  1、按“Windows+I”键,打开Wind...

pe怎么制作u盘启动盘(pe制作u盘启动工具)

制作U盘启动PE的方法:1、准备一个8G或以上容量的U盘,接入电脑,u盘启动PE制作工具会自动识别u盘,2、接着,设置模式和格式,一般默认选择USB—HDD以及NTFS,点击一键制作成U盘启动PE...

iso镜像系统下载(下载iso镜像文件)

vmwareiso镜像文件可以从VMware官网下载。具体的下载步骤如下:1.打开VMware官网,进入产品下载页面。2.在产品下载页面,选择需要下载的VMware产品,比如VMwareWork...

电脑分区工具哪个好用(电脑分区工具下载)

电脑分区助手使用方法1.首先先打开我们的分区助手。2.我们把鼠标放上去然后点击鼠标右键选择合并并分区。3.然后勾选上我们未分配的空间。4.然后就扩展完成了。1、《CrystalDiskMark》是一款...

字体大小怎么调(win10字体大小怎么调)

在大多数文字处理软件和编辑器中,设置字体大小通常是通过以下方法之一完成的:1.使用快捷键:常见的快捷键是使用Ctrl(或Command键)+"+"或"-...

联想电脑重装系统下载(联想系统重装软件)

联想电脑重装系统步骤:1、制作好U盘启动盘,然后把下载的联想win7系统iso文件直接复制到U盘的GHO目录下:2、在联想电脑上插入U盘,重启后不停按F12或Fn+F12快捷键打开启动菜单,选择U盘项...

qq靓号注册入口(qq靓号注册免费申请网址)
qq靓号注册入口(qq靓号注册免费申请网址)

目前是没有qq靓号申请器的,因为qq靓号都是由腾讯qq直售代理的,想要申请只能在会员界面支付若干个月会员便可以获得,不同的靓号价格可能不一样,使用期限必须要有qq超级会员。QQ靓号是腾讯公司推出的一种增值QQ号码,是腾讯QQ新推出的一款邮箱...

2026-01-11 01:03 off999

电脑显示已连接上但是无法上网

排查处理:一、若使用的是公共网络:1.尝试在人流量较少的地方使用,并确认热点可正常使用。2.请确认是否需通过浏览器登录网站注册后才能上网。二、若使用的是家庭网络,建议连接其他wifi或手机个人热点进行...

手动更新显卡驱动(更新显卡驱动教程)

方法如下:1.打开设备管理器。在Windows10中可以键入"设备管理器"来搜索。2.展开"显示适配器"选项。3.右键单击要更新的显卡并选择"更新驱动程...

清理注册表软件(注册表清理工具哪个好)
  • 清理注册表软件(注册表清理工具哪个好)
  • 清理注册表软件(注册表清理工具哪个好)
  • 清理注册表软件(注册表清理工具哪个好)
  • 清理注册表软件(注册表清理工具哪个好)

取消回复欢迎 发表评论: