【机器学习——决策树】——两种方法实现,含模型的保存和调用

目录

1、ID3算法

2、使用sklearn API——模型保存和调用成功


1、ID3算法

以下实现了决策树的创建、可视化绘制、决策树的保存和调用

但是在利用决策树进行预测的时候出现错误

分类代码

#实用决策树进行分类
def classify(inputTree, featLabels, testVec):  
    firstStr = inputTree.keys()[0]  
    secondDict = inputTree[firstStr]  
    featIndex = featLabels.index(firstStr)  
    for key in secondDict.keys():  
        if testVec[featIndex] == key:  
            if type(secondDict[key]).__name__ == 'dict':  
                classLabel = classify(secondDict[key], featLabels, testVec)  
            else: classLabel = secondDict[key]  
    return classLabel 

UnboundLocalError: local variable 'classLabel' referenced before assignment 

暂时未解决

 完整代码

from dataProcess import loaddatasets
from math import log
import operator
import json
import numpy as np
from paths import abs_path


##数据集
def createDataSet(xlsPath):
	"""
	创建数据集
	"""
	datas, labels = loaddatasets(xlsPath)
	labels = labels.reshape(-1, 1)
	dataSet = np.hstack((datas, labels))
	dataSet = dataSet.tolist()
	featureName = ['能效设计', '含油舱底水污染控制', '污油污染控制', '餐饮污水控制', '生活污水控制', '发动机排气污染物控制',
	               '制冷剂', '灭火剂', '垃圾污染控制', '防止噪声污染', '应用比例', '振动', '噪声', '有害物质的禁用和限用']
	# 返回数据集和每个维度的名称
	return dataSet, featureName


##分割数据集
def splitDataSet(dataSet, axis, value):
	"""
	按照给定特征划分数据集
	:param axis:划分数据集的特征的维度
	:param value:特征的值
	:return: 符合该特征的所有实例(并且自动移除掉这维特征)
	"""

	# 循环遍历dataSet中的每一行数据
	retDataSet = []
	for featVec in dataSet:
		if featVec[axis] == value:
			reduceFeatVec = featVec[:axis]  # 删除这一维特征
			reduceFeatVec.extend(featVec[axis + 1:])
			retDataSet.append(reduceFeatVec)
	return retDataSet


def majorityCnt(classList):
	classCount = {}
	for vote in classList:
		# 统计classList中每个元素出现的次数
		if vote not in classCount.keys():
			classCount[vote] = 0
			classCount[vote] += 1
	sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)  # 根据字典的值降序排序
	return sortedClassCount[0][0]  # 返回classList中出现次数最多的元素


##计算信息熵
# 计算的始终是类别标签的不确定度
def calcShannonEnt(dataSet):
	"""
	计算训练数据集中的Y随机变量的香农熵
	:param dataSet:
	:return:
	"""
	numEntries = len(dataSet)  # 实例的个数
	labelCounts = {}
	for featVec in dataSet:  # 遍历每个实例,统计标签的频次
		currentLabel = featVec[-1]  # 表示最后一列
		# 当前标签不在labelCounts map中,就让labelCounts加入该标签
		if currentLabel not in labelCounts.keys():
			labelCounts[currentLabel] = 0
		labelCounts[currentLabel] += 1

	shannonEnt = 0.0
	for key in labelCounts:
		prob = float(labelCounts[key]) / numEntries
		shannonEnt -= prob * log(prob, 2)  # log base 2
	return shannonEnt


## 计算条件熵
def calcConditionalEntropy(dataSet, i, featList, uniqueVals):
	""
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
决策树算法是一种广泛应用于分类和回归的机器学习算法,它基于树形结构对样本进行分类或预测。决策树算法的主要思想是通过一系列的判断来对样本进行分类或预测。在决策树中,每个节点表示一个属性或特征,每个分支代表该属性或特征的一个取值,而每个叶子节点代表一个分类或预测结果。 决策树算法的训练过程主要包括以下步骤: 1. 特征选择:根据某种指标(如信息增益或基尼系数)选择最优的特征作为当前节点的分裂属性。 2. 决策树生成:根据选择的特征将数据集分成若干个子集,并递归地生成决策树。 3. 剪枝:通过剪枝操作来提高决策树的泛化性能。 决策树算法的优点包括易于理解和解释、计算复杂度较低、对缺失值不敏感等。但是,决策树算法也存在一些缺点,如容易出现过拟合、对离散数据敏感等。 下面是一个决策树算法的案例:假设我们要根据一个人的年龄、性别、教育程度和职业预测其收入水平(高于或低于50K)。首先,我们需要将这些特征进行编码,将其转换为数值型数据。然后,我们可以使用决策树算法对这些数据进行训练,并生成一个决策树模型。最后,我们可以使用该模型对新的数据进行分类或预测。例如,根据一个人的年龄、性别、教育程度和职业,我们可以使用决策树模型预测该人的收入水平。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

有情怀的机械男

你的鼓励将是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值