机器学习入门之朴素叶贝斯和决策树分类(四)
机器学习入门之朴素叶贝斯和决策树分类(四)
文章目录
- 机器学习入门之朴素叶贝斯和决策树分类(四)
- 一、朴素贝叶斯分类
- 1.1 贝叶斯分类理论
- 1.2 条件概率
- 1.3 全概率公式
- 1.4 贝叶斯推断
- 1.5 朴素贝叶斯推断
- 示例
- 1.6 拉普拉斯平滑系数
- 1.7 sklearn API
- 1.8 sklearn 示例
- 二、决策树分类
- 2.1 决策树概念
- 2.1.1 决策节点
- 2.1.2 叶子节点
- 2.1.3 决策树的深度
- 2.1.4 决策树优点
- 2.1.5 决策树缺点
- 2.2 基于信息增益决策树的建立
- 2.2.1 信息增益
- 2.3 示例:动物分类
- 2.3.1 决策树结构
- 2.4. sklearn API
- 2.5. 示例:预测是否贷款
- 2.5.1 问题
- 2.5.2 解决方案
- 2.5.3 可视化决策树
以下是整理后的 Markdown 格式内容:
一、朴素贝叶斯分类
1.1 贝叶斯分类理论
假设有一个由两类数据组成的数据集,分布如下图所示:
用 ( p_1(x,y) ) 表示数据点 ((x,y)) 属于类别 1 的概率,用 ( p_2(x,y) ) 表示数据点 ((x,y)) 属于类别 2 的概率。对于一个新数据点 ((x,y)),可以根据以下规则判断其类别:
- 如果 ( p_1(x,y) > p_2(x,y) ),则类别为 1。
- 如果 ( p_1(x,y) < p_2(x,y) ),则类别为 2。
这就是贝叶斯决策理论的核心思想:选择具有最高概率的类别。
1.2 条件概率
条件概率 ( P(A|B) ) 表示在事件 B 发生的情况下,事件 A 发生的概率,计算公式为:
𝑃(𝐴|𝐵)=𝑃(𝐴∩𝐵)/𝑃(𝐵)
因此,
𝑃(𝐴∩𝐵)=𝑃(𝐴|𝐵)𝑃(𝐵)
同理可得,
𝑃(𝐴∩𝐵)=𝑃(𝐵|𝐴)𝑃(𝐴)
即
𝑃(𝐴|𝐵)=𝑃(B|A)𝑃(𝐴)/𝑃(𝐵)
1.3 全概率公式
假定样本空间 ( S ) 是两个事件 ( A ) 与 ( A’ ) 的和,事件 ( B ) 可以划分成两个部分:
𝑃(𝐵)=𝑃(𝐵∩𝐴)+𝑃(𝐵∩𝐴′)
在上面的推导当中,我们已知
𝑃(𝐵∩𝐴)=𝑃(𝐵|𝐴)𝑃(𝐴)
所以:
𝑃(𝐵)=𝑃(𝐵|𝐴)𝑃(𝐴)+𝑃(𝐵|𝐴′)𝑃(𝐴′)
1.4 贝叶斯推断
对条件概率公式变形,得到:
- 先验概率 ( P(A) ):在事件 B 发生之前,对事件 A 的概率估计。
- 后验概率 ( P(A|B) ):在事件 B 发生之后,对事件 A 的概率重新评估。
- 可能性函数 P(B|A)/P(B):调整因子,使预估概率更接近真实概率。
贝叶斯推断的核心思想是:通过实验结果调整先验概率,得到更接近事实的后验概率。
1.5 朴素贝叶斯推断
理解了贝叶斯推断,那么让我们继续看看朴素贝叶斯。贝叶斯和朴素贝叶斯的概念是不同的,区别就在于“朴素”二字,朴素贝叶斯对条件概率分布做了条件独立性的假设。 比如下面的公式,假设有n个特征:
根据贝叶斯定理,后验概率 P(a|X) 可以表示为:
P ( a ∣ X ) = P ( X ∣ a ) P ( a ) P ( X ) P(a|X) = \frac{P(X|a)P(a)}{P(X)} P(a∣X)=P(X)P(X∣a)P(a)
其中:
- P(X|a) 是给定类别 ( a ) 下观测到特征向量 $X=(x_1, x_2, …, x_n) $的概率;
- P(a) 是类别 a 的先验概率;
- P(X) 是观测到特征向量 X 的边缘概率,通常作为归一化常数处理。
朴素贝叶斯分类器的关键假设是特征之间的条件独立性,即给定类别 a ,特征 x i x_i xi 和 x j x_j xj (其中 i ≠ j i \neq j i=j 相互独立。)
因此,我们可以将联合概率 P(X|a) 分解为各个特征的概率乘积:
P ( X ∣ a ) = P ( x 1 , x 2 , . . . , x n ∣ a ) = P ( x 1 ∣ a ) P ( x 2 ∣ a ) . . . P ( x n ∣ a ) P(X|a) = P(x_1, x_2, ..., x_n|a) = P(x_1|a)P(x_2|a)...P(x_n|a) P(X∣a)=P(x1,x2,...,xn∣a)=P(x1∣a)P(x2∣a)...P(xn∣a)
将这个条件独立性假设应用于贝叶斯公式,我们得到:
P ( a ∣ X ) = P ( x 1 ∣ a ) P ( x 2 ∣ a ) . . . P ( x n ∣ a ) P ( a ) P ( X ) P(a|X) = \frac{P(x_1|a)P(x_2|a)...P(x_n|a)P(a)}{P(X)} P(a∣X)=P(X)P(x1∣a)P(x2∣a)...P(xn∣a)P(a)
这样,朴素贝叶斯分类器就可以通过计算每种可能类别的条件概率和先验概率,然后选择具有最高概率的类别作为预测结果。
这样我们就可以进行计算了。如果有些迷糊,让我们从一个例子开始讲起,你会看到贝叶斯分类器很好懂,一点都不难。
示例
假设有一组数据如下:
纹理 | 色泽 | 鼔声 | 类别 |
---|---|---|---|
清晰 | 清绿 | 清脆 | 好瓜 |
模糊 | 乌黑 | 浊响 | 坏瓜 |
模糊 | 清绿 | 浊响 | 坏瓜 |
清晰 | 乌黑 | 沉闷 | 好瓜 |
清晰 | 清绿 | 浊响 | 好瓜 |
模糊 | 乌黑 | 沉闷 | 坏瓜 |
清晰 | 乌黑 | 清脆 | 好瓜 |
模糊 | 清绿 | 沉闷 | 好瓜 |
清晰 | 乌黑 | 浊响 | 坏瓜 |
模糊 | 清绿 | 清脆 | 好瓜 |
计算新样本(纹理清晰,色泽清绿,鼓声沉闷)的类别:
示例:
p(a|X) = p(X|a)* p(a)/p(X) #贝叶斯公式
p(X|a) = p(x1,x2,x3…xn|a) = p(x1|a)*p(x2|a)*p(x3|a)…p(xn|a)
p(X) = p(x1,x2,x3…xn) = p(x1)*p(x2)*p(x3)…p(xn)
p(a|X) = p(x1|a)*p(x2|a)*p(x3|a)…p(xn|a) * p(a) / p(x1)p(x2)p(x3)…p(xn) #朴素贝叶斯公式
P(好瓜)=(好瓜数量)/所有瓜
P(坏瓜)=(坏瓜数量)/所有瓜
p(纹理清晰)=(纹理清晰数量)/所有瓜
p(纹理清晰|好瓜)= 好瓜中纹理清晰数量/好瓜数量
p(纹理清晰|坏瓜)= 坏瓜中纹理清晰数量/坏瓜数量
p(好瓜|纹理清晰,色泽清绿,鼓声沉闷)
=【p(好瓜)】【p(纹理清晰,色泽清绿,鼓声沉闷|好瓜)】/【p(纹理清晰,色泽清绿,鼓声沉闷)】
=【p(好瓜)】【p(纹理清晰|好瓜)*p(色泽清绿|好瓜)*p(鼓声沉闷|好瓜)】/【p(纹理清晰)*p(色泽清绿)*p(鼓声沉闷)】
p(坏瓜|纹理清晰,色泽清绿,鼓声沉闷)
=【p(坏瓜)*p(纹理清晰|坏瓜)*p(色泽清绿|坏瓜)*p(鼓声沉闷|坏瓜)】/【p(纹理清晰)*p(色泽清绿)*p(鼓声沉闷)】
从公式中判断"p(好瓜|纹理清晰,色泽清绿,鼓声沉闷)"和"p(坏瓜|纹理清晰,色泽清绿,鼓声沉闷)"时,因为它们的分母
值是相同的,[值都是p(纹理清晰)*p(色泽清绿)*p(鼓声沉闷)],所以只要计算它们的分子就可以判断是"好瓜"还是"坏瓜"之间谁大谁小了,所以没有必要计算分母
p(好瓜) = 6/10
p(坏瓜)=4/10
p(纹理清晰|好瓜) = 4/6
p(色泽清绿|好瓜) = 4/6
p(鼓声沉闷|好瓜) = 2/6
p(纹理清晰|坏瓜) = 1/4
p(色泽清绿|坏瓜) = 1/4
p(鼓声沉闷|坏瓜) = 1/4
把以上计算代入公式的分子
p(好瓜)*p(纹理清晰|好瓜)*p(色泽清绿|好瓜)*p(鼓声沉闷|好瓜) = 4/45
p(坏瓜)*p(纹理清晰|坏瓜)*p(色泽清绿|坏瓜)*p(鼓声沉闷|坏瓜) = 1/160
所以
p(好瓜|纹理清晰,色泽清绿,鼓声沉闷) > p(坏瓜|纹理清晰,色泽清绿,鼓声沉闷),
所以把(纹理清晰,色泽清绿,鼓声沉闷)的样本归类为好瓜
1.6 拉普拉斯平滑系数
某些事件或特征可能从未出现过,这会导致它们的概率被估计为零。然而,在实际应用中,即使某个事件或特征没有出现在训练集中,也不能完全排除它在未来样本中出现的可能性。拉普拉斯平滑技术可以避免这种“零概率陷阱”
公式为:
一般α取值1,m的值为总特征数量
通过这种方法,即使某个特征在训练集中从未出现过,它的概率也不会被估计为零,而是会被赋予一个很小但非零的值,从而避免了模型在面对新数据时可能出现的过拟合或预测错误
比如计算判断新瓜(纹理清晰,色泽淡白,鼓声沉闷)是好和坏时,因为在样本中色泽淡白没有出现,导致出现0值,会影响计算结果,要采用拉普拉斯平滑系数
1.7 sklearn API
from sklearn.naive_bayes import MultinomialNBestimator = MultinomialNB()
estimator.fit(x_train, y_train)
y_predict = estimator.predict(x_test)
1.8 sklearn 示例
用朴素贝叶斯算法对鸢尾花进行分类:
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import MultinomialNB# 1)获取数据
iris = load_iris()# 2)划分数据集
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target)# 3)朴素贝叶斯算法预估器
estimator = MultinomialNB()
estimator.fit(x_train, y_train)# 4)模型评估
score = estimator.score(x_test, y_test)
print("准确率为:", score)# 5)预测
index = estimator.predict([[2, 2, 3, 1]])
print("预测结果:", index, iris.target_names[index])
二、决策树分类
2.1 决策树概念
决策树是一种常用于分类和回归的机器学习算法。它模拟了人类决策过程,通过一系列的决策规则将数据分割成不同的类别。
2.1.1 决策节点
决策节点是决策树中的一个点,它根据某个特征的值将数据分割成不同的子集。
2.1.2 叶子节点
叶子节点是决策树的末端节点,它不包含任何子节点,代表最终的决策结果。
2.1.3 决策树的深度
决策树的深度是指从根节点到最远叶子节点的最长路径上的节点数。
2.1.4 决策树优点
- 可视化:决策树的结构清晰,易于理解和解释。
- 可解释能力:决策树的决策过程透明,便于分析。
- 对算力要求低:决策树算法计算简单,对硬件要求不高。
2.1.5 决策树缺点
- 容易产生过拟合:决策树可能会过度拟合训练数据,导致在新数据上的泛化能力差。
2.2 基于信息增益决策树的建立
信息增益是选择决策树分裂属性的一种方法,它基于熵的概念来衡量信息的不确定性。
2.2.1 信息增益
信息增益是通过选择能够最大化类别不确定性减少的属性来进行分裂。
2.3 示例:动物分类
以下是一个简单的动物分类决策树示例:
是动物 | 会飞 | 有羽毛 | |
---|---|---|---|
1麻雀 | 1 | 1 | 1 |
2蝙蝠 | 1 | 1 | 0 |
3飞机 | 0 | 1 | 0 |
4熊猫 | 1 | 0 | 0 |
2.3.1 决策树结构
2.4. sklearn API
from sklearn.tree import DecisionTreeClassifier# 初始化决策树分类器
estimator = DecisionTreeClassifier(criterion="entropy", max_depth=3)# 训练模型
estimator.fit(x_train, y_train)# 预测
y_predict = estimator.predict(x_test)
2.5. 示例:预测是否贷款
根据以下信息构建一棵预测是否贷款的决策树。
职业 | 年龄 | 收入 | 学历 | 是否贷款 | |
---|---|---|---|---|---|
1 | 工人 | 36 | 5500 | 高中 | 否 |
2 | 工人 | 42 | 2800 | 初中 | 是 |
3 | 白领 | 45 | 3300 | 小学 | 是 |
4 | 白领 | 25 | 10000 | 本科 | 是 |
5 | 白领 | 32 | 8000 | 硕士 | 否 |
6 | 白领 | 28 | 13000 | 博士 | 是 |
2.5.1 问题
如何根据上述数据构建决策树,并预测新客户是否会贷款?
2.5.2 解决方案
from sklearn.tree import DecisionTreeClassifier, export_graphviz
import pandas as pd# 创建数据集
data = {'职业': ['工人', '工人', '白领', '白领', '白领', '白领'],'年龄': [36, 42, 45, 25, 32, 28],'收入': [5500, 2800, 3300, 10000, 8000, 13000],'学历': ['高中', '初中', '小学', '本科', '硕士', '博士'],'是否贷款': ['否', '是', '是', '是', '否', '是']
}
df = pd.DataFrame(data)# 将分类数据转换为数值
df = pd.get_dummies(df, columns=['职业', '学历', '是否贷款'])# 划分特征和目标变量
x = df.drop('是否贷款_是', axis=1)
y = df['是否贷款_是']# 初始化决策树分类器
estimator = DecisionTreeClassifier(criterion="entropy", max_depth=3)# 训练模型
estimator.fit(x, y)# 预测新客户是否会贷款
new_customer = [[1, 0, 28, 13000, 1, 0, 0, 0, 0, 0, 0, 0]]
prediction = estimator.predict(new_customer)
print("预测结果:", "是" if prediction[0] == 1 else "否")
2.5.3 可视化决策树
export_graphviz(estimator, out_file="loan_tree.dot", feature_names=x.columns)
将生成的 loan_tree.dot
文件内容粘贴到 WebGraphviz 中,生成决策树图。