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);