Python数据挖掘之基础分类模型_朴素贝叶斯
文章目录
- 基本理论
- 有监督学习概述
- 无监督学习概述
- 小例子
- 分类模型
- 过拟合和欠拟合
- 二分类和多分类
- 线性和非线性分类器
- 朴素贝叶斯
- 基本概念
- 一个例子
- Python 实现
- 案例
基本理论
数据挖掘有两大类典型任务:有监督学习(supervised learning)和无监督学习(unsupervised learning)。
有监督学习概述
有监督学习是指在训练数据集中,每个数据样本都对应一个目标值。根据目标值的类型,任务分为两种主要类型:分类和回归。
分类(Classification):目标值是离散的类别标签,任务目的是根据已知数据预测类别。
回归(Regression):目标值是连续的实数值,任务目的是预测数值型输出。
有监督学习任务分类
任务类型 | 目标值 | 描述 | 示例 |
---|---|---|---|
分类 | 离散类别标签 | 任务是预测一个数据点属于哪个类别 | 如:邮件分类为垃圾邮件或非垃圾邮件 |
回归 | 连续实数值 | 任务是预测一个连续数值 | 如:房价预测,温度预测 |
分类与回归任务的区别
分类任务:输出的目标是离散的类别。例如:判断一个邮件是“垃圾邮件”还是“非垃圾邮件”。
回归任务:输出的目标是一个连续值。例如:预测房价、预测温度等。
小结
有监督学习的核心是通过已知的输入和目标值来训练模型,并使用模型来预测新数据的目标值。
分类任务关注如何将数据分到不同的类别中,而回归任务则关注如何预测连续的数值。
无监督学习(Unsupervised Learning)与有监督学习的区别在于,训练数据集中并不提供目标值。在无监督学习中,模型的目标是从输入数据中发现潜在的结构或模式,而不是预测目标值。主要的无监督学习任务包括聚类和降维。
无监督学习概述
无监督学习:没有目标值,任务是发现数据中的潜在结构或关系。
聚类(Clustering):目标是将数据划分成不同的组或簇,使得同一组中的数据点尽可能相似,而不同组的数据点尽可能不同。常见的聚类算法有K-means、层次聚类等。
降维(Dimensionality Reduction):目标是减少数据的维度,同时尽量保留原始数据中的重要信息。常见的降维方法有主成分分析(PCA)、t-SNE等。
无监督学习任务
任务类型 | 目标 | 描述 | 示例 |
---|---|---|---|
聚类 | 将数据分成不同的簇 | 根据数据的相似性将数据分组,找到潜在的类或群体。 | 如:客户群体划分,图像分割 |
降维 | 减少数据的维度 | 保留数据的核心特征,去除冗余或不相关的信息。 | 如:PCA降维,数据可视化,特征选择 |
聚类与降维的区别
聚类:是一种探索数据自然分组的方式,没有事先标签。算法根据相似性将数据点分组,发现潜在的类别。
降维:减少数据的特征数目,使得数据更加简洁且易于处理,同时保留尽可能多的信息,主要用于数据可视化和提高计算效率。
小结
无监督学习更关注于发现数据本身的结构或关系,而不依赖于外部的标签信息。
聚类和降维是最常见的无监督学习任务,它们在很多应用场景中都有广泛的使用。
小例子
某咖啡品牌厂商需要分析市场调查数据,以判断新研发的一款新品是否被会被市场接收。随机调查了300人,获得了他们的年龄、职业、教育状况、以及他们对咖啡的喜好情况(“喜欢”或“不喜欢”);如果在这些数据上建立数据挖掘模型,用于预测其它人对咖啡新品的态度,这个模型就是一个典型的分类模型。
分类模型
分类在有监督学习中的核心概念与流程解析
背景与基本思想
在实际的机器学习应用场景中,我们常常面临这样的问题:有一组已经标注类别(标签)信息的样本数据。通过对这些数据的学习,我们希望能让模型学会从特征出发,正确判断新数据对象的所属类别。这种任务属于有监督学习中的一种——分类问题。
分类的核心目标是:建立一个映射函数(模型或分类器),它能依据数据的特征变量(X)准确预测出对应的类别标签(y)。
分类任务的两个主要步骤
为了实现这一目标,分类过程通常被拆解为两个阶段,每个阶段承担不同的责任和任务。具体而言:
阶段 | 目的 | 主要任务 | 输出结果 |
---|---|---|---|
1. 模型训练阶段 | 让模型学习特征和类别之间的关系 | 使用训练集数据,根据某一算法拟合映射函数(即“学习”) | 构建一个“分类模型”或“分类器” |
2. 模型预测阶段 | 使用已学得的模型对新数据进行判断 | 将新数据(未知类别)输入训练好的模型,输出预测类别 | 预测结果(类别标签) |
详细解析
- 模型训练阶段(“学习”)
数据准备:从原始数据中得到一组样本,每个样本由一组特征(X)和已知类别(y)组成。
目标:利用这些样本,找到一个函数或模型,使得给定一个特征向量X,可以输出对应正确的类别标签y。
方法:采用各种算法(如决策树、支持向量机、神经网络、随机森林、朴素贝叶斯等)对训练数据进行拟合,优化参数,使得模型在训练集上表现良好。
模型的性质:这个模型可以理解为一个“映射函数”f:X → y,也可以用直观比喻:它像一个“识别符”或“判别器”,能在数据空间中划出不同类别的边界。
- 模型预测阶段(“应用”)
新数据到来:在实际应用中,我们常会遇到新的数据对象X’,它的类别未知。
预测过程:将X’输入到已学好的模型f中,经计算后得出一个类别标签y’。
意义:这一步实际上实现了从“观察”到“判断”的转换,帮助决策和执行,比如识别图片中的物体、判断是否为垃圾邮件等。
更深层次的理解与联结
这两个步骤体现了**“学习-应用”**的经典范式,是人工智能的底层逻辑之一。它们的成功依赖于以下关键因素:
模型的泛化能力:模型应在未见过的样本上也表现良好,不仅仅在训练集上“记忆”得很好(避免过拟合)。
数据的代表性:训练数据必须覆盖目标应用场景中的多样性,才能确保模型学到的映射函数具有良好的迁移能力。
特征设计:特征变量X的选择和预处理极其重要,好的特征能显著提升模型性能。
本质洞察
从更深的角度来看,分类问题根本上是模式识别与抽象的过程。模型的学习就是在高维空间中找寻一个合理的“决策边界”,将不同类别的样本在空间中划分开来。而这个“决策边界”的构建,实际上是对数据内部结构和规律的抽象与压缩。“模型预测”则是对这些抽象的应用,相当于“用语言描述未来的观察对象”。
在不断的学习和应用中,模型的的确确在模拟人类的决策过程(当然,直觉和经验常常起决定作用)——自动化、标准化、可扩展的决策流程。
明确两个阶段的责任:模型训练是“学会”,模型预测是“用会”;二者相辅相成,缺一不可。
数据至关重要:优质、丰富的训练数据是模型品质的基石。
特征工程:选择与优化特征是提升分类效果的关键环节。
模型选择:依据问题特性(类别数、数据规模、复杂度)合理选用算法。
评估指标:正确使用准确率、召回率、F1值等指标,全面检验模型性能。
实践中不断优化:通过交叉验证、调参、集成等技术不断提升模型效果。
过拟合和欠拟合
一、背景与基本概念
在监督学习中,核心任务是学习一种映射关系:从输入数据对象的特征(X)到目标值(y)的映射。这个映射实际上代表了数据对象与其类别(分类问题)或连续值(回归问题)之间的潜在函数关系。模型的目标不仅是能在已知的训练数据上表现良好,更重要的是能在未见过的测试数据上保持良好的预测性能,这体现了模型的“泛化能力”。
二、模型拟合的定义与核心指标
核心概念 | 定义 | 目的 | 图示比喻 |
---|---|---|---|
拟合(Fitting) | 模型在训练集上成功捕捉到数据的潜在关系,使得预测值与真实值尽可能接近 | 反映模型对训练数据的学习程度 | 如同用一条曲线尽可能贴合一组散点,确保线与点之间的距离尽可能小 |
良好的拟合能力 | 指模型在捕获训练数据趋势的同时,也能在测试数据中表现出相似的精度 | 提升模型的泛化能力 | 比喻:像一把刀,不仅能切开训练材料,还能应对未见的材料 |
三、从表面现象到深层原理的分析
- 表面现象
训练集上的表现:预测值与真实值高度吻合,误差极小。
测试集上的表现:预测值与真实值差异也很小,表明模型具有良好的泛化能力。
- 关键问题
为什么模型会在训练集表现良好?因为它捕捉了数据的潜在关系。
在测试集上的表现是否一样?这才体现了模型在新、未知数据上的预测能力。
- 深层原理
潜在函数(f):数据(𝑋,𝑦)本质上由某个隐含的、可能复杂的函数关系生成。
模型的学习:目标是找到一个近似这个潜在函数的模型。
“拟合”能力的表现:模型在训练数据上可以非常精确地描述这个函数,从而在测试数据上也能较好地还原潜在关系。
四、模型拟合的两面性
良好拟合 | 过度拟合 |
---|---|
模型捕获了数据的真实潜在关系 | 模型不仅捕获了关系,还“记忆”了噪声和异常数据 |
在新数据上表现稳定 | 在新数据上表现不佳(由于偏向训练数据中的偶然特性) |
五、拟合能力的深层本质
数据复杂性:越复杂的关系越需要强大而灵活的模型(如深度神经网络),而并非越复杂越好。
偏差-方差权衡:优秀的拟合能力意味着在偏差(模型简化程度)和方差(模型对训练数据敏感)之间寻找平衡。
模型容量:模型容量越大,其拟合能力越强,但也更易过拟合,不可盲目追求容纳一切而忽视泛化。
关键词 | 说明 |
---|---|
拟合(Fitting) | 模型在训练数据上的学习效果,反映其捕获潜在关系的能力 |
泛化能力 | 模型在新数据上的表现能力,关键于创新与适应性 |
过拟合 | 模型在训练集表现好,却在测试集差强人意的情况 |
欲求平衡 | 既要充分学习训练数据,又要避免学习噪声,实现良好的泛化能力 |
数据挖掘模型在测试数据上表现的预测能力称为“泛化(generalization)”能力。
过拟合和欠拟合的模型都有比较差的泛化能力。
增加模型的复杂度可以增加模型的拟合能力,但如果训练数据集规模不够大,就会带来过拟合的风险。当训练数据集比较大时,模型过拟合的风险相对越小,因而模型的泛化能力比较高。这也是我们需要足够数量的数据集来训练模型的原因。
二分类和多分类
二分类(binary classification)是指分类器可以分配一个数据对象两种类别标签中的一种,例如,0和1。前面讨论的饮料市场分析问题是二分类问题,类别标签只有“喜欢”和“不喜欢”两种。
如果分类器可以分配数据对象多种类别标签中的一种,则是一个多分类(multi-class classification)问题。例如,鸢尾花数据集,它包括三种类型的花。二分类和多分类都是类别互斥的分类问题,也即,每个数据对象只能属于一个类别。
如果分类器可以分配数据对象的类别标签为零个、一种或者超过一种,则是一个多标签分类(multi-label classification)问题。多标签分类因为允许一个数据对象同时从属于多个类别,它们是非类别互斥的分类问题。例如,在新闻文档分类任务中,一条关于军人体育比赛的新闻,可以同时属于体育类和军事类
线性和非线性分类器
线性分类器:决策面是一个超平面。即决策函数可以用线性方程表示,划分出的区域是线性的。
非线性分类器:决策面是一个超曲面,或者是多个超平面的组合。即决策函数是非线性的,可能采用多项式、核方法等方式将数据映射到更高维度,使得原本线性不可分的数据变得可分。
总体来说,线性分类器的决策边界是一个简单的平面,而非线性分类器的决策边界则更加复杂,可能有多个弯曲或分段的区域。
朴素贝叶斯
基本概念
- 基本概念
朴素贝叶斯分类器是一种基于概率的分类方法,它的核心思想是利用“贝叶斯定理”来判断一个数据属于哪个类别。简单来说,就是通过计算数据属于每个类别的概率,选择概率最高的那个类别作为预测结果。
- 朴素的假设
朴素贝叶斯的一个关键假设是**“特征之间互不影响”**,就是说它假设给定一个类别之后,数据的不同特征(比如身高、体重、年龄等)是相互独立的。虽然实际情况并非如此,但这个假设使得计算变得非常简单,能够快速给出结果。
举个例子:假设我们想判断一个电子邮件是不是垃圾邮件,朴素贝叶斯会认为每个单词(“免费”、“中奖”等)在邮件中是否出现是相互独立的,而不是一起影响邮件是否是垃圾邮件。
- 如何进行分类?
计算概率:给定一个待分类的数据(比如一封邮件),我们计算它属于每个类别(如垃圾邮件或正常邮件)的概率。
选择最高概率的类别:我们选择那个概率最大的类别,作为最终的预测结果。
具体来说:
先计算每个类别(垃圾邮件、正常邮件等)的先验概率,也就是该类别在数据集中出现的频率。
然后,计算在每个类别下,每个特征(比如邮件里的每个单词)出现的条件概率。
最后,通过贝叶斯定理把这些概率结合起来,得出最终的预测结果。
- 训练模型
为了让朴素贝叶斯分类器做出准确的预测,我们需要给它一些历史数据(比如已经标注好是垃圾邮件还是正常邮件的邮件),让它计算出每个类别的概率。这个过程叫做“训练”模型。
- 优点
速度快:朴素贝叶斯分类器计算非常简单,速度非常快。
效果不错:尽管它的假设比较简单,但在很多实际问题中,它的预测效果其实挺好的。
适合文本分类:在像垃圾邮件、新闻分类这种任务中,朴素贝叶斯非常常用,甚至常常作为基准模型来和其他更复杂的模型进行比较。
- 缺点
假设过于简单:朴素贝叶斯假设特征之间完全独立,现实中这种情况很少见,可能会影响模型准确度。
零概率问题:如果某个类别下的某个特征在训练数据中从来没有出现过,模型可能会给出零概率,这样就无法预测了。为了解决这个问题,可以使用一种叫拉普拉斯平滑的小技巧来避免零概率。
- 应用场景
垃圾邮件检测:根据邮件内容判断邮件是否是垃圾邮件。
情感分析:分析一段文字的情感是正面还是负面,比如分析用户评论。
推荐系统:根据用户过去的行为预测用户可能感兴趣的商品。
- 总结
朴素贝叶斯分类器是一种简单但有效的分类工具,它通过计算不同类别的概率来进行预测。尽管它假设特征之间是独立的,但在很多实际应用中,尤其是文本分类中,它能提供一个很好的基准效果。它的优点是速度快、实现简单,但也有一些假设上的局限性。
朴素贝叶斯分类器的核心公式就是通过贝叶斯定理计算类别的后验概率,在特征独立的假设下,分类过程变得非常简化。我们通过计算每个类别的条件概率并乘积后,选择概率最大的类别作为预测结果。尽管它假设特征之间独立,但在许多实际应用中,朴素贝叶斯仍然表现得很好,尤其是在文本分类任务中。
一个例子
Python 实现
朴素贝叶斯算法简介
Scikit-learn 提供了几种不同的朴素贝叶斯算法,其中最常用的是:
高斯朴素贝叶斯(Gaussian Naïve Bayes):适用于特征是连续型数据(例如浮动的数值)。
多项式朴素贝叶斯(Multinomial Naïve Bayes):适用于特征是分类数据(如词频、事件计数等)。
接下来,我们将详细介绍这两种朴素贝叶斯算法的参数、使用方法,并通过案例演示如何使用它们。
- 高斯朴素贝叶斯(Gaussian Naïve Bayes)
适用场景:
高斯朴素贝叶斯主要用于特征为连续数值的数据集,假设每个特征在各类别中服从高斯分布(正态分布)。
主要参数:
priors:数组,大小为 [n_classes],可选。指定每个类别的先验概率。如果未提供,算法将从训练数据中估计。
var_smoothing:浮动值,默认值 1e-9。避免在计算标准差时出现除零错误。此值在计算条件概率时用于平滑处理。
使用方法:
from sklearn.naive_bayes import GaussianNB
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import numpy as np# 示例数据
X = np.array([[1.2, 3.5], [2.8, 4.1], [1.1, 3.3], [2.7, 3.9], [1.3, 3.7], [2.9, 4.2]])
y = np.array(['A', 'B', 'A', 'B', 'A', 'B'])# 拆分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)# 创建并训练模型
gnb = GaussianNB()
gnb.fit(X_train, y_train)# 预测
y_pred = gnb.predict(X_test)# 评估准确率
print(f"预测结果: {y_pred}")
print(f"准确率: {accuracy_score(y_test, y_pred)}")代码解释:数据集:X 是特征数据,y 是目标标签。训练:使用 fit() 方法来训练模型。预测:使用 predict() 方法对测试数据进行预测。评估:使用 accuracy_score() 来计算准确率。
- 多项式朴素贝叶斯(Multinomial Naïve Bayes)
适用场景:
多项式朴素贝叶斯主要用于特征是离散计数的情况,特别适合文本分类任务(如垃圾邮件分类),因为文本数据通常通过词频或单词出现次数来表示。
主要参数:
alpha:平滑参数,默认值 1.0。为了避免出现零概率的情况,alpha 是平滑常数,它控制了概率的平滑程度。alpha=1.0 是拉普拉斯平滑(Laplace smoothing),alpha=0 会使得没有出现过的特征的概率为零。
fit_prior:布尔值,默认值 True。如果为 True,则计算每个类别的先验概率;如果为 False,则不使用先验概率,所有类别的先验概率设为相同。
class_prior:数组,大小为 [n_classes],可选。如果 fit_prior=True,则此参数忽略;如果为 False,则用指定的类别先验概率。
使用方法:
from sklearn.naive_bayes import MultinomialNB
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import numpy as np# 示例数据(文本特征转化为词频)
X = np.array([[2, 0, 1, 1], [0, 2, 1, 0], [1, 0, 0, 2], [0, 2, 1, 0]])
y = np.array(['Spam', 'Ham', 'Spam', 'Ham'])# 拆分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)# 创建并训练模型
mnb = MultinomialNB(alpha=1.0, fit_prior=True)
mnb.fit(X_train, y_train)# 预测
y_pred = mnb.predict(X_test)# 评估准确率
print(f"预测结果: {y_pred}")
print(f"准确率: {accuracy_score(y_test, y_pred)}")
代码解释:数据集:X 是通过词频特征表示的文本数据,y 是目标标签(垃圾邮件或正常邮件)。训练:使用 fit() 方法来训练多项式朴素贝叶斯模型。预测:使用 predict() 方法对测试数据进行预测。评估:使用 accuracy_score() 来计算预测准确率。参数总结
参数名称 | 高斯朴素贝叶斯 (GaussianNB) | 多项式朴素贝叶斯 (MultinomialNB) |
---|---|---|
alpha | 无 | 平滑参数,防止零概率 |
priors | 类别的先验概率(可选) | 类别的先验概率(可选) |
var_smoothing | 标准差平滑参数,防止除零错误 | 无 |
fit_prior | 是否根据训练数据估计每个类别的先验概率 | 是否计算每个类别的先验概率 |
class_prior | 类别的先验概率(可选) | 类别的先验概率(可选) |
案例
案例 1:使用鸢尾花数据集(Iris dataset)进行高斯朴素贝叶斯分类
数据集介绍:
鸢尾花数据集是一个经典的机器学习数据集,包含 150 条记录,每条记录有 4 个特征(sepal length, sepal width, petal length, petal width),并且每条记录的类别为鸢尾花的三种不同种类:setosa, versicolor, virginica。
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import accuracy_score# 加载鸢尾花数据集
iris = load_iris()
X = iris.data # 特征
y = iris.target # 标签# 拆分数据集为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)# 创建高斯朴素贝叶斯分类器
gnb = GaussianNB()# 训练模型
gnb.fit(X_train, y_train)# 预测测试集
y_pred = gnb.predict(X_test)# 输出预测结果和准确率
print(f"预测结果: {y_pred}")
print(f"准确率: {accuracy_score(y_test, y_pred)}")
案例 2:使用20类新闻组数据集(20 Newsgroups dataset)进行多项式朴素贝叶斯分类
数据集介绍:
20 Newsgroups 数据集包含 20 个不同新闻组的文本数据,每条文本都属于其中一个新闻组。这个数据集常用于文本分类任务。每条新闻文本的特征是词频或词袋模型。
多项式朴素贝叶斯应用
from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import accuracy_score# 加载20类新闻组数据集
newsgroups = fetch_20newsgroups(subset='all')# 获取文本和标签
X = newsgroups.data # 新闻组文本
y = newsgroups.target # 类别标签# 将文本数据转换为词频特征
vectorizer = CountVectorizer(stop_words='english')
X_vec = vectorizer.fit_transform(X)# 拆分数据集为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X_vec, y, test_size=0.3, random_state=42)# 创建多项式朴素贝叶斯分类器
mnb = MultinomialNB()# 训练模型
mnb.fit(X_train, y_train)# 预测测试集
y_pred = mnb.predict(X_test)# 输出预测结果和准确率
print(f"预测结果: {y_pred[:10]}") # 显示前10个预测结果
print(f"准确率: {accuracy_score(y_test, y_pred)}")解释:数据集:我们使用 Scikit-learn 提供的 fetch_20newsgroups() 数据集,并且仅选取了所有新闻组数据(subset='all')。特征提取:使用 CountVectorizer 将新闻文本转换为词频特征。模型训练:使用多项式朴素贝叶斯(MultinomialNB)进行训练,这对于文本数据特别有效。评估:输出前 10 个预测结果和准确率来评估模型的性能