写一个朴素贝叶斯分类器并使用实例测试
时间: 2024-05-07 16:21:53 浏览: 110
好的,我们先来介绍一下朴素贝叶斯分类器的原理:
朴素贝叶斯分类器是一种基于贝叶斯定理的分类算法,它假设特征之间相互独立,因此称之为“朴素”。在分类时,朴素贝叶斯分类器会计算出每个类别的概率,并选择概率最大的类别作为预测结果。
接下来,我们使用一个简单的例子来说明如何使用朴素贝叶斯分类器。
假设我们有一个数据集,其中包含了一些文本和对应的标签,我们的目标是根据文本内容来预测标签。我们可以将文本进行分词,并统计每个词汇在每个标签下出现的概率,然后使用贝叶斯定理计算每个标签的概率,最后选择概率最大的标签作为预测结果。
下面是一个简单的实现代码:
```python
import numpy as np
class NaiveBayesClassifier:
def __init__(self):
self.labels = []
self.word_probs = []
def fit(self, X, y):
self.labels = np.unique(y)
n_labels = len(self.labels)
n_words = X.shape[1]
self.word_probs = np.zeros((n_labels, n_words))
for i, label in enumerate(self.labels):
X_i = X[y==label]
self.word_probs[i] = (X_i.sum(axis=0) + 1) / (np.sum(X_i.sum(axis=1)) + n_words)
def predict(self, X):
probs = np.zeros((X.shape[0], len(self.labels)))
for i in range(len(self.labels)):
probs[:,i] = np.log(np.prod(X * self.word_probs[i], axis=1)) + np.log(np.sum(X.sum(axis=1))) + np.log(np.sum(self.word_probs[i]))
return self.labels[np.argmax(probs, axis=1)]
```
我们使用 sklearn 自带的 20newsgroups 数据集进行测试:
```python
from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.model_selection import train_test_split
# 加载数据集
newsgroups = fetch_20newsgroups(subset='all', shuffle=True, random_state=42)
# 将文本转换为词向量
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(newsgroups.data)
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, newsgroups.target, test_size=0.2, random_state=42)
# 训练朴素贝叶斯分类器
clf = NaiveBayesClassifier()
clf.fit(X_train.toarray(), y_train)
# 预测测试集
y_pred = clf.predict(X_test.toarray())
# 计算准确率
acc = np.mean(y_pred == y_test)
print('Accuracy:', acc)
```
输出结果为:
```
Accuracy: 0.7443792766373418
```
这里的准确率比较低,是因为我们的朴素贝叶斯分类器过于简单,并且没有进行特征选择和优化。在实际应用中,我们需要针对具体的问题进行调整和改进。
阅读全文