基于Matlab fitcnb的书籍文本分类策略有效性及优化咨询
关于朴素贝叶斯书籍分类策略的可行性与准确率提升分析
首先直接给结论:你的核心分类策略是可行的——用朴素贝叶斯做文本分类、基于词汇特征区分书籍类别的方向没问题,但当前的实现细节和特征设计有明显优化空间,这也是你准确率不佳的主要原因。至于扩大训练集到50或100本,只要训练集质量达标,肯定会显著提升准确率,但前提是先把现有策略的漏洞补上。
下面分点拆解问题和优化建议:
一、当前策略的核心问题
你的特征是“指定词汇在书中出现的行数”,这个设计有两个硬伤:
- 同一行里可能多次出现同一个关键词(比如烹饪书里某行反复提
tomato),但你只计数1次,丢失了关键的频次信息 - 手动维护一堆
regexp判断不仅效率低,还容易漏写或出错,而且没有考虑词汇的区分度(比如有些词在两类书里出现频率差不多,反而会干扰模型)
另外,你选择的Distribution='mvmn'(多元正态分布)不太适配你的计数型特征——正态分布针对连续数值,而你的特征是离散的计数数据,这会影响模型的拟合效果。
二、扩大训练集的作用
30本训练样本确实太少了,尤其是当两类书籍的样本不均衡(比如金融书远多于烹饪书)或者样本覆盖不够(比如只选了西餐烹饪书、只选了股票类金融书)时,模型的泛化能力会很差。
如果能把训练集扩到50甚至100本,同时保证:
- 两类样本数量尽量均衡(比如4:6以内的比例)
- 样本覆盖足够的子类别(比如烹饪书包含中餐、西餐、烘焙;金融书包含股票、理财、保险)
- 标签完全准确
那么模型的准确率会有明显提升——更多的样本能让模型更准确地学习到两类书籍的词汇分布规律。
三、具体优化建议(附改进代码)
1. 优化特征设计
把“出现行数”改成词频(TF)或TF-IDF,后者能自动给区分度高的词汇更高权重。同时用Matlab内置的文本处理工具替代手动regexp计数,更高效规范。
2. 调整朴素贝叶斯的分布参数
针对计数型特征,选择Distribution='mn'(多元朴素贝叶斯)或者'poisson'(泊松分布),比多元正态分布更适配。另外用内置的Smoothing参数做平滑,不用手动加0.001。
改进后的示例代码
% ---------------------- 训练阶段 ---------------------- % 实际场景中可通过dir函数批量读取训练集文本路径,这里用模拟文本示例 trainTexts = [ "rich investment fund stock profit dividend", % 金融书文本片段 "bank loan interest market finance mortgage", "tomato pasta recipe cooking oven seasoning", % 烹饪书文本片段 "salt sugar baking cake dough ingredient" ]; Y = [1;1;2;2]; % 1=金融类,2=烹饪类 % 文本预处理+生成词袋特征 docs = tokenizedDocument(trainTexts); % 移除停用词(如the/and这类无区分度的词) docs = removeStopWords(docs); bag = bagOfWords(docs); % 过滤低频词,减少噪声干扰 bag = removeInfrequentWords(bag, 2); % 转换为TF-IDF特征(比单纯词频的区分度更高) X = tfidf(bag); % 训练适配计数特征的朴素贝叶斯模型 Mdl = fitcnb(X, Y, 'Distribution', 'mn', 'Smoothing', 0.001); % ---------------------- 预测阶段 ---------------------- % 读取待预测文本文件 fid = fopen('D:\ksiazki\ksiazki kucharskie\txt\1.txt','rt'); if fid < 0 error('Error loading file'); end predText = fread(fid, '*char')'; fclose(fid); % 转换为与训练集一致的特征格式 predDoc = tokenizedDocument(predText); predDoc = removeStopWords(predDoc); predBag = bagOfWords(predDoc, 'Vocabulary', bag.Vocabulary); predX = tfidf(predBag); % 执行预测 label = predict(Mdl, predX); disp(['预测书籍类别:', num2str(label)]);
3. 额外小技巧
- 做特征筛选:用
mutualInfo函数计算每个词汇和类别的互信息,只保留互信息高的词汇,减少冗余特征 - 交叉验证:用
crossval做5折交叉验证,能更准确地评估模型的真实泛化能力,而不是只看训练集准确率 - 文本标准化:统一转小写、移除标点符号,减少特征的无效差异
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

