京公网安备 11010802034615号
经营许可证编号:京B2-20210330
朴素贝叶斯模型
朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法。对于给定的训练数据集,首先基于特征条件独立假设学习输入/输出的联合概率分布;然后基于此模型,对给定的输入x,利用贝叶斯定理求出后验概率最大的输出y。至于朴素贝叶斯模型的原理部分,这里就不讲啦,有疑惑的朋友,我推荐看李航的《统计学习方法》中的第四章。我在这里主要谈论的是基于Java版的spark贝叶斯模型。
应用场景
相对于LR,SVM这类二元分类模型,贝叶斯模型在多元分类模型中显得更有优势的。举一个场景,我们希望能通过用户搜索的关键词来判断用户的兴趣爱好。例如用户搜索的关键词是“萌宠 猫狗”,我们通过贝叶斯模型分析出用户原来对动物是感兴趣的。
实现的过程
1.确定分类类别与训练样本及其特征
假设确定有以下的类别以及部分的特征词:
健康养生:健康养生/预防疾病/健康养生专家/膳食营养/休闲养生/健康资讯/休闲与养生
军事历史:军事历史/武器/坦克/军委主席/人类精神文明/特务/突击队/八路军/四代机/
电影:电影/电影资料库/爱情片/鹰眼/刘亦菲/葛优/动作/影片推荐/惊悚/日韩电影/港台电影/
教育:教育/英语教师/华图教育/作文/公务员培训/211/挂科/雅思/地理/申论/高校广播/
旅游:旅游/旅行游记/游记/观光/爸妈游/旅行爱好者/旅行是找寻自我/国内游/
音乐:/Kugou/钢琴/音樂/网络流行/古筝/Urban/音乐人/翻唱/酷狗/虾米音乐/
摄影:摄影/时尚摄影/时装摄影/Photography/摄影师/专题摄影/摄影/相册/相机/索尼/尼康
萌宠:萌宠/萌宠物/可爱宠物/宠物用品/猫猫狗狗宠物控/猫控/食肉动物/猫咪/喵星人/宠物用品商城/
实际中的项目有25个类别,我将其置于不同的文件中,每个类别大概有500个特征词

