机器学习源码学习笔记(三)决策树

3-2按照给定的特征划分数据集,三个输入参数:待划分的数据集、划分数据集的特征、需要返回的特征的值
def splitDataSet(dataSet, axis, value):
    retDataSet = []
    for featVec in dataSet:
        if featVec[axis] == value:
            # chop out axis used for splitting
            reducedFeatVec = featVec[:axis]
            #将当前行进行扩展,把数据集的 axis+1 到结尾的数据 扩展进来
            reducedFeatVec.extend(featVec[axis+1:])
            #把原来的数据集进行追加新的数据
            retDataSet.append(reducedFeatVec)
    return retDataSet
    ```


#####3-3 选择最好的数据集划分方式
```python
def chooseBestFeatureToSplit(dataSet):
    # the last column is used for the labels,数据的最后一列或者每个实例的最后一个元素是当前实例的类别标签
    numFeatures = len(dataSet[0]) - 1
    #计算数据集的 香农熵
    baseEntropy = calcShannonEnt(dataSet)
    bestInfoGain = 0.0; bestFeature = -1
    # 遍历数据集中的所有特征。
    for i in range(numFeatures):
        #  选择特征值 列,使用列表推导(List Comprehension)来创建新的列表
        featList = [example[i] for example in dataSet]
        # 使用集合去重
        uniqueVals = set(featList)
        newEntropy = 0.0
        # 遍历当前特征中的所有唯一属性值,对每个特征划分一次数据集,
        for value in uniqueVals:
            # 按照给定的特征值进行分类,
            subDataSet = splitDataSet(dataSet, i, value)
            prob = len(subDataSet)/float(len(dataSet))
            # 然后计算数据集的新熵值
            newEntropy += prob * calcShannonEnt(subDataSet)
        # 计算信息增益;即减少熵
        infoGain = baseEntropy - newEntropy
        # compare this to the best gain so far,将此与迄今为止的最佳收益进行比较,
        if (infoGain > bestInfoGain):
            #if better than current best, set to best 如果比当前的最佳设置为最好
            bestInfoGain = infoGain
            bestFeature = i
    # 返回最好特征划分的索引值
    return bestFeature
代码调试
3.1.1 测试数据集准备

myData,labels = createDataSet();

3.1.2 计算给定数值 香农熵

calcShannonEnt(myData)

3.1.3 数据分类测试

splitDataSet(myData,0,0)

3.1.4 接下来我们将遍历整个数据集,循环计算香农熵和 splitDataSet() 函数,找到最好的特征划分方式、

chooseBestFeatureToSplit(myData);

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值