《机器学习实战》第三章 构建决策树“IndexError: list index out of range”问题的解决

由于出现了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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值