一.决策树
- 决策树中的基尼系数(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,表示数据在这个节点上具有一定的不纯度。基尼系数越小,节点越纯,因此在构建决策树时,通常选择基尼系数最小的划分方式来分割数据。
DecisionTreeClassifier
是scikit-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
:一个非负值。越大越能剪枝。
示例代码
#决策树
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_depth
、min_samples_split
、min_samples_leaf
、max_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 权重。
工作原理:
- 计算每个类别的条件概率,即给定类别下每个特征的概率分布。
- 使用贝叶斯定理计算后验概率,并结合各特征的条件概率,得出最终的分类结果。
#多项式朴素贝叶斯
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)的数据分类问题。
适用情况:
- 特征数据应为连续值,符合正态分布。
- 可以处理实数特征,如一些测量值或者物理量。
工作原理:
- 假设每个类别的特征值服从正态分布,通过计算每个类别下特征的均值和方差来估计类别条件概率分布。
- 使用贝叶斯定理计算后验概率,并结合特征的正态分布参数,得出最终的分类结果。
#朴素贝叶斯分类
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()
在数据特征服从正态分布的情况下表现良好,如一些传感器数据的分类或者健康检测领域。