机器学习之用Python从零实现贝叶斯分类器("Python实战:从零开始构建贝叶斯分类器")
原创
一、引言
贝叶斯分类器是一种基于贝叶斯定理的统计分类方法,它广泛应用于文本分类、垃圾邮件过滤、情感分析等领域。本文将详细介绍怎样使用Python从零起始实现一个简洁的贝叶斯分类器。
二、贝叶斯分类器原理
贝叶斯分类器是基于贝叶斯定理的,贝叶斯定理可以即为:
P(A|B) = P(B|A) * P(A) / P(B)
其中,P(A|B) 是在事件B出现的条件下事件A出现的概率,P(B|A) 是在事件A出现的条件下事件B出现的概率,P(A) 和 P(B) 分别是事件A和事件B的先验概率。
三、构建贝叶斯分类器步骤
下面是构建贝叶斯分类器的基本步骤:
- 数据预处理
- 特征提取
- 计算先验概率
- 计算条件概率
- 分类决策
四、数据预处理
数据预处理是构建贝叶斯分类器的第一步,关键包括以下操作:
- 文本清洗:去除无关字符,如标点符号、数字等。
- 分词:将文本划分为单词或词语。
- 停用词过滤:去除常见的无意义词汇,如“的”、“了”等。
五、特征提取
特征提取是将文本数据成为可用于贝叶斯分类器的特征向量。这里我们使用词频作为特征,即统计每个单词在文本中出现的次数。
六、计算先验概率
先验概率是指每个类别的概率,可以通过统计训练集中每个类别的样本数来计算。例如,如果有两个类别 A 和 B,训练集中有100个样本,其中60个属于类别A,40个属于类别B,那么先验概率分别为:
P(A) = 60 / 100 = 0.6
P(B) = 40 / 100 = 0.4
七、计算条件概率
条件概率是指在给定类别下,每个特征的概率。这里我们使用词频作为特征,计算条件概率的公式为:
P(word|class) = (word_count_in_class + 1) / (total_word_count_in_class + vocabulary_size)
其中,word_count_in_class 是在给定类别下单词出现的次数,total_word_count_in_class 是给定类别下所有单词的总数,vocabulary_size 是词汇表的大小。这里使用拉普拉斯平滑来避免概率为零的情况。
八、分类决策
在分类阶段,对于给定的测试样本,我们需要计算它在每个类别下的后验概率,然后选择具有最高后验概率的类别作为预测最终。后验概率的计算公式为:
P(class|test_sample) = P(test_sample|class) * P(class) / P(test_sample)
由于 P(test_sample) 对于所有类别都是相同的,所以我们可以省略它,直接比较 P(test_sample|class) * P(class) 的值。
九、Python实现
下面是使用Python实现贝叶斯分类器的代码示例:
import numpy as np
import re
import jieba
# 数据预处理
def preprocess_text(text):
text = re.sub(r'[^\w\s]', '', text) # 去除标点符号
text = jieba.lcut(text) # 分词
text = [word for word in text if word not in stop_words] # 去除停用词
return text
# 计算先验概率
def calculate_priors(train_labels):
class_counts = np.bincount(train_labels)
priors = class_counts / len(train_labels)
return priors
# 计算条件概率
def calculate_conditional_probabilities(train_data, train_labels, vocabulary):
conditional_probs = np.zeros((len(vocabulary), len(np.unique(train_labels))))
for i, word in enumerate(vocabulary):
word_counts = np.bincount(train_labels, minlength=len(np.unique(train_labels)))[:, None] * train_data[:, i]
conditional_probs[i, :] = word_counts / (word_counts.sum(axis=0) + 1)
return conditional_probs
# 分类决策
def classify(test_sample, priors, conditional_probs, vocabulary):
test_sample = np.array([test_sample.count(word) for word in vocabulary])
posteriors = conditional_probs[test_sample.astype(int), :].prod(axis=0) * priors
return np.argmax(posteriors)
# 主函数
def main():
# 加载数据集
train_data, train_labels, test_data, test_labels = load_dataset()
# 数据预处理
train_data = [preprocess_text(text) for text in train_data]
test_data = [preprocess_text(text) for text in test_data]
# 构建词汇表
vocabulary = set(word for doc in train_data for word in doc)
# 计算先验概率
priors = calculate_priors(train_labels)
# 计算条件概率
conditional_probs = calculate_conditional_probabilities(train_data, train_labels, vocabulary)
# 测试分类器
predictions = [classify(test_doc, priors, conditional_probs, vocabulary) for test_doc in test_data]
accuracy = np.mean(predictions == test_labels)
print(f'Accuracy: {accuracy:.2f}')
if __name__ == '__main__':
main()
十、总结
本文详细介绍了怎样使用Python从零起始构建贝叶斯分类器。贝叶斯分类器是一种简洁有效的统计分类方法,广泛应用于文本分类、垃圾邮件过滤等领域。通过本文的学习,读者可以掌握贝叶斯分类器的基本原理和实现方法。