多分类与概率预测:高斯朴素贝叶斯代码实现技术问询
完善后的高斯朴素贝叶斯多分类与概率预测代码及解析
我帮你把这段用于多分类和概率预测的代码补全并做了优化,解决了版本兼容、代码完整性等问题,同时附上了详细的技术解析:
完整可运行代码
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
相关产品推荐
相关产品推荐

