本文共 4016 字,大约阅读时间需要 13 分钟。
决策树思想的来源非常朴素,程序设计中的条件分支结构就是if-then结构,最早的决策树就是利用这类结构分割数据的一种分类学习方法
那来玩个猜测游戏,猜猜这32支球队那个是冠军。并且猜测错误付出代价。
为了使代价最小,可以使用二分法猜测: 我可以把球编上号,从1到32,然后提问:冠 军在1-16号吗?依次询问,只需要五次,就可以知道结果。我们来看这个式子:
H = -(p1logp1 + p2logp2 + ... + p32log32) = - log32
“谁是世界杯冠军”的信息量应该比5比特少,特点(重要):
特征A对训练数据集D的信息增益g(D,A),定义为集合D的信息熵H(D)与特征A给定条件下D的信息条件熵H(D|A)之差,即公式为:
公式的详细解释:注:信息增益表示得知特征X的信息而息的不确定性减少的程度使得类Y的信息熵减少的程度
1、g(D, 年龄) = H(D) -H(D|年龄) = 0.971-[5/15H(青年)+5/15H(中年)+5/15H(老年]2、H(D) = -(6/15log(6/15)+9/15log(9/15))=0.9713、H(青年) = -(3/5log(3/5) +2/5log(2/5))H(中年)=-(3/5log(3/5) +2/5log(2/5))H(老年)=-(4/5og(4/5)+1/5log(1/5))
我们以A1、A2、A3、A4代表年龄、有工作、有自己的房子和贷款情况。最终计算的结果g(D, A1) = 0.313, g(D, A2) = 0.324, g(D, A3) = 0.420,g(D, A4) = 0.363。所以我们选择A3 作为划分的第一个特征。这样我们就可以一棵树慢慢建立。
当然决策树的原理不止信息增益这一种,还有其他方法。但是原理都类似,我们就不去举例计算。
import requestsimport numpy as npimport pandas as pdfrom sklearn.feature_extraction import DictVectorizerfrom sklearn.model_selection import train_test_splitfrom sklearn.tree import DecisionTreeClassifierfrom sklearn.tree import export_graphvizdef get_data(): headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36' } proxies = { 'http': 'http://web-proxy.tencent.com:8080', 'https': 'http://web-proxy.tencent.com:8080' } url = 'http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt' res = requests.get(url, proxies=proxies, headers=headers) with open('tanic.csv', 'wb') as file: file.write(res.content)def decision(): '''决策树对于泰坦尼克号进行预测生死''' # 获取数据 titanic = pd.read_csv('./tanic.csv') # 处理数据,找出特征值和目标值 x = titanic[['pclass','age','sex']] y = titanic['survived'] # 缺失值需要处理,将特征当中有类别的这些特征进行字典特征抽取 x['age'].fillna(x['age'].mean(), inplace=True) # 实例化特征抽取 dict = DictVectorizer(sparse=False) # 对于x转换成字典数据x.to_dict(orient="records") x = dict.fit_transform(x.to_dict(orient="records")) # 分割训练集合测试集 x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3) # 进行决策树的建立和预测 dc = DecisionTreeClassifier(max_depth=5) dc.fit(x_train, y_train) export_graphviz(dc, out_file="./tree.dot",feature_names=['age', 'pclass=1st', 'pclass=2nd', 'pclass=3rd', '女性', '男性']) print("预测的准确率为:", dc.score(x_test, y_test)) return Noneif __name__ == '__main__': get_data() decision()
export_graphviz(dc, out_file="./tree.dot", feature_names=['age', 'pclass=1st', 'pclass=2nd', 'pclass=3rd', '女性', '男性'])
注:企业重要决策,由于决策树很好的分析能力,在决策过程应用较多, 可以选择特征。
转载地址:http://esili.baihongyu.com/