朴素贝叶斯分类: 使用案例

1, 全概率公式:

在这里插入图片描述
在这里插入图片描述

2, 贝叶斯公式:

在这里插入图片描述

3,朴素贝叶斯分类器:

定义:

  • 1,设 x= {a1, a2, a3…, am } 为一个待分类项,而每个a为x的一个特征属性。
  • 2,有类别集合:C ={ y1, y2, y3 …, yn }
  • 3,计算一个概率集合U : P(y1|x), P(y2|x), P(y3|x)…P(yn|x)
  • 4,x最可能的类别 <==> 集合U中,概率的取最大值时,是类别集合C中的哪个?

朴素贝叶斯分类器是一个概率分类器。假设现有的类别C={c1,c2,……cm}。给定一篇文档d,文档d最有可能属于哪个类呢?这个问题用数学公式表示如下:

在这里插入图片描述
由于每个概率值很小(比如0.0001)若干个很小的概率值直接相乘,
得到的结果会越来越小。为了避免计算过程出现下溢(underflower),
引入对数函数Log, 最终得到:
在这里插入图片描述

4,实现代码如下:

List<String> reallist=new ArrayList<String>();//真实分类:  体育,娱乐,财经....
List<String> pridlist=new ArrayList<String>();//预测的结果: 体育,财经,娱乐....

for (Entry<String, List<String>> entry : nativeBayes.getFiles_test().entrySet()) {//取出: 待测数据
		String realclassname = entry.getKey();
		List<String> files = entry.getValue();
		
		for (String file : files) {//取出文件遍历: 一一计算它在各模型的分值(最大者最似然)
			reallist.add(realclassname);
			List<String> classnamelist=new ArrayList<String>();//实际的分类:体育,财经,娱乐....
			List<Double> scorelist=new ArrayList<Double>();	   //测后的分值:-208, -691,-703
			
			for (Entry<String, Double> entry_1 : nativeBayes.getClassProb().entrySet()) {
				String classname = entry_1.getKey();	  	
				Double score = Math.log(entry_1.getValue());//先验概率:根据公式,计算分值权重
				String[] words = file.split(" ");

				for (String word : words) {		
					if(nativeBayes.getClassFeaProb().get(classname).containsKey(word)){
						score += Math.log(nativeBayes.getClassFeaProb().get(classname).get(word));
					}else{
						score += Math.log(nativeBayes.getClassDefaultProb().get(classname));
					}
				}

				classnamelist.add(classname);
				scorelist.add(score);

			}//分类模型: 遍历end
			Double maxProb = Collections.max(scorelist);
			int idx = scorelist.indexOf(maxProb);
			pridlist.add(classnamelist.get(idx));
		}
}

5,模型的测评

精确率,准确率,召回率

