由于出现了list index out of range
上网浏览相关的问题,问题描述原文
从文中的解析可以看出,是因为del对labels进行了修改,导致越删越少,最后删没了
因此根据网上建议选择再加一句
subLabels = labels[:]
del(subLabels[bestFeat])
防止对原数据进行操作
由于粗心,在代码len中的括号造成了错误。
最终跑的实验结果为:
{‘flippers’: {0: ‘no’, 1: {‘no surfacing’: {0: ‘no’, 1: ‘yes’}}}}
代码如下:
#创建树
def createTree(dataSet,labels):
# 创建了包含数据集所有的类标签
classList = [example[-1] for example in dataSet]
# 类别相同则if成立,则停止划分 count() 方法用于统计字符串里某个字符或子字符串出现的次数。
if classList.count(classList[0]) == len(classList):
return classList[0]
# 用完了数据集中的所有特征,仍未将数据集划分为唯一类别的分组
if len(dataSet[0]) == 1:
# 因此采用出现次数最多的作为分组类别
return majorityCnt(classList)
# 此处开始创建树
# 信息增益 选取最优的特征
bestFeat = chooseBestFeatureToSplit(dataSet)
print(bestFeat)
# 最优特征所对应的标签
bestFeatLabel = labels[bestFeat]
print(bestFeatLabel)
# 根据最优特征标签生成树
myTree = {bestFeatLabel:{}}
# 删除已经使用的特征标签
subLabels = labels[:]
del(subLabels[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