目录
一、朴素贝叶斯分类理论
1、贝叶斯分类理论
假设一个数据集,它由两类数据组成,数据分布如下图所示:
p1(x,y)表示数据点(x,y)属于类别1(图中红点)
p2(x,y)表示数据点(x,y)属于类别2(图中蓝点)
那么对于一个新数据点 (x,y):
-
如果p1(x,y)>p2(x,y),那么类别为1
-
如果p1(x,y)<p2(x,y),那么类别为2
也就是说,我们会选择高概率对应的类别。这就是贝叶斯决策理论的核心思想,即选择具有最高概率的决策。
2、条件概率
条件概率(Conditional probability),就是指在事件B发生的情况下,事件A发生的概率,用P(A|B)来表示。
由事件A、事件B同时发生的概率等于事件B发生的概率乘以事件B发生中事件A也发生的概率,即𝑃(𝐴∩𝐵)=𝑃(𝐴|𝐵)𝑃(𝐵),同理𝑃(𝐴∩𝐵)=𝑃(𝐵|𝐴)𝑃(𝐴)。
得出𝑃(𝐴|𝐵)=𝑃(𝐵|𝐴)𝑃(𝐴)/𝑃(𝐵),即条件概率的计算公式。
3、全概率公式
由公式 𝑃(𝐵)=𝑃(𝐵∩𝐴)+𝑃(𝐵∩𝐴′),代入𝑃(𝐵∩𝐴)=𝑃(𝐵|𝐴)𝑃(𝐴)得到全概率公式:𝑃(𝐵)=𝑃(𝐵|𝐴)𝑃(𝐴)+𝑃(𝐵|𝐴′)𝑃(𝐴′),再代入条件概率的计算公式:
4、贝叶斯推断
𝑃(𝐴|𝐵)=𝑃(𝐵|𝐴)𝑃(𝐴)/𝑃(𝐵)中:
𝑃(𝐴|𝐵)是后验概率(Posterior probability),可理解为在观察证据 B 时假设 A 发生的概率;
𝑃(𝐵|𝐴)是似然度,即在假设 A 成立的条件下,观察到证据 B 的概率;
𝑃(𝐴)是先验概率(Prior probability),即在没有观察到任何证据前,假设 A 成立的概率;
𝑃(𝐵)是边缘概率,即观察到证据 B 的概率,可以视为归一化常量;
𝑃(𝐵|𝐴)/𝑃(𝐵)称为可能性函数(Likelyhood),这是一个调整因子,使得预估概率更接近真实概率。
所以,条件概率可以理解为:后验概率=先验概率x调整因子
我们先预估一个"先验概率",然后加入实验结果,看这个实验到底是增强还是削弱了"先验概率",由此得到更接近事实的"后验概率"。
5、朴素贝叶斯推断
贝叶斯和朴素贝叶斯的概念是不同的,区别就在于"朴素"二字,朴素贝叶斯对条件概率分布做了条件独立性的假设。 比如下面的公式,假设有n个特征:
根据贝叶斯定理,后验概率 P(a|X) 可以表示为𝑃(a|X)=𝑃(X|a)𝑃(a)/𝑃(X),将联合概率 P(X|a) 分解为各个特征的概率乘积:
将这个条件独立性假设应用于贝叶斯公式,得到:
这样,朴素贝叶斯分类器就可以通过计算每种可能类别的条件概率和先验概率,然后选择具有最高概率的类别作为预测结果。
6、拉普拉斯平滑系数
某些事件或特征可能从未出现过,这会导致它们的概率被估计为零。然而,在实际应用中,即使某个事件或特征没有出现在训练集中,也不能完全排除它在未来样本中出现的可能性。拉普拉斯平滑技术可以避免这种"零概率陷阱"。
一般α取值1,m的值为总特征数。
通过这种方法,即使某个特征在训练集中从未出现过,它的概率也不会被估计为零,而是会被赋予一个很小但非零的值,从而避免了模型在面对新数据时可能出现的过拟合或预测错误。
api:
朴素贝叶斯算法
sklearn.naive_bayes.MultinomialNB()
estimator.fit(x_train, y_train)
y_predict = estimator.predict(x_test)
python
# 鸢尾花数据集 贝叶斯分类
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import MultinomialNB
# 加载数据
x,y = load_iris(return_X_y=True)
# 划分数据
x_train,x_test,y_trian,y_test = train_test_split(x,y,train_size=0.8)
# 处理数据 不用标准化
# 初始化贝叶斯预估器
estimator = MultinomialNB()
# 训练模型
estimator.fit(x_train,y_train)
# 评估模型
score = estimator.score(x_test,y_test)
print(score)
python
# 泰坦尼克号数据集 贝叶斯分类
from sklearn.naive_bayes import MultinomialNB
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction import DictVectorizer
import pandas as pd
data = pd.read_csv('../src/titanic/titanic.csv')
x = data[['pclass','age','sex']]
# 众数填充age的缺省值
x['age'].fillna(x['age'].value_counts().index[0],inplace=True)
# 将sex特征下的male和female转换为0和1
x['sex'] = [0 if i=='male' else 1 for i in x['sex']]
x['pclass']=[int(i[0]) for i in x['pclass']]
print(x)
y = data[['survived']]
# 划分数据
x_train,x_test,y_train,y_test=train_test_split(x,y,train_size=0.8,random_state=100)
# 初始化朴素贝叶斯预估器
estimator = MultinomialNB()
# 训练模型
estimator.fit(x_train,y_train)
# 评估模型
score = estimator.score(x_test,y_test)
print(score)
# 预测
y_predict = estimator.predict([[1,30,1]])
print(y_predict)
二、决策树分类
1、相关概念
1.决策节点
通过条件判断而进行分支选择的节点。如:将某个样本中的属性值(特征值)与决策节点上的值进行比较,从而判断它的流向。
2.叶子节点
没有子节点的节点,表示最终的决策结果。
3.决策树的深度
所有节点的最大层次数。决策树具有一定的层次结构,根节点的层次数定为0,从下面开始每一层子节点层次数增加。
4.决策树优点
可视化-可解释能力-对算力要求低
5.决策树缺点
容易产生过拟合,所以应避免调整过大的深度。
2、基于信息增益决策树的建立
信息增益决策树倾向于选择取值较多的属性,在有些情况下这类属性可能不会提供太多有价值的信息,算法只能对描述属性为离散型属性的数据集构造决策树。
1.信息熵
信息熵描述的是不确定性。信息熵越大,不确定性越大。信息熵的值越小,则D的纯度越高。
假设样本集合D共有N类,第k类样本所占比例为pk,则D的信息熵为
2.信息增益
信息增益是一个统计量,用来描述一个属性区分数据样本的能力。信息增益越大,那么决策树就会越简洁。
这里信息增益的程度用信息熵的变化程度来衡量, 信息增益公式:
3.建立步骤
计算根节点的信息熵---计算属性的信息增益---划分属性
3、基于基尼指数决策树的建立
基尼指数(Gini Index)是决策树算法中用于评估数据集纯度的一种度量,基尼指数衡量的是数据集的不纯度,或者说分类的不确定性。
对于多分类问题,如果一个节点包含的样本属于第 k 类的概率是 pk,则节点的基尼指数定义为:
意义
-
当一个节点的所有样本都属于同一类别时,基尼指数为 0,表示纯度最高。
-
当一个节点的样本均匀分布在所有类别时,基尼指数最大,表示纯度最低。
应用
在构建决策树时,我们希望每个内部节点的子节点能更纯,即基尼指数更小。因此,选择分割特征和分割点的目标是使子节点的平均基尼指数最小化。
具体来说,对于一个特征,我们计算其所有可能的分割点对应的子节点的加权平均基尼指数,然后选择最小化这个值的分割点。这个过程会在所有特征中重复,直到找到最佳的分割特征和分割点。
例如,考虑一个数据集 (D),其中包含 (N) 个样本,特征 (A) 将数据集分割为 |D_1|和 |D_2| ,则特征 (A) 的基尼指数为:
其中 |D_1|和 |D_2| 分别是子集 D_1 和 D_2 中的样本数量。
通过这样的方式,决策树算法逐步构建一棵树,每一层的节点都尽可能地减少基尼指数,最终达到对数据集的有效分类。
api:
sklearn.tree.DecisionTreeClassifier(....)
参数:
criterion "gini" "entropy" 默认为="gini"
当criterion取值为"gini"时采用 基尼不纯度(Gini impurity)算法构造决策树,
当criterion取值为"entropy"时采用信息增益( information gain)算法构造决策树.
max_depth int, 默认为=None 树的最大深度
可视化决策树sklearn.tree.export_graphviz(estimator, out_file="iris_tree.dot", feature_names=iris.feature_names)
参数:
estimator决策树预估器
out_file生成的文档
feature_names节点特征属性名
功能:
把生成的文档打开,复制出内容粘贴到"http://webgraphviz.com/"中,点击"generate Graph"会生成一个树型的决策树图
python
# 鸢尾花数据集 使用信息增益算法构造决策树
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.tree import DecisionTreeClassifier,export_graphviz
iris = load_iris()
x,y = load_iris(return_X_y=True)
x_train,x_test,y_train,y_test = train_test_split(x,y,train_size=0.75)
scaler = StandardScaler()
x_train = scaler.fit_transform(x_train)
x_test = scaler.transform(x_test)
# critierion=entropuy 采用信息增益算法构建决策树 (criterion默认为gini 采用基尼不纯度算法构造决策树)
estimator = DecisionTreeClassifier(criterion=entropuy)
estimator.fit(x_train,y_trian)
score = estimator.score(x_test,y_test)
print(score)
y_predict = estimator.predict([[2,2,3,1],[3,5,4,7]])
print(y_predict)
# 可视化决策树
# export_graphviz(estimator, out_file='../model/iris_tree.dot', feature_names=iris.feature_names)