You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多分类与概率预测:高斯朴素贝叶斯代码实现技术问询

完善后的高斯朴素贝叶斯多分类与概率预测代码及解析

我帮你把这段用于多分类和概率预测的代码补全并做了优化,解决了版本兼容、代码完整性等问题,同时附上了详细的技术解析:

完整可运行代码

import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split  # 替代旧版的cross_validation,避免弃用警告
from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import classification_report, accuracy_score

# 读取数据集(无需手动管理文件句柄,pandas会自动处理)
data_path = "df.csv"
data = pd.read_csv(data_path, sep=",")

# 分离特征与标签(假设数据集最后一列为分类标签,可根据实际结构调整索引)
# 原代码的0:127是左闭右开区间,仅包含前127列,这里调整为0:128以匹配128个特征(按需修改)
features = data.iloc[:, 0:128]
labels = data.iloc[:, 128]

# 划分训练集与测试集:调整测试集占比为30%(原60%训练数据太少,模型学习效果会打折扣)
train_features, test_features, train_labels, test_labels = train_test_split(
    features, labels, test_size=0.3, random_state=0
)

# 初始化并训练高斯朴素贝叶斯模型
gnb_model = GaussianNB()
gnb_model.fit(train_features, train_labels)

# 执行分类预测
class_predictions = gnb_model.predict(test_features)

# 输出模型性能评估指标
print("模型分类准确率:", accuracy_score(test_labels, class_predictions))
print("\n分类详细报告(包含精确率、召回率、F1值):\n", classification_report(test_labels, class_predictions))

# 输出概率预测结果(每个样本对应所有类别的概率值)
probability_predictions = gnb_model.predict_proba(test_features)
print("\n前5个样本的类别概率预测(每行对应一个样本,每列对应一个类别的概率):\n", probability_predictions[:5])

代码优化与补全说明

  • 版本兼容修复:原代码使用的cross_validation模块在scikit-learn 0.20+版本已被弃用,替换为model_selection下的train_test_split,避免运行时警告或错误。
  • 简化数据读取:直接用pd.read_csv读取文件路径,无需手动打开/关闭文件句柄,代码更简洁且避免资源泄漏。
  • 明确特征标签划分:清晰分离特征矩阵和标签向量,假设最后一列为分类标签,如果你的数据集标签位置不同,只需调整iloc的索引即可。
  • 合理划分数据集:原代码测试集占比60%,会导致训练数据不足,模型泛化能力差,这里调整为30%的测试集比例,你可以根据数据集大小灵活调整。
  • 补充概率预测功能:通过predict_proba()方法实现你需要的概率预测,直接输出每个样本属于各个类别的概率值。
  • 添加模型评估:加入准确率和分类报告,方便快速评估模型的分类性能。

常见技术疑问解答

1. 高斯朴素贝叶斯适合我的多分类场景吗?

高斯NB适合处理连续型特征的分类任务,它假设特征服从正态分布,计算速度快,对小数据集友好,还能直接输出类别概率,非常匹配你的需求。如果你的特征是离散型(比如文本词频),可以换成MultinomialNB;如果是二元特征,用BernoulliNB更合适。

2. 概率预测结果怎么解读?

predict_proba()返回的是一个二维数组,每行对应一个测试样本,每列对应一个类别的概率值,所有类别的概率之和为1。比如某一行是[0.1, 0.8, 0.1],表示该样本属于第二个类别的概率是80%,另外两个类别各10%。

3. 模型预测效果不好怎么办?

  • 检查数据预处理:高斯NB无法处理缺失值,先填充缺失值(连续特征用均值/中位数,类别特征用众数);如果特征量纲差异大,虽然NB对量纲不敏感,但标准化后可能会提升效果。
  • 验证特征独立性假设:NB的核心假设是特征相互独立,如果你的特征存在强相关性,会影响预测准确性,可以通过特征选择(比如SelectKBest)剔除冗余特征。
  • 调整模型参数:高斯NB的核心可调参数是var_smoothing(用于平滑方差,避免出现方差为0的极端情况),可以用网格搜索GridSearchCV找到最优值:
    from sklearn.model_selection import GridSearchCV
    param_grid = {'var_smoothing': np.logspace(0, -9, num=100)}
    grid_search = GridSearchCV(GaussianNB(), param_grid, cv=5)
    grid_search.fit(train_features, train_labels)
    print("最优平滑参数:", grid_search.best_params_)
    

4. 如何用交叉验证替代单次训练测试划分?

如果想更可靠地评估模型性能,可以用K折交叉验证:

from sklearn.model_selection import cross_val_score
scores = cross_val_score(gnb_model, features, labels, cv=5)
print("5折交叉验证准确率均值:", scores.mean())
print("各折准确率:", scores)

内容的提问来源于stack exchange,提问作者Vidya Marathe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:22:22