对于一个python入门级,统计概率学一般并且还要上班搬砖的人来说,机器学习是真痛苦啊。
1、对于决策树的理解,书上有一个简明的例子,二十个问题游戏,参与者脑子里有一个事物,其他人提问20次用来缩小事物所在范围,最终给出答案,因此决策树更像是根据已知条件从而预测结果的一种模型。树上的每一个分叉路径代表某个特征,每个叶子节点对应从根节点到叶子节点所经历的特征的值。
2、ID3算法,基于奥卡姆剃刀原理,即在得到相同结果的算法中,选简单的那一个。在决策树里,小树优于大树,个人理解是不是因为树越大,特征越多,混乱性越高,划分过程较复杂,结果的可释性下降?
3、信息增益和熵,信息论中:期望信息越小,信息增益越大,信息纯度越高。熵则定义为信息的期望值。熵描述的是混乱程度,起初用于物理中,计算公式是由求期望E(x) = xp 的公式演变而来:, 计算方式如下:
# 计算数据集当前的熵
from math import log
def calcShang(dataSet):
num = len(dataSet) #待分类特种总体数量,计算概率公式中的分母
labels = {} #存储各种分类的字典
for lists in dataSet:
sublabels = list[-1]
if sublabels not in labels.keys():
labels[sublabels] = 0
labels[sublabels] += 1
Shang = 0.0
for key in labels:
p = float(labels[key]) / num
Shang -= p * log(p,2)
return Shang
此外,所谓的信息增益即用初始的熵减去根据特征划分后计算的熵,即,感觉就是比较数据划分前后的混乱程度,大于0则混乱程度降低,即有序性较高,分类效果越好。在使用公式之前,先按给定的特征划分数据集:
# 按给定的特征划分数据集
def splitdataset(dataSet,mark,value):
newSet = []
for vecList in dataSet:
if vecList[mark] == value:
subList = vecList[:mark]
subList.extend(vecList[mark+1:])
newSet.append(subList)
return newSet
接着,找出信息增益最大的特征:
# 划分数据集的最优特征
def findbestfeature(dataSet):
numOffeature = len(dataSet) - 1 #最后一列为类别标签,计算用于分类的特征数量
baseShang = calcShang(dataSet) #学习目标当前信息的熵
gainShang = 0.0; bestFeature = 1 #初始化信息增益和最优特征
for i in range(numOFfeature):
mark = [example[i] for example in dataSet] #属性列表
uniqMark = set(mark) #属性去重,生成列表
newShang = 0.0
for value in uniqMark:
subDataSet = splitdataset(dataSet,i,value) #返回根据属性划分后的数据列表
p = len(subDataSet) / float(len(dataSet)) #计算属性概率
newShang += p * calcShang(subDataSet) #计算属性信息熵并求和
plusShang= baseShang - newShang
if plusShang > gainShang:
gainShang = plusShang #取信息增益最大特征
bestFeature = i #i对应最优特征位置
return bestFeature
对于学习目标来说,特征有多个,每个特征的分类效果不同,特征与学习目标映射,真是日了狗了。