【机器学习算法基础】(基础机器学习课程)-07-朴素贝叶斯算法-笔记

一、朴素贝叶斯算法原理

       朴素贝叶斯是一种基于统计概率的简单分类算法,用于预测某个数据属于哪个类别。它特别适用于处理文本分类,比如垃圾邮件过滤、情感分析等。

 

 

 

 

 

 

 

 

 

 

 

 

贝叶斯定理

贝叶斯定理是一种用来计算在某些条件下某个事件发生概率的方法。比如,如果你知道一个人喜欢看科幻电影,那么你可以用贝叶斯定理来计算他在某个新上映的科幻电影中的出现概率。

贝叶斯定理公式: 事件A发生的概率=在B的情况下A发生的概率×B发生的概率B的总体发生概率\text{事件A发生的概率} = \frac{\text{在B的情况下A发生的概率} \times \text{B发生的概率}}{\text{B的总体发生概率}}事件A发生的概率=B的总体发生概率在B的情况下A发生的概率×B发生的概率​

朴素贝叶斯的“朴素”假设

“朴素”意思是简单化的假设。在朴素贝叶斯算法中,我们假设所有特征是相互独立的。比如,如果我们在分类电子邮件时,假设单词之间是独立的,这意味着单词“免费”和“大奖”一起出现的概率仅仅是这两个单词分别出现概率的乘积。尽管这种假设在现实中不完全成立,但这样简化计算可以让算法更高效。

朴素贝叶斯分类步骤

  1. 计算类别的先验概率

    • 先看每个类别有多少样本。例如,如果你有100封邮件,其中30封是垃圾邮件,那么垃圾邮件的先验概率就是30/100 = 0.3。
  2. 计算特征在各类别中的条件概率

    • 然后,看每个特征(比如单词)在每个类别中出现的频率。例如,单词“免费”在垃圾邮件中出现的次数除以垃圾邮件的总数。
  3. 应用贝叶斯定理

    • 对于每封新邮件,计算它属于每个类别的概率。假设新邮件中有单词“免费”和“大奖”,那么它是垃圾邮件的概率就是“免费”在垃圾邮件中的概率乘以“大奖”在垃圾邮件中的概率,再乘以垃圾邮件的先验概率。
  4. 选择概率最大的类别

    • 最后,选择概率最大的那个类别作为预测结果。

举个例子

假设你有一些邮件数据,每封邮件要么是“垃圾邮件”,要么是“正常邮件”。我们想用这些数据来训练一个分类器,能自动判断新邮件是否是垃圾邮件。

  1. 训练阶段:

    • 统计垃圾邮件和正常邮件的数量。
    • 统计每个单词在垃圾邮件和正常邮件中出现的次数。
    • 计算垃圾邮件和正常邮件的概率。
    • 计算每个单词在垃圾邮件和正常邮件中出现的概率。
  2. 预测阶段:

    • 新邮件进来了,我们要判断它是不是垃圾邮件。
    • 拿新邮件中的每个单词,计算它在垃圾邮件和正常邮件中的概率。
    • 乘起来,得到新邮件是垃圾邮件和正常邮件的概率。
    • 比较两个概率,哪个大就认为新邮件属于哪个类别。

示例代码

以下是一个简单的代码示例,用来演示如何使用朴素贝叶斯算法进行文本分类:

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.pipeline import make_pipeline

# 训练数据
texts = ["我喜欢编程", "Python 很棒", "我讨厌虫子", "调试很有趣"]
labels = ["积极", "积极", "消极", "积极"]

# 创建朴素贝叶斯分类器
model = make_pipeline(CountVectorizer(), MultinomialNB())

# 训练模型
model.fit(texts, labels)

# 预测新文本
new_text = ["我喜欢调试"]
predicted_label = model.predict(new_text)

print(predicted_label)

这个代码用Python库scikit-learn实现了一个简单的文本分类器。首先将文本转化为词频向量,然后用多项式朴素贝叶斯进行训练和预测。

二、朴素贝叶斯算法对新闻进行分类案例

 

 

 

朴素贝叶斯算法对新闻进行分类案例

为了演示如何使用朴素贝叶斯算法对新闻进行分类,我们将使用Python和scikit-learn库。以下是一个具体的案例,包括数据准备、训练模型和进行分类的步骤。

数据准备

首先,我们需要准备一些新闻数据,并将其分为训练集和测试集。我们可以使用sklearn.datasets中的fetch_20newsgroups数据集,该数据集包含20个不同类别的新闻文章。

导入必要的库

from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.pipeline import make_pipeline
from sklearn.model_selection import train_test_split
from sklearn import metrics