2.获取标签特征词
List<String> vocabulary = new ArrayList<String>();
File dir = new File("/home/quincy1994/文档/微脉圈/tags/类别库");
File[] files = dir.listFiles(); //获取不同类别的标签文件
StringBuilder sb = new StringBuilder();
for(File file : files){
BufferedReader br = new BufferedReader(new FileReader(file));
String line = null;
while((line = br.readLine()) != null){
sb.append(line + "`"); //按“`"分割不同类别的标签
}
}
String[] tags = sb.toString().trim().split("`");
List<String> newTags = new ArrayList<String>();
for(String tag: tags){
if(tag.length() > 4){
newTags.add(tag); //去除空行标签
}
}
Object[] newtags = newTags.toArray();
List<Tuple2<Integer, String>> list = new ArrayList<Tuple2<Integer,String>>(); //记录每类中的标签
for(int i=0; i<newtags.length;i++){
Tuple2 <Integer, String> classWithTags = new Tuple2<Integer, String>(i, (String)newtags[i]);
System.out.println(classWithTags);
list.add(classWithTags);
String[] tokens = ((String)newtags[i]).split("/");
for(String tag: tokens){
vocabulary.add(tag);
}
}
3.获取训练样本
在获得训练样本的过程中,由于特征维度是上万维。如果为每个样本都申请上万维的向量空间,会导致jvm内存不足。为了解决这样的问题。我将训练样本转变为libsvm文件,而mllib支持libsvm文件的操作。libsvm格式文件为:【label】(空格)【index1】:【value1】(空格)【index2】:【value2】…..
其中【label】是训练数据集的目标值,对于分类,它是标识某类的整数(支持多个类);对于回归,是任意的实数。【index】是以1开始的整数,可以是不连续的;【value】为实数,也就是我们常说的自变量。检验数据文件中的label只用于计算准确度或误差,如果它是未知的,只需用一个数填写这一栏,也可以空看不填。具体的样例如下:
+1 1:0.7 2:1 3:1 4:-0.32
-1 1:0.58 2:-1 3:0.33 4:-0.6
//获取训练样本
JavaPairRDD<Integer, String> trainRDD = sc.parallelizePairs(list); //将每类的标签词转化为RDD
JavaPairRDD<Integer, String> trainSetRDD = trainRDD.mapValues(new ToTrainSet(vocabulary)); //将标签词转化为向量模型
List<Tuple2<Integer, String>> trainSet = trainSetRDD.collect();
writeTrainSet(trainSet); //写成libsvm文件格式,以方便训练
System.out.println("trainset is ok");
static class ToTrainSet implements Function<String, String>{
List<String> vocabulary = null; //标签特征库
public ToTrainSet(List<String> vocabulary){
this.vocabulary = vocabulary;
}
public String call(String sentence) throws Exception {
// TODO Auto-generated method stub
int length = vocabulary.size(); //特征维度
String[] tags = sentence.split("/");
List<Integer> tagsindex = new ArrayList<Integer>();
for(int i =0; i<tags.length; i++){
tagsindex.add(vocabulary.indexOf(tags[i]));
}
String vector = ""; //将特征向量转变为String类,节省空间
for(int i = 0 ; i < length; i++){
if(tagsindex.contains(i)){
vector += String.valueOf(1) + " ";
}
else{
vector += String.valueOf(0) + " ";
}
}
return vector.trim();
}
}
public static void writeTrainSet( List<Tuple2<Integer, String>> list) throws Exception{
File file = new File("./trainset");
PrintWriter pr = new PrintWriter(new FileWriter(file));
for(Tuple2<Integer, String> one : list){ //将每个训练样本以libsvm格式保存到trainset文件当中
String label = String.valueOf(one._1); //训练样本的类别属性
String vector = one._2(); //训练样本的向量模型
String[] indexes = vector.split(" ");
pr.print(label + " ");
String value = "";
for(int i = 0; i<indexes.length;i++){
value += (i+1) + ":" + indexes[i] + " "; // i+1是因为libsvm文件的index是从1开始
}
pr.print(value.trim());
pr.println();
}
pr.close();
}
4.读取训练集并训练模型
String path = "./trainset";
JavaRDD<LabeledPoint> trainData = MLUtils.loadLibSVMFile(sc.sc(), path).toJavaRDD();
model = NaiveBayes.train(trainData.rdd(), 1.0);
// model.save(sc.sc(), "./model");
System.out.println("model is ok");
5.预测新的测试集
String testStr = "萌宠 猫狗 ";
double[] testArray = sentenceToArrays(vocabulary, testStr);
writeTestSet(testArray);
String testPath = "./testset";
JavaRDD<LabeledPoint> testData = MLUtils.loadLibSVMFile(sc.sc(), testPath).toJavaRDD();
public static void writeTestSet(double[] testArray) throws Exception {
//和writeTrainSet一样
File file = new File("./testset");
PrintWriter pr = new PrintWriter(new FileWriter(file));
pr.print("0" + " ");
String value = "";
for(int i=0; i<testArray.length; i++){
value += (i+1) + ":" + testArray[i] + " ";
}
pr.print(value.trim());
pr.close();
}
6.多元分类预测
JavaRDD<double[]> resultData = testData.map(new GetProbabilities());
List<double[]> result = resultData.collect(); //保存的是每个测试样本所属于不同类别的概率值
for(double[] one: result){
for(int i=0;i<one.length;i++){
System.out.println("class "+ i + ":" + one[i]);
}
}
最终的结果如下:
class 0:0.032182006265154946
class 1:0.0336352243495811
class 2:0.03491449856708539
class 3:0.033205199987016924
class 4:0.034989082254391006
class 5:0.0331936923801072
class 6:0.03519542406951625
class 7:0.14276183106876328(萌宠类最高)
class 8:0.035138968378985495
class 9:0.0320506177571864
class 10:0.034970413943529836
class 11:0.033309038283581525
class 12:0.033930527800123976
class 13:0.03278336996884944
class 14:0.035473397978207644
class 15:0.034846339484132204
class 16:0.0355179245862518
class 17:0.03428401522003527
class 18:0.03556253508239065
class 19:0.03555615701038051
class 20:0.03377058314903299
class 21:0.035026463749860785
class 22:0.03428401522003527
class 23:0.03418761030403304
class 24:0.03456346204880003
class 25:0.0346676010929670
数据分析咨询请扫描二维码
若不方便扫码,搜微信号:CDAshujufenxi
尊敬的考生: 您好! 我们诚挚通知您,CDA Level III 考试大纲将于 2025 年 12 月 31 日实施重大更新,并正式启用,2026年3月考 ...
2025-12-31“字如其人”的传统认知,让不少“手残党”在需要签名的场景中倍感尴尬——商务签约时的签名歪歪扭扭,朋友聚会的签名墙不敢落笔 ...
2025-12-31在多元统计分析的因子分析中,“得分系数”是连接原始观测指标与潜在因子的关键纽带,其核心作用是将多个相关性较高的原始指标, ...
2025-12-31对CDA(Certified Data Analyst)数据分析师而言,高质量的数据是开展后续分析、挖掘业务价值的基础,而数据采集作为数据链路的 ...
2025-12-31在中介效应分析(或路径分析)中,间接效应是衡量“自变量通过中介变量影响因变量”这一间接路径强度与方向的核心指标。不同于直 ...
2025-12-30数据透视表是数据分析中高效汇总、多维度分析数据的核心工具,能快速将杂乱数据转化为结构化的汇总报表。在实际分析场景中,我们 ...
2025-12-30在金融投资、商业运营、用户增长等数据密集型领域,量化策略凭借“数据驱动、逻辑可验证、执行标准化”的优势,成为企业提升决策 ...
2025-12-30CDA(Certified Data Analyst),是在数字经济大背景和人工智能时代趋势下,源自中国,走向世界,面向全行业的专业技能认证,旨 ...
2025-12-29在数据分析领域,周期性是时间序列数据的重要特征之一——它指数据在一定时间间隔内重复出现的规律,广泛存在于经济、金融、气象 ...
2025-12-29数据分析师的核心价值在于将海量数据转化为可落地的商业洞察,而高效的工具则是实现这一价值的关键载体。从数据采集、清洗整理, ...
2025-12-29在金融、零售、互联网等数据密集型行业,量化策略已成为企业提升决策效率、挖掘商业价值的核心工具。CDA(Certified Data Analys ...
2025-12-29CDA中国官网是全国统一的数据分析师认证报名网站,由认证考试委员会与持证人会员、企业会员以及行业知名第三方机构共同合作,致 ...
2025-12-26在数字化转型浪潮下,审计行业正经历从“传统手工审计”向“大数据智能审计”的深刻变革。教育部发布的《大数据与审计专业教学标 ...
2025-12-26统计学作为数学的重要分支,是连接数据与决策的桥梁。随着数据规模的爆炸式增长和复杂问题的涌现,传统统计方法已难以应对高维、 ...
2025-12-26数字化浪潮席卷全球,数据已成为企业核心生产要素,“用数据说话、用数据决策”成为企业生存与发展的核心逻辑。在这一背景下,CD ...
2025-12-26箱线图(Box Plot)作为数据分布可视化的核心工具,凭借简洁的结构直观呈现数据的中位数、四分位数、异常值等关键信息,广泛应用 ...
2025-12-25在数据驱动决策的时代,基于历史数据进行精准预测已成为企业核心需求——无论是预测未来销售额、客户流失概率,还是产品需求趋势 ...
2025-12-25在数据驱动业务的实践中,CDA(Certified Data Analyst)数据分析师的核心工作,本质上是通过“指标”这一数据语言,解读业务现 ...
2025-12-25在金融行业的数字化转型进程中,SQL作为数据处理与分析的核心工具,贯穿于零售银行、证券交易、保险理赔、支付结算等全业务链条 ...
2025-12-24在数据分析领域,假设检验是验证“数据差异是否显著”的核心工具,而独立样本t检验与卡方检验则是其中最常用的两种方法。很多初 ...
2025-12-24