for (String classname : nativeBayes.getFiles_test().keySet()) {    	
	double correctNum = 0.0;
	double allNum = 0.0;//测试数据中,某个分类的文章总数
	double preNum = 0.0;//测试数据中,预测为该分类的文章总数

	for (int i = 0; i < reallist.size(); i++) {
		if(reallist.get(i) == classname){
			allNum += 1;
			if(reallist.get(i) == pridlist.get(i)){
				correctNum += 1;
			}
		}
		if(pridlist.get(i) == classname){
			preNum += 1;
		}
	}

    System.out.println(classname + " 精确率(跟预测分类比较):" + correctNum / preNum + " 召回率(跟真实分类比较):" + correctNum / allNum);    
}
  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 以下是一个基于Python的朴素贝叶斯分类器实例,用于分类电子邮件是否为垃圾邮件。 ```python import pandas as pd from sklearn.feature_extraction.text import CountVectorizer from sklearn.naive_bayes import MultinomialNB # 加载数据集 data = pd.read_csv('spam.csv', encoding='latin-1') data = data[['v1', 'v2']] data = data.rename(columns={"v1": "label", "v2": "text"}) # 将标签转换为二进制变量 data['label'] = data['label'].map({'ham': 0, 'spam': 1}) # 分割数据集为训练集和测试集 train_data = data[:4400] test_data = data[4400:] # 特征工程 count_vectorizer = CountVectorizer(stop_words='english') train_feature_vectors = count_vectorizer.fit_transform(train_data['text']) test_feature_vectors = count_vectorizer.transform(test_data['text']) # 训练模型 naive_bayes_classifier = MultinomialNB() naive_bayes_classifier.fit(train_feature_vectors, train_data['label']) # 预测测试集 predictions = naive_bayes_classifier.predict(test_feature_vectors) # 测试模型准确度 accuracy = (predictions == test_data['label']).mean() print("准确度:", accuracy) ``` 这个示例中,我们首先加载数据集,将标签转换为二进制变量,并将数据集分成训练集和测试集。然后,我们使用CountVectorizer将文本数据转换为数值特征。接着,我们使用MultinomialNB训练朴素贝叶斯分类器。最后,我们使用训练好的模型预测测试集,并计算模型准确度。 ### 回答2: 朴素贝叶斯分类器是一种基于贝叶斯定理的概率分类方法,在文本分类、垃圾邮件过滤等领域有广泛应用。而Python中有丰富的机器学习库,如scikit-learn,提供了方便的朴素贝叶斯分类器的实现。 下面是一个简单的朴素贝叶斯分类器的Python实例: # 导入所需的库 from sklearn.feature_extraction.text import CountVectorizer from sklearn.naive_bayes import MultinomialNB # 定义训练集和测试集 train_X = ["这个电影太好看了", "这个电影真的很差"] train_y = [1, 0] # 1代表好评,0代表差评 test_X = ["这个电影非常棒"] # 文本特征提取 count_vec = CountVectorizer() train_X_vec = count_vec.fit_transform(train_X) test_X_vec = count_vec.transform(test_X) # 构建并训练朴素贝叶斯分类器 naive_bayes = MultinomialNB() naive_bayes.fit(train_X_vec, train_y) # 对测试集进行预测 test_y = naive_bayes.predict(test_X_vec) # 输出预测结果 print(test_y) 在上述代码中,首先导入了所需的库,包括CountVectorizer用于文本特征提取和MultinomialNB用于朴素贝叶斯分类器的构建。然后定义了训练集train_X和对应的标签train_y,测试集test_X。 接着通过CountVectorizer对文本进行特征提取,将文本转换为向量形式,方便后续的分类器训练和预测。然后使用MultinomialNB构建并训练朴素贝叶斯分类器,使用fit方法将训练集输入模型进行训练。最后,使用predict方法对测试集进行预测,得到预测结果test_y。 以上就是一个简单的朴素贝叶斯分类器的Python实例,该示例展示了如何使用scikit-learn库来实现朴素贝叶斯分类器进行文本分类任务。 ### 回答3: 朴素贝叶斯分类器是一种常用的机器学习算法,通过统计特征出现的概率来进行分类。Python中有许多库可以实现朴素贝叶斯分类器,常见的有scikit-learn和NLTK库。 下面是一个基于scikit-learn库的朴素贝叶斯分类器的示例: 首先,需要导入需要的库: ``` from sklearn.feature_extraction.text import CountVectorizer from sklearn.naive_bayes import MultinomialNB ``` 接下来,准备训练数据和测试数据,通常是一些文本数据和对应的标签。文本数据可以是一篇文章、一封邮件、一段对话等等。标签通常是表示文本所属类别的一个字符串或数字。 然后,需要对文本数据进行特征提取,将文本转化为可以输入模型的向量形式。可以使用CountVectorizer类来实现。 ``` vectorizer = CountVectorizer() X_train = vectorizer.fit_transform(train_data) X_test = vectorizer.transform(test_data) ``` 接下来,初始化一个朴素贝叶斯分类器对象,并使用训练数据对其进行训练。 ``` clf = MultinomialNB() clf.fit(X_train, train_labels) ``` 最后,使用训练好的模型对测试数据进行预测,并输出预测结果。 ``` predicted_labels = clf.predict(X_test) ``` 以上就是一个基于scikit-learn库的朴素贝叶斯分类器的实现示例。通过这个实例,我们可以学会如何使用Python来实现一个简单的朴素贝叶斯分类器,用于文本分类、情感分析等任务。需要注意的是,这个示例只是朴素贝叶斯分类器的一种实现方式,实际应用中可能会有一些调参和预处理的步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

根哥的博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值