加载数据集

我们将加载新闻数据集,并将其分为训练集和测试集。

# 加载数据集
data = fetch_20newsgroups(subset='all')

# 分割数据集为训练集和测试集
train_data, test_data, train_labels, test_labels = train_test_split(data.data, data.target, test_size=0.2, random_state=42)

创建并训练模型

使用CountVectorizer将文本数据转换为词频向量,然后使用多项式朴素贝叶斯分类器进行训练。

# 创建朴素贝叶斯分类器管道
model = make_pipeline(CountVectorizer(), MultinomialNB())

# 训练模型
model.fit(train_data, train_labels)

预测和评估模型

使用训练好的模型对测试集进行预测,并评估其准确性。

# 预测测试集
predicted_labels = model.predict(test_data)

# 计算准确率
accuracy = metrics.accuracy_score(test_labels, predicted_labels)
print(f"模型的准确率是: {accuracy:.2f}")

# 打印分类报告
print(metrics.classification_report(test_labels, predicted_labels, target_names=data.target_names))

完整代码示例

以下是完整的代码示例,展示了从数据准备到模型训练和评估的全过程。

from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.pipeline import make_pipeline
from sklearn.model_selection import train_test_split
from sklearn import metrics

# 加载数据集
data = fetch_20newsgroups(subset='all')

# 分割数据集为训练集和测试集
train_data, test_data, train_labels, test_labels = train_test_split(data.data, data.target, test_size=0.2, random_state=42)

# 创建朴素贝叶斯分类器管道
model = make_pipeline(CountVectorizer(), MultinomialNB())

# 训练模型
model.fit(train_data, train_labels)

# 预测测试集
predicted_labels = model.predict(test_data)

# 计算准确率
accuracy = metrics.accuracy_score(test_labels, predicted_labels)
print(f"模型的准确率是: {accuracy:.2f}")

# 打印分类报告
print(metrics.classification_report(test_labels, predicted_labels, target_names=data.target_names))

解释

  1. 数据准备:我们使用fetch_20newsgroups数据集,该数据集包含20个不同类别的新闻文章。我们将数据集分为训练集和测试集。

  2. 创建并训练模型:我们使用CountVectorizer将文本数据转换为词频向量,然后使用多项式朴素贝叶斯分类器进行训练。

  3. 预测和评估模型:我们使用训练好的模型对测试集进行预测,并计算模型的准确率。此外,我们还打印了分类报告,以了解模型在不同类别上的表现

三、朴素贝叶斯算法总结

 

 

5. 实际应用示例

以下是一个使用朴素贝叶斯算法对新闻进行分类的实际应用示例:

from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.pipeline import make_pipeline
from sklearn.model_selection import train_test_split
from sklearn import metrics

# 加载数据集
data = fetch_20newsgroups(subset='all')

# 分割数据集为训练集和测试集
train_data, test_data, train_labels, test_labels = train_test_split(data.data, data.target, test_size=0.2, random_state=42)

# 创建朴素贝叶斯分类器管道
model = make_pipeline(CountVectorizer(), MultinomialNB())

# 训练模型
model.fit(train_data, train_labels)

# 预测测试集
predicted_labels = model.predict(test_data)

# 计算准确率
accuracy = metrics.accuracy_score(test_labels, predicted_labels)
print(f"模型的准确率是: {accuracy:.2f}")

# 打印分类报告
print(metrics.classification_report(test_labels, predicted_labels, target_names=data.target_names))

总结

       朴素贝叶斯是一种基于贝叶斯定理的简单、高效的分类算法,尽管其独立假设在现实中不完全成立,但在许多应用中仍然表现良好。它适用于大规模数据集,对计算资源的需求低,是文本分类等领域的一种常用方法。

四、精确率和召回率

 

 

 

 

 

 

 

 

 

 

 

示例代码

下面是一个使用scikit-learn库计算精确率和召回率的示例:

from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.pipeline import make_pipeline
from sklearn.model_selection import train_test_split
from sklearn import metrics

# 加载数据集
data = fetch_20newsgroups(subset='all')

# 分割数据集为训练集和测试集
train_data, test_data, train_labels, test_labels = train_test_split(data.data, data.target, test_size=0.2, random_state=42)

# 创建朴素贝叶斯分类器管道
model = make_pipeline(CountVectorizer(), MultinomialNB())

# 训练模型
model.fit(train_data, train_labels)

# 预测测试集
predicted_labels = model.predict(test_data)

# 计算精确率和召回率
precision = metrics.precision_score(test_labels, predicted_labels, average='weighted')
recall = metrics.recall_score(test_labels, predicted_labels, average='weighted')
f1 = metrics.f1_score(test_labels, predicted_labels, average='weighted')

