用python实现ID3算法

# coding: utf-8

from math import log
import operator

"""
数据样本:
编号         用腮呼吸         是否有脚蹼          属于鱼类
1              是               是                 是
2              是               否                 是
3              是               否                 否
4              否               是                 否
5              否               是                 否
"""


def createDataSet():
    dataSet = [
        [1, 1, 'yes'],
        [1, 0, 'yes'],
        [1, 0, 'no'],
        [0, 1, 'no'],
        [0, 1, 'no']
    ]
    labels = ['gill', 'filppers']
    return dataSet, labels


def calShannonEnt(dataSet):
    numEntries = len(dataSet)
    labelCounts = {}
    for featVec in dataSet:
        currentLabel = featVec[-1]
        if currentLabel not in labelCounts.keys():
            labelCounts[currentLabel] = 0
        labelCounts[currentLabel] += 1
    shannonEnt = 0
    for key in labelCounts:
        prob = float(labelCounts[key]) / numEntries
        shannonEnt -= prob * log(prob, 2)
    return shannonEnt


def splitDataSet(dataSet, axis, value):
    retDataSet = []
    for featVec in dataSet:
        if featVec[axis] == value:
            reducedFeatVec = featVec[:axis]
            reducedFeatVec.extend(featVec[axis+1:])
            retDataSet.append(reducedFeatVec)
    return retDataSet


