首页 > 其他分享 >[机器学习] sklearn决策树、随机森林、隐马尔可夫模型

[机器学习] sklearn决策树、随机森林、隐马尔可夫模型

时间:2022-12-19 21:55:24浏览次数:70  
标签:分割 模型 马尔可夫 相亲 sklearn 决策树

date: 2018-04-19 23:36:16 +0800                  
tags:
    - 机器学习
    - Python

决策树

决策树(Decision Tree)是一种用于处理分类和回归问题的无监督学习算法。如下图所示为某女青年在某相亲网站的相亲决策图。这幅图描述的都是一个非常典型的决策树模型。

通过对其相亲决策的分析,假设其相亲信息如下所示:

该女青年相亲决策主要考虑到因素有年龄,身高,年收入,学历。同事由该女青年的相亲决策图可以看到,相亲决策树以年龄与35岁相比作为树根。但是其他的数据项也能做树根。因此选择合适的数据项作为树根十分重要。在决策树中由信息增益确定树根。

信息增益

在提出信息增益前,需要对理解信息熵(香农熵,information entropy)这个概念。信息熵(entropy)描述整个体系的混乱程度,熵越大,体系混乱程度越大。例如火柴有序的放在火柴盒子里,则熵值很低,反之,熵值很高。整个体系的信息熵的计算公式如下:

\[Info=-\sum_{i=1}^{m}p_{i}log_{2}p_{i} \]

其中m表示最后决策的种类。前面女青年相亲的例子,最后决策分为相亲和不相亲,则m=2。其中Y(相亲)概率为7/12,N(不相亲)概率为5/12。信息熵为:

\[Info=-\left(\frac{7}{12}log_{2}\frac{7}{12}+\frac{5}{12}log_{2}\frac{5}{12}\right )=0.98 bit \]

树根的选择十分重要。选择树根的原则首先确定最佳因素如确定为年龄,然后再确定分割节点如确定年龄为35岁为分割节点,分割后获得两棵子树。然后根据其他因素选择树根,再次对所获得的两棵子树分割。通过熵来评价分割结果,当熵越大,则接下分割难度越大,分割次数越多;熵越小则分割难度越小,分割次数越小。这个划分规则下以某因素A来划分,所得划分熵如下:

\[Info_{A}=-\sum_{j=1}^{v}p_{j}\cdot Info(A_{j}) \]

上式中v表示所选因素A一共有多少组,如A为学历时v=3。P(j)表示这种分组所占比重。如学历有可以被划分为3组,大专、本科、硕士。则当所选因素为A时,信息熵为:

最后求的近似值\(Info_{A}=0.872\)

对于信息增益,前后的信息熵变化值为信息增益。信息增益越大表明分割效果越好。对于以学历为分割因素时的信息增益如下:

sklearn实现

sklearn中对应的函数DecisionTreeClassifier函数(分类),DecisionTreeRegressor(回归),分类代码如下

from sklearn import tree
import numpy as np
 
#年龄,身高,年收入,学历(大专:0,本科:1,硕士:2)
X = np.array(
        [[25, 179, 15, 0],
         [33, 190, 19 ,0], 
         [28, 180, 18, 2],
         [25, 178, 18, 2], 
         [46, 100, 100, 2],
         [40, 170, 170, 1],
         [34, 174, 20, 2],
         [36, 181, 55, 1],
         [35, 170, 25, 2],
         [30, 180, 35, 1],
         [28, 174, 30, 1],
         [29, 176, 36, 1]])
 
#0表示没有相亲,1表示相亲
y= [0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1]
 
clf = tree.DecisionTreeClassifier().fit(X, y)
p=[[28, 180, 18, 2]]
print(clf.predict(p)) #[1]

函数其他参数改动可参考官网文档:tree-classification。另外可以将sklearn所生成的决策可视化,具体参考链接:Skilearn中决策树可视化方法

随机森林

随机森林(Random Forest)是一个构建决策树的过程,目标是构建许多棵决策树。随机森林会为一个训练集根据不同的因素构建若干棵决策,每棵树的层级都比较浅。对新样本进行分类判断时候会同时对这些决策树进行分类概率判断,最后进行投票,哪个类别多,输入的样本就属于哪个类别。其分类方式也就是通过若干个分类器进行组合集成学习。

sklearn实现

sklearn中对应的函数RadomForestClassifier函数(分类),RadomForestRegressor(回归),分类代码如下

from sklearn.ensemble import RandomForestClassifier
import numpy as np
 
#年龄,身高,年收入,学历(大专:0,本科:1,硕士:2)
X = np.array(
        [[25, 179, 15, 0],
         [33, 190, 19 ,0], 
         [28, 180, 18, 2],
         [25, 178, 18, 2], 
         [46, 100, 100, 2],
         [40, 170, 170, 1],
         [34, 174, 20, 2],
         [36, 181, 55, 1],
         [35, 170, 25, 2],
         [30, 180, 35, 1],
         [28, 174, 30, 1],
         [29, 176, 36, 1]])
 
#0表示没有相亲,1表示相亲
y= [0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1]
 
clf =RandomForestClassifier().fit(X, y)
p=[[28, 180, 18, 2]]
print(clf.predict(p)) #[1]

函数 其他参数改动可参考官网文档:random-forests

隐马尔可夫模型

隐马尔可夫模型和贝叶斯信念网络的模型思维方式比较接近。区别在于隐马尔可夫模型更简单,也可以说隐马尔可夫模型是贝叶斯信念网络的一种特例。但是sklearn中没有实现隐马尔可夫模型的函数库。隐马尔可夫模型理论见文档:如何用简单易懂的例子解释隐马尔可夫模型?。在IPython Notebook有隐马尔可夫模型的实现,具体见:hmmlearn

标签:分割,模型,马尔可夫,相亲,sklearn,决策树
From: https://www.cnblogs.com/luohenyueji/p/16993187.html

相关文章