决策树(Decision Tree)是在已知各种情况发生概率的基础上,通过构成决策树来求取净现值的期望值大于等于零的概率,评价项目风险,判断其可行性的决策分析方法,是直观运用概率分析的一种图解法。由于这种决策分支画成图形很像一棵树的枝干,故称决策树。
分类树(决策树)是一种十分常用的分类方法。它是一种监督学习,所谓监督学习就是给定一堆样本,每个样本都有一组属性和一个类别,这些类别是事先确定的,那么通过学习得到一个分类器,这个分类器能够对新出现的对象给出正确的分类。这样的机器学习就被称之为监督学习。
决策树的剪枝 剪枝是决策树停止分支的方法之一,剪枝有分预先剪枝和后剪枝两种。预先剪枝是在树的生长过程中设定一个指标,当达到该指标时就停止生长,这样做容易产生“视界局限”,就是一旦停止分支,使得节点N成为叶节点,就断绝了其后继节点进行“好”的分支操作的任何可能性。不严格的说这些已停止的分支会误导学习算法,导致产生的树不纯度降差最大的地方过分靠近根节点。后剪枝中树首先要充分生长,直到叶节点都有最小的不纯度值为止,因而可以克服“视界局限”。然后对所有相邻的成对叶节点考虑是否消去它们,如果消去能引起令人满意的不纯度增长,那么执行消去,并令它们的公共父节点成为新的叶节点。这种“合并”叶节点的做法和节点分支的过程恰好相反,经过剪枝后叶节点常常会分布在很宽的层次上,树也变得非平衡。后剪枝技术的优点是克服了“视界局限”效应,而且无需保留部分样本用于交叉验证,所以可以充分利用全部训练集的信息。但后剪枝的计算量代价比预剪枝方法大得多,特别是在大样本集中,不过对于小样本的情况,后剪枝方法还是优于预剪枝方法的。
优点 决策树易于理解和实现,人们在在学习过程中不需要使用者了解很多的背景知识,这同时是它的能够直接体现数据的特点,只要通过解释后都有能力去理解决策树所表达的意义。 对于决策树,数据的准备往往是简单或者是不必要的,而且能够同时处理数据型和常规型属性,在相对短的时间内能够对大型数据源做出可行且效果良好的结果。 易于通过静态测试来对模型进行评测,可以测定模型可信度;如果给定一个观察的模型,那么根据所产生的决策树很容易推出相应的逻辑表达式。 缺点 1)对连续性的字段比较难预测。 2)对有时间顺序的数据,需要很多预处理的工作。 3)当类别太多时,错误可能就会增加的比较快。 4)一般的算法分类的时候,只是根据一个字段来分类。
实例 为了适应市场的需要,某地准备扩大电视机生产。市场预测表明:产品销路好的概率为0.7;销路差的概率为0.3。备选方案有三个:第一个方案是建设大工厂,需要投资600万元,可使用10年;如销路好,每年可赢利200万元;如销路不好,每年会亏损40万元。第二个方案是建设小工厂,需投资280万元;如销路好,每年可赢利80万元;如销路不好,每年也会赢利60万元。第三个方案也是先建设小工厂,但是如销路好,3年后扩建,扩建需投资400万元,可使用7年,扩建后每年会赢利190万元。 各点期望: 决策树分析 决策树分析 [7] 点②:0.7×200×10+0.3×(-40)×10-600(投资)=680(万元) 点⑤:1.0×190×7-400=930(万元) 点⑥:1.0×80×7=560(万元) 比较决策点4的情况可以看到,由于点⑤(930万元)与点⑥(560万元)相比,点⑤的期望利润值较大,因此应采用扩建的方案,而舍弃不扩建的方案。把点⑤的930万元移到点4来,可计算出点③的期望利润值。 点③:0.7×80×3+0.7×930+0.3×60×(3+7)-280 = 719(万元) 最后比较决策点1的情况。由于点③(719万元)与点②(680万元)相比,点③的期望利润值较大,因此取点③而舍点②。这样,相比之下,建设大工厂的方案不是最优方案,合理的策略应采用前3年建小工厂,如销路好,后7年进行扩建的方案。
from sklearn.tree import DecisionTreeClassifier,export_graphviz
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction import DictVectorizer
import pandas as pd
titanic=pd.read_csv("./titanic.txt")
features=titanic[['pclass','age','sex']]
features['age'].fillna(features['age'].mean(),inplace=True)
targets=titanic['survived']
X_train,X_test,y_train,y_test=train_test_split(features,targets,test_size=0.25)
vect=DictVectorizer()
X_train=vect.fit_transform((X_train.to_dict(orient="records")))
X_test=vect.fit_transform((X_test.to_dict(orient="records")))
print(vect.get_feature_names())
tree=DecisionTreeClassifier()
tree.fit(X_train,y_train)
score=tree.score(X_test,y_test)
print("score:",score)
export_graphviz(tree,'tree_class.dot',feature_names=['age', '1st', '2nd', '3rd', 'female', 'male'],class_names=['die','survive'])
import os
path=os.getcwd()
lst=os.listdir(path)
for file in lst:
if file.endswith(".dot"):
filee=file.replace(".dot","")
os.system("dot -Tpng {} -o {}.png".format(file,filee))
如果作图出现乱码解决方案: 添加链接描述
|