3.5决策树算法
1.认识决策树
决策树思想的来源非常朴素,程序设计中的条件分支结构就是if-then结构,最早的决策树就是利用这类结构分割数据的一种分类学习方法
怎么理解这句话?通过一个对话例子
想一想这个女生为什么把年龄放在最上面判断!!!!!!!!!
如何高效的进行决策?
特征的先后顺序
2.决策树的原理
这个里面有年龄、是否有工作、是否有自己的房子、信贷情况这四个特征,我们可以通过那个特征可以很快的做出决策。
先看房子,再工作->是否贷款只看了两个特征
年龄,信贷情况,工作看了三个特征
先看房子,再工作->是否贷款只看了两个特征年龄,信贷情况,工作看了三个特征
那么我们怎么知道这些特征哪个更好放在最上面,那么决策树的真是划分是这样的
决策树解决的问题就是有很多个特征,我们通过那些特征可以很快的做出正确的判断
2.1信息熵
为了解决上面的问题,我们引入了信息熵和信息增益。
H的专业术语称之为信息熵,单位为比特。
信息和消除不确定性是相联系的
问题: 回到我们前面的贷款案例,怎么去划分?可以利用当得知某个特征(比如是否有房子)之后,我们能够减少的不确定性大小。越大我们可以认为这个特征很重要。那怎么去衡量减少的不确定性大小呢?
2.2 信息增益
2.2.1 定义和公式
定义与公式
特征A对训练数据集D的信息增益g(D,A),定义为集合D的信息熵H(D)与特征A给定条件下D的信息条件熵H(D|A)之差,即公式为:
公式的详细解释:
注:信息增益表示得知特征X的信息而息的不确定性减少的程度使得类Y的信息熵减少的程度
2.2.2 贷款特征重要计算
我们以年龄特征来计算:
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.971
3、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 作为划分的第一个特征。这样我们就可以一棵树慢慢建立
2.3 基尼系数
基尼系数是1减去所有概率的平方
在上面的例子就是
我们会发现当一定会被批准或者拒绝的时候他的Gini系数等于0,当他是平均的时候最大,所以我们只需要找这个Gini最小的来做下一级分类的标准就可以。
然后我们看这个例子:
2.4决策树的三种算法实现
当然决策树的原理不止信息增益这一种,还有其他方法。但是原理都类似,我们就不去举例计算。
ID3
信息增益 最大的准则
C4.5
信息增益比 最大的准则
CART
分类树: 基尼系数 最小的准则 在sklearn中可以选择划分的默认原则
优势:划分更加细致(从后面例子的树显示来理解)
3.决策树的API
决策树API
class sklearn.tree.DecisionTreeClassifier(criterion=’gini’, max_depth=None,random_state=None)
决策树分类器
criterion:默认是’gini’系数,也可以选择信息增益的熵’entropy’
max_depth:树的深度大小
random_state:随机数种子
其中会有些超参数:max_depth:树的深度大小
其它超参数我们会结合随机森林讲解
用决策树的时候不需要特征工程:
1.获取数据集
2.划分数据集
3.决策树预估器
4.模型评估
4决策树对鸢尾花进行分类
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import GridSearchCV
from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.tree import DecisionTreeClassifier
def decision_iris():
"""
用决策树对鸢尾花进行分类
:return:
"""
# 1)获取数据集
iris = load_iris()
# 2)划分数据集
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=22)
# 3)决策树预估器
estimator = DecisionTreeClassifier(criterion="entropy")
estimator.fit(x_train, y_train)
# 4)模型评估
# 方法1:直接比对真实值和预测值
y_predict = estimator.predict(x_test)
print("y_predict:\n", y_predict)
print("直接比对真实值和预测值:\n", y_test == y_predict)
# 方法2:计算准确率
score = estimator.score(x_test, y_test)
print("准确率为:\n", score)
return None
我们发现没有CNN准确率强,是因为其CNN适合于小数据
4决策树可视化处理
保存树的结构到dot文件
1、sklearn.tree.export_graphviz() 该函数能够导出DOT格式
tree.export_graphviz(estimator,out_file='tree.dot’,feature_names=[‘’,’’])
导出的dot文件,打开这个网址http://webgraphviz.com/ 复制进去进去dot就可以显示树的结构
# 可视化决策树
export_graphviz(estimator, out_file="iris_tree.dot", feature_names=iris.feature_names)
5.总结
优点:
简单的理解和解释,树木可视化。
缺点:
决策树学习者可以创建不能很好地推广数据的过于复杂的树,这被称为过拟合。
改进:
减枝cart算法(决策树API当中已经实现,随机森林参数调优有相关介绍)
随机森林
6.泰坦尼克号案例分析
1)获取数据
2)数据处理
缺失值处理
特征值->字典类型(比较号提取特征)
3)准备好特征值 目标值
4)划分数据集
5)特征工程:字典特征提取
6)决策树预估器流程
7)模型评估
def decisioncls():
"""
决策树进行乘客生存预测
:return:
"""
# 1、获取数据
titan = pd.read_csv("http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt")
# 2、数据的处理
x = titan[['pclass', 'age', 'sex']]
y = titan['survived']
# print(x , y)
# 缺失值需要处理,将特征当中有类别的这些特征进行字典特征抽取
x['age'].fillna(x['age'].mean(), inplace=True)
# 对于x转换成字典数据x.to_dict(orient="records")
# [{"pclass": "1st", "age": 29.00, "sex": "female"}, {}]
dict = DictVectorizer(sparse=False)
x = dict.fit_transform(x.to_dict(orient="records"))
print(dict.get_feature_names())
print(x)
# 分割训练集合测试集
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)
print("预测的准确率为:", dc.score(x_test, y_test))
return None
可以看一下这个视频,帮助理解决策树算法