机器学习——决策树,朴素贝叶斯

一.决策树

  • 决策树中的基尼系数(Gini Index)是用于衡量数据集中不纯度(或混杂度)的指标。基尼系数的取值范围在0到0.5之间,其中0表示数据完全纯(同一类别),0.5表示数据完全混杂。

基尼系数的公式

对于一个节点,基尼系数的计算公式为:

G i n i ( p ) = 1 − ∑ i = 1 n p i 2 Gini(p) = 1 - \sum_{i=1}^{n} p_i^2 Gini(p)=1−i=1∑npi2

其中:

  • ( n ) 是类别的总数。
  • ( p_i ) 是属于类别 ( i ) 的样本所占的比例。

计算步骤

假设在某个节点上有 ( m ) 个样本,分别属于 ( n ) 个不同的类别,类别 ( i ) 的样本数量为 ( c_i ),那么:

p i = c i m p_i = \frac{c_i}{m} pi=mci

将 ( p_i ) 带入基尼系数公式,可以得到:

G i n i ( p ) = 1 − ∑ i = 1 n ( c i m ) 2 Gini(p) = 1 - \sum_{i=1}^{n} \left( \frac{c_i}{m} \right)^2 Gini(p)=1−i=1∑n(mci)2

示例计算

假设某个节点上有以下数据分布:

  • 类别 A: 4 个样本
  • 类别 B: 6 个样本
  • 类别 C: 10 个样本

总样本数量 ( m = 4 + 6 + 10 = 20 )。

每个类别的比例为:

  • 类别 A:
    p A = 4 20 = 0.2 p_A = \frac{4}{20} = 0.2 pA=204=0.2

  • 类别 B:
    p B = 6 20 = 0.3 p_B = \frac{6}{20} = 0.3 pB=206=0.3

  • 类别 C:
    p C = 10 20 = 0.5 p_C = \frac{10}{20} = 0.5 pC=2010=0.5

基尼系数计算如下:

G i n i ( p ) = 1 − ( 0. 2 2 + 0. 3 2 + 0. 5 2 ) = 1 − ( 0.04 + 0.09 + 0.25 ) = 1 − 0.38 = 0.62 Gini(p) = 1 - (0.2^2 + 0.3^2 + 0.5^2) = 1 - (0.04 + 0.09 + 0.25) = 1 - 0.38 = 0.62 Gini(p)=1−(0.22+0.32+0.52)=1−(0.04+0.09+0.25)=1−0.38=0.62

该节点的基尼系数为 0.62,表示数据在这个节点上具有一定的不纯度。基尼系数越小,节点越纯,因此在构建决策树时,通常选择基尼系数最小的划分方式来分割数据。

  • DecisionTreeClassifierscikit-learn 库中用于分类任务的决策树模型。决策树通过一系列决策规则将数据分成不同的类别。