print(f"精确率: {precision:.2f}")
print(f"召回率: {recall:.2f}")
print(f"F1分数: {f1:.2f}")

# 打印分类报告
print(metrics.classification_report(test_labels, predicted_labels, target_names=data.target_names))

 

总结

  • 精确率:模型预测为正类的样本中,实际为正类的比例。
  • 召回率:实际为正类的样本中,被模型正确预测为正类的比例。
  • F1分数:精确率和召回率的调和平均数,用于平衡这两个指标。

精确率和召回率是评估分类模型的重要指标,它们帮助我们了解模型在不同方面的表现,并在不同应用场景中做出相应的调整。

 五、交叉验证与网格搜索对K-近邻算法调优

 

 

 

 

交叉验证与网格搜索对K-近邻算法调优

在机器学习中,交叉验证和网格搜索是用于优化模型参数的重要工具。对于K-近邻算法(K-Nearest Neighbors, KNN),选择合适的参数(如k值和距离度量)对模型性能至关重要。下面详细介绍如何使用交叉验证和网格搜索对KNN算法进行调优。

1. K-近邻算法简介

KNN是一种简单的非参数分类和回归算法。对于分类任务,KNN根据输入样本的k个最近邻的标签进行投票,选择出现次数最多的标签作为预测结果。对于回归任务,KNN返回最近邻标签的平均值。

2. 交叉验证(Cross-Validation)

交叉验证是一种评估模型性能的方法,通过将数据集分成多个子集来训练和测试模型。最常见的形式是k折交叉验证(k-fold cross-validation),其步骤如下:

  1. 将数据集分成k个相同大小的子集。
  2. 依次将每个子集作为测试集,其余子集作为训练集训练模型。
  3. 计算每次的评估结果,并取k次结果的平均值作为模型性能的评估指标。

3. 网格搜索(Grid Search)

网格搜索是一种超参数优化方法,通过穷举搜索指定参数的所有可能组合来寻找最优参数。结合交叉验证,网格搜索可以评估每组参数组合的性能,并选择表现最佳的一组参数。

4. K-近邻算法的参数调优

对于KNN算法,常见的需要调优的参数包括:

  • n_neighbors:即k值,表示选择最近邻的数量。
  • weights:距离权重,常用值包括uniform(所有邻居均等投票)和distance(距离越近权重越大)。
  • metric:距离度量方法,如euclidean(欧几里得距离)、manhattan(曼哈顿距离)等。

5. 使用交叉验证和网格搜索调优KNN算法

下面是使用scikit-learn库对KNN算法进行参数调优的示例代码:

from sklearn.datasets import load_iris
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import cross_val_score

# 加载数据集
data = load_iris()
X, y = data.data, data.target

# 创建KNN分类器
knn = KNeighborsClassifier()

# 定义参数网格
param_grid = {
    'n_neighbors': [3, 5, 7, 9, 11],
    'weights': ['uniform', 'distance'],
    'metric': ['euclidean', 'manhattan']
}

# 创建网格搜索对象,使用5折交叉验证
grid_search = GridSearchCV(knn, param_grid, cv=5, scoring='accuracy')

# 运行网格搜索
grid_search.fit(X, y)

# 输出最佳参数和最佳得分
print("最佳参数: ", grid_search.best_params_)
print("最佳得分: ", grid_search.best_score_)

# 使用最佳参数进行预测
best_knn = grid_search.best_estimator_
accuracy = cross_val_score(best_knn, X, y, cv=5, scoring='accuracy')
print("交叉验证精度: ", accuracy.mean())

解释

  1. 加载数据集:使用load_iris函数加载鸢尾花数据集。
  2. 创建KNN分类器:实例化一个KNN分类器对象。
  3. 定义参数网格:指定n_neighborsweightsmetric的候选值。
  4. 创建网格搜索对象:使用GridSearchCV进行网格搜索,指定5折交叉验证和评估指标为准确率。
  5. 运行网格搜索:调用fit方法在训练数据上运行网格搜索。
  6. 输出最佳参数和最佳得分:打印网格搜索找到的最佳参数组合和相应的得分。
  7. 使用最佳参数进行预测:利用最佳参数重新训练KNN模型,并使用交叉验证评估模型性能。

总结

通过交叉验证和网格搜索,我们可以有效地调整KNN算法的超参数,找到最优的参数组合以提高模型的性能。这种方法不仅适用于KNN,还可以用于其他机器学习算法的参数调优。通过这种系统化的调优过程,可以确保模型在未知数据上的表现更加稳定和准确。

  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值