1 朴素贝叶斯(Naive Bayes)
朴素贝叶斯(Naive Bayes)是一种基于贝叶斯定理与特征条件独立假设的分类方法。它是一种简单但非常有效的分类算法,尤其适合用于文本分类等特征维度较高、且各特征之间相关性较小的场景。
1.1 朴素贝叶斯的基本思想
朴素贝叶斯算法基于一个假设:给定类别下,特征之间是相互独立的。计算每个类别在训练样本中的出现频率及每个特征属性划分对每个类别的条件概率估计。这个假设在现实中往往不成立,但在很多情况下,朴素贝叶斯仍然可以工作得很好,尤其是在特征维度非常高的情况下,其效果尤为显著。
1.2 朴素贝叶斯算法步骤
- 准备阶段:确定特征属性,并对每个特征属性进行适当划分,然后由人工对一部分待分类项进行分类,形成训练样本集合。
- 计算阶段:计算每个类别在训练样本中的出现频率及每个特征属性划分对每个类别的条件概率估计。
- 应用阶段:使用分类器进行分类。对于给定的待分类项,计算在该项出现的条件下各个类别的出现概率,哪个概率大,就认为待分类项属于哪个类别。
1.3 贝叶斯定理
在概率论中,贝叶斯定理(也称为贝叶斯规则或贝叶斯更新)描述了如何根据新的证据更新一个假设的概率。对于分类任务,贝叶斯定理可以表示为:
其中:
- 是后验概率,即在给定证据的情况下,假设 为真的概率。
- 是似然概率,即如果假设为真,那么观察到证据 的概率。
- 是先验概率,即在没有其他证据的情况下,假设 为真的概率。
- 是证据 的概率,通常是一个常数,用于归一化。
1.4 朴素贝叶斯的类型
根据特征属性的不同,朴素贝叶斯可以分为多种类型,如:
- 高斯朴素贝叶斯:当特征属性是连续变量,且符合高斯分布时使用。
- 多项式朴素贝叶斯:当特征属性是离散值时使用,常用于文本分类。
- 伯努利朴素贝叶斯:当特征属性是布尔值(0或1)时使用。
1.5 优点和缺点
优点:
- 实现简单,易于理解。
- 在某些情况下,性能很好,尤其是当特征维度非常高时。
- 对缺失数据不太敏感。
缺点:
- 假设特征属性之间相互独立,这在现实中往往不成立。
- 当分类别包含的样本数不均衡时,可能会影响分类效果。
- 需要计算先验概率和条件概率,对于数据量大的情况,计算量较大。
1.6 API
sklearn.naive_bayes.MultinomialNB()
主要参数:
- alpha (float, optional, default=1.0):
- 平滑参数(也称为拉普拉斯/利德斯通平滑)。增加这个值可以减少过拟合的风险,但可能会降低分类性能。
- fit_prior (boolean, optional, default=True):
- 是否学习类的先验概率。如果为
False
,则使用统一的先验概率。
- 是否学习类的先验概率。如果为
- class_prior (array-like of shape (n_classes,), optional):
- 类的先验概率。如果指定,则不根据数据调整先验。
- class_weight (dict, 'balanced' or None, optional):
- 用于处理不平衡类的权重。如果设置为 'balanced',则类权重与类频率成反比。
1.7 代码实现
from sklearn.datasets import fetch_20newsgroups_vectorized
from sklearn.naive_bayes import MultinomialNB
from sklearn.model_selection import train_test_split
# 加载数据集
news = fetch_20newsgroups_vectorized(subset='all')
X, y = news.data, news.target
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 创建并训练模型
mnb = MultinomialNB(alpha=0.1)
mnb.fit(X_train, y_train)
# 预测测试集并计算准确率
y_pred = mnb.predict(X_test)
accuracy = mnb.score(X_test, y_test)
print("Accuracy:", accuracy)
2 特征降维
特征降维是机器学习中的一个重要步骤,特别是在处理高维数据时。当数据的特征数量过多时,可能会导致以下问题:
- 计算成本:高维数据需要更多的计算资源来处理。
- 过拟合风险:当模型在过多的特征上训练时,可能会过度适应训练数据,导致在未见过的数据上表现不佳。
- 可解释性:高维数据难以理解和可视化。
特征降维的目标是通过某种方式减少特征的数量,同时保留尽可能多的有用信息。
2.1 PCA(Principal Component Analysis,主成分分析)
2.1.1 定义
PCA是一种通过降维来简化数据结构的方法,即把原有的多个指标转化成少数几个代表性较好的综合指标。这少数几个指标能够反映原来指标的大部分信息(80%以上),并且各个指标之间保持独立,避免出现重叠信息。
2.1.2 数学原理
PCA的主要思想是将原始数据在协方差矩阵的特征向量上进行投影,这些特征向量被称为主成分。第一个主成分是原始数据方差最大的方向,第二个主成分是与第一个主成分正交且方差次大的方向,依此类推。通过选择保留的主成分数量,我们可以达到对数据进行降维的目的。
2.2.3 API
from sklearn.decomposition import PCA
# 假设 X 是你的数据,一个形状为 [n_samples, n_features] 的二维数组
pca = PCA(n_components=2) # 创建一个 PCA 对象,设置希望降维后的主成分个数为 2
X_pca = pca.fit_transform(X) # 对数据进行拟合和转换,得到降维后的数据
关键参数
n_components
:整数,浮点数,字符串或无(默认为无)。PCA算法中保留的主成分个数。如果n_components是整数,则它是要保留的主成分数。如果n_components在0和1之间,则它表示要保留的方差比例。如果为None,则所有组件都将被保留。copy
:布尔值(默认为True)。如果为False,则数据在降维时会被覆盖;否则,原始数据保持不变(即返回数据的副本)。whiten
:布尔值(默认为False)。当它为True时,PCA算法将对数据进行白化(即数据被除以每个主成分的标准差)。svd_solver
:字符串{‘auto’,‘full’,‘arpack’,‘randomized’}(默认为‘auto’)。指定SVD求解器来执行降维。不同的求解器适合不同的应用场景。tol
:浮点数(默认为0.0)。在求解SVD时,如果指定的容差小于机器精度,则求解器可能会收敛到奇异值。iterated_power
:整数(默认为‘auto’)。指定当svd_solver为'randomized'时,用于计算截断随机SVD的幂迭代次数。random_state
:整数,RandomState实例或无(默认为无)。控制随机数生成器的状态,以便结果可以重现。
2.2 相关系数法
“相关系数法”通常指的是在统计分析中使用相关系数来衡量两个或多个变量之间的关系。相关系数是最早由统计学家卡尔·皮尔逊设计的统计指标,用于研究变量之间线性相关程度的量,一般用字母r或ρ表示。
使用相关系数法进行降维,主要是基于特征之间的相关性来删除或合并高度相关的特征,从而达到降低数据维度的目的。以下是基于相关系数法降维的一般步骤:
- 计算相关系数:首先,你需要计算数据集中所有特征对之间的相关系数。常用的相关系数有皮尔逊相关系数(Pearson correlation coefficient)和斯皮尔曼秩相关系数(Spearman's rank correlation coefficient)等。皮尔逊相关系数衡量的是两个变量之间的线性关系,而斯皮尔曼秩相关系数则衡量的是两个变量之间的单调关系。
- 设定阈值:然后,你需要设定一个相关系数阈值。这个阈值表示两个特征之间的相关性达到什么程度时,它们被认为是高度相关的。一般来说,这个阈值可以根据具体问题和领域知识来设定。
- 删除或合并特征:对于相关系数超过阈值的特征对,你可以选择删除其中一个特征(通常是删除信息含量较低或冗余的特征),或者将这两个特征合并成一个新的特征。合并的方法可以是对这两个特征进行加权平均,或者选择其中一个作为代表。
- 验证降维效果:最后,你需要验证降维后的数据是否仍然保留了原始数据的主要信息。这可以通过比较降维前后数据的统计特性、模型性能等方式来实现。
需要注意的是,虽然相关系数法可以有效地降低数据的维度,但它也存在一些局限性。例如,它只能处理线性关系,对于非线性关系可能无法有效识别;另外,它也无法处理特征之间的冗余性,即即使两个特征之间相关性不高,它们也可能同时包含了相似的信息。因此,在实际应用中,你可能需要结合其他降维方法(如主成分分析、独立成分分析等)来更全面地降低数据的维度。