1. criterion(默认值:"gini"

  • 含义:用于衡量数据分裂质量的指标。
  • 取值
    • "gini":使用基尼不纯度(Gini impurity)作为分裂的标准。基尼不纯度是衡量集合中随机选择的两个元素属于不同类别的概率。
    • "entropy":使用信息增益(Information Gain),基于信息熵(Entropy)来选择分裂点。

2. splitter(默认值:"best"

  • 含义:选择每次分裂的策略。
  • 取值
    • "best":在所有特征中选择最佳分裂点。
    • "random":随机选择特征的最佳分裂点。

3. max_depth(默认值:None

  • 含义:控制决策树的最大深度。树的深度越大,模型越复杂。
  • 取值
    • None:树会一直生长,直到所有叶节点是纯的,或者每个叶节点包含少于 min_samples_split 个样本。
    • int:树的最大深度。较小的值防止过拟合,较大的值允许树更复杂。

4. min_samples_split(默认值:2

  • 含义:内部节点再分裂所需的最小样本数。
  • 取值
    • int:指定最小样本数的具体值。
    • float:以比例形式指定最小样本数(即一个0到1之间的小数)。

5. min_samples_leaf(默认值:1

  • 含义:叶节点所需的最小样本数。可以防止模型生成包含少量样本的叶节点。
  • 取值
    • int:指定最小样本数的具体值。
    • float:以比例形式指定最小样本数。

6. min_weight_fraction_leaf(默认值:0.0

  • 含义:叶节点所需的最小样本权重的比例。
  • 取值
    • float:介于0到1之间,通常用于处理样本权重。

7. max_features(默认值:None

  • 含义:在每次分裂时考虑的最大特征数量。
  • 取值
    • None:使用所有特征。
    • int:使用指定数量的特征。
    • float:使用特定比例的特征。
    • "auto":等同于 sqrt(n_features)
    • "sqrt":等同于 sqrt(n_features)
    • "log2":等同于 log2(n_features)

8. random_state(默认值:None

  • 含义:控制随机数生成器的种子,以便结果可以复现。
  • 取值
    • None:随机种子。
    • int:指定种子。

9. max_leaf_nodes(默认值:None

  • 含义 :限制树的最大叶节点数。设置此参数会优先于 max_depth
  • 取值
    • None:不限制叶节点数量。
    • int:最大叶节点数量。

10. min_impurity_decrease(默认值:0.0

  • 含义:节点分裂后不纯度下降的最小值。如果不纯度下降小于这个值,节点将不再分裂。
  • 取值
    • float:一个非负值。

11. class_weight(默认值:None

  • 含义:为不同类别指定权重,用于处理类别不平衡问题。
  • 取值
    • None:不调整类别权重。
    • dict:根据指定字典中的权重调整类别。
    • "balanced":根据类频率调整权重,权重与样本数量成反比。

12. ccp_alpha(默认值:0.0

  • 含义:复杂度剪枝参数,作为最小成本复杂度修剪的参数。增加此值将导致更简单的树。
  • 取值
    • float:一个非负值。越大越能剪枝。

示例代码

python 复制代码
#决策树

from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.tree import DecisionTreeRegressor
from sklearn.metrics import accuracy_score

# 1. 加载数据集
wine = load_wine()
X = wine.data
y = wine.target

# 2. 标准化数据
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# 3. PCA降维
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_scaled)

# 4. 将数据集划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X_pca, y, test_size=0.3, random_state=32)

# 5. 决策树预估器
nb = DecisionTreeRegressor()
nb.fit(X_train, y_train)

# 6. 预测和评估
y_pred = nb.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)

print(f"分类准确率: {accuracy:.2f}")
  • 控制树的复杂性 :可以通过调整 max_depthmin_samples_splitmin_samples_leafmax_leaf_nodes 等参数来控制决策树的复杂性,避免过拟合。
  • 处理类别不平衡 :使用 class_weight 参数为不同类别指定权重。

二.朴素贝叶斯

朴素贝叶斯(Naive Bayes)是基于贝叶斯定理的一类简单而强大的分类算法。尽管它的假设比较强(特征之间条件独立),但在许多实际应用中效果非常好。下面是朴素贝叶斯算法的数学原理:

1. 贝叶斯定理

贝叶斯定理是朴素贝叶斯分类器的基础,用于计算后验概率。贝叶斯定理的公式如下:
P ( y ∣ X ) = P ( X ∣ y ) ⋅ P ( y ) P ( X ) P ( y ∣ X ) = P ( X ∣ y ) ⋅ P ( y ) P ( X ) P ( y ∣ X ) = P ( X ) P ( X ∣ y ) ⋅ P ( y ) P(y∣X)=P(X∣y)⋅P(y)P(X)P(y | X) = \frac{P(X | y) \cdot P(y)}{P(X)}P(y∣X)=P(X)P(X∣y)⋅P(y) P(y∣X)=P(X∣y)⋅P(y)P(X)P(y∣X)=P(X)P(X∣y)⋅P(y)P(y∣X)=P(X)P(X∣y)⋅P(y)

其中:

  • P ( y ∣ X ) P ( y ∣ X ) P ( y ∣ X ) P(y∣X)P(y | X)P(y∣X) P(y∣X)P(y∣X)P(y∣X)

    是给定特征 XXX 时类别 yyy 的后验概率。

  • P(X∣y)P(X | y)P(X∣y) 是在类别 yyy 的条件下,特征 XXX 出现的概率,即似然度。

  • P(y)P(y)P(y) 是类别 yyy 的先验概率。

  • P(X)P(X)P(X) 是特征 XXX 的边际概率(用于归一化)。

2. 朴素假设

朴素贝叶斯模型做了一个关键的简化假设,即特征之间是条件独立的 ,这意味着给定类别 yyy 时,特征
X 1 , X 2 , ... , X n X 1 , X 2 , ... , X n X 1 , X 2 , ... , X n X1,X2,...,XnX_1, X_2, \dots, X_nX1,X2,...,Xn X1,X2,...,XnX1,X2,...,XnX1,X2,...,Xn

是独立的。这一假设大大简化了后验概率的计算,使得模型易于实现且计算效率高。

在这种假设下,贝叶斯定理可以简化为:
P ( y ∣ X 1 , X 2 , ... , X n ) ∝ P ( y ) ⋅ P ( X 1 ∣ y ) ⋅ P ( X 2 ∣ y ) ⋅ ⋯ ⋅ P ( X n ∣ y ) P ( y ∣ X 1 , X 2 , ... , X n ) ∝ P ( y ) ⋅ P ( X 1 ∣ y ) ⋅ P ( X 2 ∣ y ) ⋅ ⋯ ⋅ P ( X n ∣ y ) P ( y ∣ X 1 , X 2 , ... , X n ) ∝ P ( y ) ⋅ P ( X 1 ∣ y ) ⋅ P ( X 2 ∣ y ) ⋅ ⋯ ⋅ P ( X n ∣ y ) P(y∣X1,X2,...,Xn)∝P(y)⋅P(X1∣y)⋅P(X2∣y)⋅⋯⋅P(Xn∣y)P(y | X_1, X_2, \dots, X_n) \propto P(y) \cdot P(X_1 | y) \cdot P(X_2 | y) \cdot \dots \cdot P(X_n | y)P(y∣X1,X2,...,Xn)∝P(y)⋅P(X1∣y)⋅P(X2∣y)⋅⋯⋅P(Xn∣y) P(y∣X1,X2,...,Xn)∝P(y)⋅P(X1∣y)⋅P(X2∣y)⋅⋯⋅P(Xn∣y)P(y∣X1,X2,...,Xn)∝P(y)⋅P(X1∣y)⋅P(X2∣y)⋅⋯⋅P(Xn∣y)P(y∣X1,X2,...,Xn)∝P(y)⋅P(X1∣y)⋅P(X2∣y)⋅⋯⋅P(Xn∣y)

这意味着我们可以通过计算各个特征在每个类别下的条件概率,并将它们相乘来计算后验概率。

  • MultinomialNB() 多项式朴素贝叶斯和 GaussianNB() 都是朴素贝叶斯(Naive Bayes)分类器的变种,适用于不同类型的数据。

1. MultinomialNB()--多项式朴素贝叶斯

  • MultinomialNB() 是朴素贝叶斯分类器的一种,适用于多项式分布数据或者称为计数数据的分类问题。它假设特征是由一个多项分布生成的,这在文本分类和其他类型的分类任务中非常常见。

适用情况

  • 数据特征应为计数数据,如文档中单词出现的次数。
  • 特征可以是整数计数,通常是非负的。
  • 多项式朴素贝叶斯通常用于文本分类,其中特征向量表示单词出现的频率或者 TF-IDF 权重。

工作原理

  • 计算每个类别的条件概率,即给定类别下每个特征的概率分布。
  • 使用贝叶斯定理计算后验概率,并结合各特征的条件概率,得出最终的分类结果。
    #多项式朴素贝叶斯
python 复制代码
from sklearn.datasets import load_wine
from sklearn.preprocessing import StandardScaler #标准化
from sklearn.preprocessing import MinMaxScaler#归一化
from sklearn.decomposition import PCA
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import MultinomialNB
import numpy as np

data = load_wine()

x= data.data

# #标准化
# transfer = StandardScaler()
# x1 =transfer.fit_transform(x)

# 2. 缩放数据到[0, 1]范围
scaler = MinMaxScaler()
x1 = scaler.fit_transform(x)

#PCA降维
tr = PCA(n_components=0.89)
x2 = tr.fit_transform(x1)

# 4. 将负值平移为非负值
x3 = x2- np.min(x2)

x_train, x_test, y_train, y_test = train_test_split(x3, data.target,test_size=0.2,random_state=44)


#MultinomialNB分类--多项式朴素贝叶斯
model = MultinomialNB()
model.fit(x_train,y_train)

score = model.score(x_test,y_test)
print(score)

2. GaussianNB()

  • GaussianNB() 是朴素贝叶斯分类器的另一种形式,适用于特征服从正态分布(Gaussian Distribution)的数据分类问题。

适用情况

  • 特征数据应为连续值,符合正态分布。
  • 可以处理实数特征,如一些测量值或者物理量。

工作原理

  • 假设每个类别的特征值服从正态分布,通过计算每个类别下特征的均值和方差来估计类别条件概率分布。
  • 使用贝叶斯定理计算后验概率,并结合特征的正态分布参数,得出最终的分类结果。
    #朴素贝叶斯分类
python 复制代码
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import accuracy_score

# 1. 加载数据集
wine = load_wine()
X = wine.data
y = wine.target

# 2. 标准化数据
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# 3. PCA降维
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_scaled)

# 4. 将数据集划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X_pca, y, test_size=0.3, random_state=42)

# 5. 朴素贝叶斯分类
nb = GaussianNB()
nb.fit(X_train, y_train)

# 6. 预测和评估
y_pred = nb.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)

print(f"分类准确率: {accuracy:.2f}")

总结比较

  • 数据类型

    • MultinomialNB() 适用于离散型特征,如计数数据。
    • GaussianNB() 适用于连续型特征,如实数数据。
  • 假设

    • MultinomialNB() 假设特征是由多项分布生成的。
    • GaussianNB() 假设特征值服从正态分布。
  • 应用场景

    • MultinomialNB() 在文本分类(如垃圾邮件分类)、推荐系统(基于用户行为的分类)等方面表现良好。
    • GaussianNB() 在数据特征服从正态分布的情况下表现良好,如一些传感器数据的分类或者健康检测领域。
相关推荐
果冻人工智能35 分钟前
2025 年将颠覆商业的 8 大 AI 应用场景
人工智能·ai员工
代码不行的搬运工36 分钟前
神经网络12-Time-Series Transformer (TST)模型
人工智能·神经网络·transformer
石小石Orz38 分钟前
Three.js + AI:AI 算法生成 3D 萤火虫飞舞效果~
javascript·人工智能·算法
罗小罗同学44 分钟前
医工交叉入门书籍分享:Transformer模型在机器学习领域的应用|个人观点·24-11-22
深度学习·机器学习·transformer
孤独且没人爱的纸鹤1 小时前
【深度学习】:从人工神经网络的基础原理到循环神经网络的先进技术,跨越智能算法的关键发展阶段及其未来趋势,探索技术进步与应用挑战
人工智能·python·深度学习·机器学习·ai
阿_旭1 小时前
TensorFlow构建CNN卷积神经网络模型的基本步骤:数据处理、模型构建、模型训练
人工智能·深度学习·cnn·tensorflow
羊小猪~~1 小时前
tensorflow案例7--数据增强与测试集, 训练集, 验证集的构建
人工智能·python·深度学习·机器学习·cnn·tensorflow·neo4j
极客代码1 小时前
【Python TensorFlow】进阶指南(续篇三)
开发语言·人工智能·python·深度学习·tensorflow
zhangfeng11331 小时前
pytorch 的交叉熵函数,多分类,二分类
人工智能·pytorch·分类
Seeklike1 小时前
11.22 深度学习-pytorch自动微分
人工智能·pytorch·深度学习