朴素贝叶斯分类
1贝叶斯分类理论
选择高概率对应的类别
2条件概率
事件B发生的情况下,事件A发生的概率
𝑃(𝐴|𝐵)=𝑃(𝐴∩𝐵)/𝑃(𝐵) => 𝑃(𝐴∩𝐵)=𝑃(𝐴|𝐵)𝑃(𝐵) ①
同理:
𝑃(𝐴∩𝐵)=𝑃(𝐵|𝐴)𝑃(𝐴) ②
根据①②可得:
𝑃(𝐴|𝐵)=𝑃(B|A)𝑃(𝐴)/𝑃(𝐵) 即条件概率
3 全概率公式
①𝑃(𝐵)=𝑃(𝐵∩𝐴)+𝑃(𝐵∩𝐴′)
②𝑃(𝐵∩𝐴)=𝑃(𝐵|𝐴)𝑃(𝐴)
=>𝑃(𝐵)=𝑃(𝐵|𝐴)𝑃(𝐴)+𝑃(𝐵|𝐴′)𝑃(𝐴′) (全概率公式)
A和A'构成样本空间的一个划分,那么事件B的概率,就等于A和A'的概率分别乘以B对这两个事件的条件概率之和。
4 贝叶斯推断
条件概率公式变形可得:
先验概率 ( P(A) ) 是在事件 ( B ) 发生之前,对事件 ( A ) 概率的初步判断。
后验概率 ( P(A|B)) 是在事件 ( B ) 发生之后,对事件 ( A ) 概率的更新评估。
似然函数 ( P(B|A)/P(B) ) 是一个调整因子,用于将先验概率与实际观测结果结合,使得估计的概率更接近真实值。
因此,条件概率可以理解为:
后验概率 = 先验概率 × 似然函数
这就是贝叶斯推断的核心:通过先验概率和实验结果(即似然函数),更新对事件概率的估计。
5 朴素贝叶斯推断
理解了贝叶斯推断,那么让我们继续看看朴素贝叶斯。贝叶斯和朴素贝叶斯的概念是不同的,区别就在于"朴素"二字,朴素贝叶斯对条件概率分布做了条件独立性的假设。
6 拉普拉斯平滑系数
拉普拉斯平滑(或加一平滑)是一种处理"零概率陷阱"的技术,它通过对概率进行调整,避免了在特征或事件未在训练集中出现时其概率被估计为零的问题。
公式为:
一般α取值1,m的值总特征数量
API
sklearn.naive_bayes.MultinomialNB() estimator.fit(x_train, y_train) y_predict = estimator.predict(x_test)
示例:
#贝叶斯 from sklearn.naive_bayes import MultinomialNB # type: ignore from sklearn.datasets import load_wine from sklearn.model_selection import train_test_split wind=load_wine() x_train,x_test,y_train,y_test=train_test_split(wind.data,wind.target,test_size=0.3) clf=MultinomialNB() clf.fit(x_train,y_train) print(clf.score(x_test,y_test)) pre=clf.predict(x_train) print(pre)
决策树-分类
1 概念
-
决策节点 决策节点用于通过条件判断进行分支选择。例如,在决策树中,将样本的特征值与决策节点上的阈值进行比较,以确定样本的流向。
-
叶子节点 叶子节点是没有子节点的终端节点,表示最终的决策结果或分类标签。
-
决策树的深度 决策树的深度指的是从根节点到最远叶子节点的最长路径上的层次数。根节点的深度为0,每下层的节点深度增加1。
-
决策树的优点
可视化 可解释性 计算要求低
-
决策树的缺点
过拟合:决策树容易过拟合训练数据,特别是当树的深度过大时。因此,需要控制树的深度或进行剪枝,以避免过拟合
2 基于信息增益决策树的建立
信息增益决策树倾向于选择取值较多的属性,在有些情况下这类属性可能不会提供太多有价值的信息,算法只能对描述属性为离散型属性的数据集构造决策树。
(1) 信息熵
信息熵描述的是不确定性。信息熵越大,不确定性越大。信息熵的值越小,则D的纯度越高。
假设样本集合D共有N类,第k类样本所占比例为Pk,则D的信息熵为
(2) 信息增益
信息增益是一个统计量,用来描述一个属性区分数据样本的能力。信息增益越大,那么决策树就会越简洁。这里信息增益的程度用信息熵的变化程度来衡量, 信息增益公式:
。
(3) 信息增益决策树建立步骤
第一步,计算根节点的信息熵
第二步,计算属性的信息增益
第三步, 划分属性
3 基于基尼指数决策树的建立(了解)
定义基尼指数
基尼指数定义为:
其中:
-
D是当前数据集。
-
K是类别的总数。
-
pk是属于第 k类的样本占数据集 D 的比例。
基尼指数越低数据集的纯度越高。
计算基尼增益
对于每个特征,我们计算分裂前后的基尼指数的变化,称为基尼增益。选择使基尼增益最大的特征作为分裂特征。基尼增益的计算公式为:
其中:
-
A是候选特征。
-
Values(A)是特征 A 的所有可能取值。
-
Dv是特征 A 取值为 v 的子集。
∣Dv∣和 ∣D∣∣ 分别是子集 Dv 和整个数据集 D 的样本数。
示例
# 可视化决策树 function sklearn.tree.export_graphviz(estimator, out_file="iris_tree.dot", feature_names=iris.feature_names) 参数: estimator决策树预估器 out_file生成的文档 feature_names节点特征属性名
用决策树对葡萄酒进行分类
from sklearn.datasets import load_wine from sklearn.model_selection import StratifiedKFold from sklearn.preprocessing import StandardScaler from sklearn.tree import DecisionTreeClassifier, export_graphviz import numpy as np # 加载数据 wine = load_wine() X, y = wine.data, wine.target # 确保 X 和 y 被正确地定义 # 划分数据集 s_k_fold = StratifiedKFold(n_splits=5, shuffle=True, random_state=17) for train_index, test_index in s_k_fold.split(X, y): X_train, X_test = X[train_index], X[test_index] y_train, y_test = y[train_index], y[test_index] # 数据预处理 transfer = StandardScaler() X_train = transfer.fit_transform(X_train) X_test = transfer.transform(X_test) # 模型训练 model = DecisionTreeClassifier(criterion='entropy') model.fit(X_train, y_train) # 模型评估 score = model.score(X_test, y_test) print("Fold Accuracy:\n", score) # 预测 pre = model.predict(X_test) print("真实值:\n", y_test) print("预测值:\n", pre) print("预测值对应的类别名:\n", wine.target_names[pre]) # 保存模型 export_graphviz(model, out_file='./src/wine.dot', feature_names=wine.feature_names)