朴素贝叶斯分类器基于"特征条件独立"的强假设,当面对高度相关特征时,其性能可能显著下降。以下是系统化的解决方案:
1. 问题本质分析
数学视角:
朴素贝叶斯的联合概率计算:
P
(
y
∣
x
1
,
.
.
.
,
x
n
)
∝
P
(
y
)
∏
i
=
1
n
P
(
x
i
∣
y
)
P(y|x_1,...,x_n) \propto P(y) \prod_{i=1}^n P(x_i|y)
P(y∣x1,...,xn)∝P(y)i=1∏nP(xi∣y)
当特征 x i x_i xi和 x j x_j xj高度相关时,双重计算 P ( x i ∣ y ) P ( x j ∣ y ) P(x_i|y)P(x_j|y) P(xi∣y)P(xj∣y)会导致:
- 某些特征被过度加权
- 概率估计严重偏斜
2. 预处理解决方案
2.1 特征选择
实现代码:
from sklearn.feature_selection import VarianceThreshold
from scipy.stats import pearsonr
def remove_correlated_features(X, threshold=0.8):
corr_matrix = np.corrcoef(X.T)
n_features = corr_matrix.shape[0]
drop_indices = set()
for i in range(n_features):
if i in drop_indices:
continue
for j in range(i+1, n_features):
if abs(corr_matrix[i,j]) > threshold:
drop_indices.add(j)
return np.delete(X, list(drop_indices), axis=1)
2.2 特征变换
PCA降维:
from sklearn.decomposition import PCA
# 保留95%方差
pca = PCA(n_components=0.95)
X_transformed = pca.fit_transform(X)
优点:
- 消除线性相关性
- 降低维度诅咒风险
3. 算法层面改进
3.1 半朴素贝叶斯方法
TAN (Tree-Augmented Naive Bayes):
graph TB
Y((类别)) --> X1
Y --> X2
Y --> X3
X1 --> X3 # 允许部分依赖
实现步骤:
- 计算特征间互信息
- 构建最大带权生成树
- 添加类别节点作为所有特征的父节点
3.2 贝叶斯网络扩展
from pgmpy.models import BayesianModel
from pgmpy.estimators import BayesianEstimator
model = BayesianModel([
('Class', 'Feature1'),
('Class', 'Feature2'),
('Feature1', 'Feature3') # 显式建模依赖关系
])
model.fit(data, estimator=BayesianEstimator)
4. 模型集成方案
4.1 特征子集集成
from sklearn.ensemble import BaggingClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.feature_selection import SelectKBest
# 创建多个基分类器,每个使用不同的特征子集
ensemble = BaggingClassifier(
base_estimator=Pipeline([
('selector', SelectKBest(k=10)),
('nb', GaussianNB())
]),
n_estimators=50,
max_samples=0.8
)
4.2 堆叠分类器
5. 正则化技术
5.1 平滑先验调整
# 调整alpha参数进行拉普拉斯平滑
from sklearn.naive_bayes import MultinomialNB
model = MultinomialNB(alpha=1.5) # 增大alpha减少相关特征影响
5.2 特征加权
# 根据互信息赋予权重
from sklearn.feature_selection import mutual_info_classif
weights = mutual_info_classif(X, y)
weighted_X = X * weights.reshape(1, -1)
6. 评估与验证
关键指标:
- 特征相关矩阵
- 条件互信息:
I ( X i ; X j ∣ Y ) I(X_i;X_j|Y) I(Xi;Xj∣Y) - 模型校准曲线(可靠性图)
诊断代码:
def check_feature_dependence(X, y):
# 计算条件互信息
cond_mi = np.zeros((X.shape[1], X.shape[1]))
for i in range(X.shape[1]):
for j in range(i+1, X.shape[1]):
cond_mi[i,j] = conditional_mutual_info_score(
X[:,i], X[:,j], y)
plt.matshow(cond_mi)
plt.colorbar()
7. 实际应用建议
-
数据规模较小:
- 优先使用PCA+TAN组合
- 设置α=1.5~2.0的平滑系数
-
高维数据:
- 特征选择+集成学习
- 采用互信息加权
-
实时系统:
- 预计算特征相关矩阵
- 部署半朴素贝叶斯变体
-
模型解释需求强:
- 使用特征选择而非PCA
- 保留可解释的特征子集
通过组合这些方法,即使存在相关特征,也能使朴素贝叶斯保持较好的分类性能。对于关键任务系统,建议优先考虑TAN或贝叶斯网络扩展方案。