kNN算法可以完成很多分类任务,但是最大的缺点就是不能给出数据的内在含义,决策树算法的主要优势就在于数据形式非常容易理解。
决策树的一个重要任务就是理解数据中所蕴含的知识信息。它可以使用不熟悉的数据集合,从中提取出一系列规则。
这些根据数据集创建规则的过程,就是机器学习的过程,在专家系统中经常应用这一原理。
决策树的特性:
优点:计算复杂度不高,输出结果易于理解,对中间值的确实不敏感,可以处理不相关特征数据;
缺点:可能会产生过度匹配问题;
使用数据:数值型和标称型。
代码实现:
1、计算给定数据集的香浓熵
def calcShannonEnt(dataSet):
numEntries = len(dataSet) #获得数据集中实例总数
labelCounts = {} #创建空字典(键-值为‘label’-‘数目’)
for featVec in dataSet: #遍历数据集
currentLabel = featVec[-1] #将label赋值给currentLabel
if currentLabel not in labelCounts.keys(): #如果字典里没有此label
labelCounts[currentLabel] = 0 #数目置0
labelCounts[currentLabel] += 1 #如果字典里已有此label,数目+1
shannonEnt = 0.0 #初始化香浓变量
for keys in labelCounts: #遍历字典(键-值为‘label’-‘数目’)
prop = float(labelCounts[key]) / numEntries #计算p
shannonEnt -= prop * log(prop, 2) #计算熵
return shannonEnt #返回熵值
2、按照给定特征划分数据集
def splitDataSet(dataSet, axis, value):
retDataSet = [] #创建空表
for featVec in dataSet: #遍历数据集
if featVec[axis] == value: #当第axis个特征值为value
reduedFeatVec = featVec[: axis] #列表0-axis元素复制
reduedFeatVec.extend(featVec[axis+1: ]) #列表axis-最后元素复制
retDataSet.append(reduedFeatVec) #复制的完整样本接入表中
return retDataSet #返回表
3、选择最好的数据集划分方式
def chooseBestFeatureToSplit(dataSet):
numFeatures = len(dataSet[0] - 1) #获取特征数目
baseEntropy = calcShannonEnt(dataSet) #计算原始数据集香浓熵
bes