def chooseBestFeatureToSplit(dataSet):
    numFeatures = len(dataSet[0]) - 1
    baseEntropy = calShannonEnt(dataSet)
    bestInfoGain = 0.0
    bestFeature = -1
    for i in range(numFeatures):
        # 提取了第一列特征值
        featList = [example[i] for example in dataSet]
        uniqueVals = set(featList)
        newEntropy = 0.0
        for value in uniqueVals:
            # 对i个特征值根据value进行数据集的划分
            subDataSet = splitDataSet(dataSet, i, value)
            prob = len(subDataSet) / float(len(dataSet))
            # 对照西瓜书,可以知道每个特征值信息量求解的公式如下
            newEntropy += prob * calShannonEnt(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(zip(tuple(classCount), tuple(classCount.values())),
                              key=operator.itemgetter(1), reverse=True)
    return sortedClassCount[0][0]


def createTree(dataSet, labels):
    classList = [example[-1] for example in dataSet]
    # 如果全是一样的结果就没有计算的必要,例如['no', 'no', 'no'],此时另一个分支还存在子节点
    if classList.count(classList[0]) == len(classList):
        return classList[0]
    # 如果只有一个特征,那就直接返回特征最多的那个分类,到最后一层使用,例如['yes', 'no', 'no'],最后一次分类触发
    if len(dataSet[0]) == 1:
        return majorityCnt(classList)

    # 建立决策树的根节点分类
    bestFeat = chooseBestFeatureToSplit(dataSet)
    bestFeatLabel = labels[bestFeat]
    myTree = {bestFeatLabel: {}}
    del(labels[bestFeat])
    featValues = [example[bestFeat] for example in dataSet]
    uniqueVals = set(featValues)

    # 进入下一层节点进行分类
    for value in uniqueVals:
        subLabels = labels
        myTree[bestFeatLabel][value] = createTree(splitDataSet(dataSet, bestFeat, value), subLabels)
    return myTree


dataSet, labels = createDataSet()
# print(calShannonEnt(dataSet))
# print(chooseBestFeatureToSplit(dataSet))
# print(majorityCnt(['yes', 'no']))
print(createTree(dataSet, labels))
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: ID3算法是一种决策树学习算法,用于分类问题。它通过计算信息增益来选择最佳特征作为分裂节点。 以下是使用Python实现ID3算法的示例代码: ``` import numpy as np import pandas as pd from collections import Counter def entropy(target_col): elements,counts = np.unique(target_col,return_counts = True) entropy = np.sum([(-counts[i]/np.sum(counts))*np.log2(counts[i]/np.sum(counts)) for i in range(len(elements))]) return entropy def InfoGain(data,split_attribute_name,target_name="class"): total_entropy = entropy(data[target_name]) vals,counts= np.unique(data[split_attribute_name],return_counts=True) Weighted_Entropy = np.sum([(counts[i]/np.sum(counts))*entropy(data.where(data[split_attribute_name]==vals[i]).dropna()[target_name]) for i in range(len(vals))]) Information_Gain = total_entropy - Weighted_Entropy return Information_Gain def ID3(data,originaldata,features,target_attribute_name="class",parent_node_class = None): if len(np.unique(data[target_attribute_name])) <= 1: return np.unique(data[target_attribute_name])[0] elif len(data)==0: return np.unique(originaldata[target_attribute_name])[np.argmax(np.unique(originaldata[target_attribute_name],return_counts=True)[1])] elif len(features) ==0: return parent_node_class else: parent_node_class = np.unique(data[target_attribute_name])[np.argmax(np.unique(data[target_attribute_name],return_counts=True)[1])] item_values = [InfoGain(data,feature,target_attribute_name) for feature in features] best_feature_index = np.argmax(item_values) best_feature = features[best_feature_index] tree = {best_feature:{}} features = [i for i in features if i != best_feature] for value in np.unique(data[best_feature]): value = value sub_data = data.where(data[best_feature] == value).dropna() subtree = ID3(sub_data,data,features,target_attribute_name,parent_node_class) tree[best_feature][value] = subtree return(tree) ### 回答2: ID3算法是一种用于决策树学习的经典算法,适用于离散特征的分类问题。下面是使用Python实现ID3算法的步骤: 1. 导入相关库:首先,需要导入numpy和pandas库,用于数据处理和计算。 2. 准备数据:将分类问题的训练数据集准备成一个二维数组,每一行代表一个样本,每一列代表一个特征。 3. 定义计算信息熵函数:计算特征集合D的信息熵,即熵(D)。可以通过计算各个类别的概率以及概率的对数来得到。 4. 定义计算信息增益函数:计算某个特征A对训练数据集D的信息增益,即Gain(D, A)。信息增益是熵的减少量,可以通过计算特征A的每个取值划分后的子集的信息熵,并加权求和得到。 5. 选择最优特征:对于每个特征A,计算其信息增益,并选择信息增益最大的特征作为决策树当前节点的划分特征。 6. 构建决策树:根据选择的最优特征划分训练数据集,递归地构建决策树。如果划分后的子集中只包含一个类别,则该节点为叶子节点,类别为该子集中的唯一类别;否则,选择新的最优特征继续构建子树。 7. 进行预测:使用构建好的决策树对新样本进行分类预测。 通过以上步骤,我们就可以使用Python实现ID3算法。这个算法可以帮助我们从离散特征的训练数据中构建出一颗决策树模型,用于分类预测任务。 ### 回答3: ID3(Iterative Dichotomiser 3)是一种决策树算法,用于构建分类模型。下面是使用Python实现ID3算法的步骤: 1. 导入必要的库:首先,需要导入所需的Python库,如pandas(用于处理数据)和numpy(用于数学运算)。 2. 数据预处理:将待分类的数据集导入,并对其进行预处理。这包括处理缺失值、处理分类变量、将数据集分为训练集和测试集等。 3. 定义决策树类:创建一个名为DecisionTree的类,其中包含创建决策树的各个功能。 4. 计算熵:实现计算熵的函数,用于衡量数据的混乱度和不确定性程度。 5. 选择最优特征:实现一个函数,用于选择最优特征来构建决策树。该函数通过计算信息增益(即特征对于分类结果的重要性)来选择最佳特征。 6. 构建决策树:使用递归的方式,根据选择的最优特征构建决策树。在每个节点中,根据特征值对数据进行分割,并对每个分割后的子集递归地构建子树。 7. 预测:实现一个预测函数,用于根据构建的决策树对新样本进行分类。 8. 完善决策树:添加剪枝功能,以防止过拟合。剪枝操作可以通过定义合适的停止条件来实现,例如树的深度达到一定值或节点的样本数小于某个阈值。 9. 模型评估:对构建完成的决策树模型进行评估。使用测试集对模型进行测试,并计算准确率、召回率、F1值等指标。 10. 示例应用:通过一个示例应用来展示ID3算法的使用。例如,利用ID3算法对患者数据进行分类,根据症状和诊断结果判断是否患有某种疾病。 以上是使用Python实现ID3算法的基本步骤,通过这些步骤,我们可以构建出一个高效且准确的决策树分类模型。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值