样本数量不一致问题及朴素贝叶斯分类代码实现咨询
解决朴素贝叶斯实现中的样本数量不一致问题及代码修正
首先,我看到你遇到了样本数量不一致的问题,同时在实现朴素贝叶斯分类时的代码有几个需要调整的地方,咱们一步步来解决:
1. 定位样本数量不一致的根源
看你定义的字典d,'Res'列表最后多了个冗余逗号,不过数下来Pos、Neg、Res都是10个元素,那大概率是你实际使用的数据里列长度不匹配。这种情况下,你需要先确保所有特征列和目标列的元素数量完全一致——可以用len()函数快速检查:
print(len(d['Pos']), len(d['Neg']), len(d['Res']))
输出必须是三个相同的数字,否则要调整数据:删掉多余元素,或者补充缺失的对应元素。
2. 修正朴素贝叶斯的代码实现
你的代码到train_target = tra...就断了,而且train_data的构造方式不符合scikit-learn的要求(模型需要二维特征数组,不是两个一维数组的元组)。下面是完整的修正代码:
首先别忘了导入pandas(你代码里用了pd.DataFrame但没导入):
import pandas as pd from sklearn.model_selection import train_test_split from sklearn.naive_bayes import GaussianNB from sklearn.metrics import accuracy_score # 可选,用来评估模型效果 # 定义数据,确保所有列长度严格一致 d = { 'Pos': [1,2,3,4,5,6,7,8,9,10], 'Neg': [10,9,8,7,6,5,4,3,2,1], 'Res': ['win','win','win','win','draw','loss','loss','loss','loss','loss'] } df = pd.DataFrame(d) # 拆分训练集和测试集,加random_state固定拆分结果方便复现 train, test = train_test_split(df, test_size=0.2, random_state=42) # 构造符合要求的特征数据和目标数据 train_data = train[['Pos', 'Neg']].values # 直接取特征列转成二维数组 train_target = train['Res'].values test_data = test[['Pos', 'Neg']].values test_target = test['Res'].values # 训练模型并预测 model = GaussianNB() model.fit(train_data, train_target) predictions = model.predict(test_data) # 可选:查看预测结果和准确率 print("测试集预测结果:", predictions) print("测试集准确率:", accuracy_score(test_target, predictions))
关键修正点说明
- 必须导入
pandas,否则pd.DataFrame会直接报错 train_data不能用(train.Pos.values, train.Neg.values),这会生成一个包含两个一维数组的元组,模型无法识别。正确做法是直接选取特征列,转成二维数组- 加上
random_state可以固定训练集和测试集的拆分结果,方便你调试时复现相同的实验结果 - 用
accuracy_score可以快速评估模型的分类效果,这在调试阶段非常实用
如果你的样本数量不一致问题出在读取外部数据的环节,可以检查数据加载代码,确保每行数据都有对应的特征和标签,没有缺失或冗余行。
内容的提问来源于stack exchange,提问作者Joe Pearson
相关产品推荐
相关产品推荐

