一、支持向量机文本分类
1.1 支持向量机分类器(SVC)
支持向量机分类器(Support Vector Classifier),缩写为SVC。SVC 是 sklearn.svm 模块的一部分,提供了对支持向量机(SVM)算法的实现。SVM 是一种监督学习模型,用于分类和回归任务。SVC 是 SVM 用于分类的实现。
1.2 SVC的用法及参数
通过以下方式创建 SVC 对象并进行训练:
from sklearn.svm import SVC
# 创建一个线性核SVC
clf = SVC(kernel='linear', C=1.0, probability=True)
# 训练模型
clf.fit(X_train, y_train)
# 预测
predictions = clf.predict(X_test)
主要参数
- kernel:
- 核函数的类型,默认为 ‘rbf’(径向基函数)。
可选值包括 ‘linear’、‘poly’、‘rbf’、‘sigmoid’ 以及可自定义的核函数。
‘linear’ 表示线性核,‘poly’ 表示多项式核,‘rbf’ 表示径向基核,‘sigmoid’ 表示 sigmoid 核。
根据问题的特性选择合适的核函数。线性核适合高维数据,非线性核适合复杂的决策边界。 - C:
- 正则化参数,默认为 1.0。
C 越大,意味着越希望模型在训练集上有更少的错误(可能导致过拟合)。
C 越小,意味着越希望模型更简单(可能导致欠拟合)。 - degree:
多项式核函数的多项式次数,仅在 kernel=‘poly’ 时有效,默认为 3。
如果使用多项式核,可以调整 degree 以控制多项式的复杂度。 - gamma:
核函数系数,用于 ‘rbf’、‘poly’ 和 ‘sigmoid’ 三种核函数。
‘scale’(默认):1 / (n_features * X.var())。
‘auto’:1 / n_features。
值越大,表示决策边界越不平滑(可能导致过拟合)。 - probability:
是否启用概率估计,默认为 False。
启用后可以使用 predict_proba 和 predict_log_proba 方法。 - shrinking:
是否启用收缩启发式算法,默认为 True。
收缩启发式可以加速计算,但在某些情况下可能会减慢计算速度。 - decision_function_shape:
多分类的决策函数形状,默认为 ‘ovr’(一对多)。
‘ovo’ 表示一对一策略。可以选择最适合多分类任务的方法。 - random_state:
随机种子,用于生成随机数,默认为 None。
如果设置了 random_state,则每次运行都会得到相同的结果,这对于可重复性很重要。
主要方法 - fit:
用于训练模型,接收训练数据 X 和目标标签 y。 - predict:
用于进行预测,接收测试数据 X。 - predict_proba:
用于预测样本属于每个类别的概率(需要启用 probability 参数)。 - score:
返回模型在给定数据上的准确率。
1.3 SVC分类器应用
首先对文本进行预处理、分词及向量化(可参考博文:LDA主题模型及Python实现3.1节文本预处理和3.2的文本向量化),然后划分数据集和测试集:
X_train, X_test, y_train, y_test = train_test_split(tf, # 包含文本数据的数组或列表,即特征集、向量化的文本
labels, # 对应于texts的标签数组或列表,即我们要预测的目标变量
test_size=0.2, # 确定测试集的比例。这里设置为0.2意味着20%的数据将被用作测试集,而剩余的80%将用作训练集。
random_state=42) # 是随机数生成器的种子值。
# 使用相同的数据集和相同的random_state,我们每次运行这段代码时,都会得到完全相同的分割结果。
创建SVM分类器:
# 创建SVM分类器
svm_model = SVC(kernel='linear', decision_function_shape='ovr')
svm_model.fit(X_train, y_train)
# 在测试集上应用模型
predictions = svm_model.predict(X_test)
# 查看预测结果
df['predictions'] = svm_model.predict(tf)
print(df[['content', 'type', 'predictions']].head())
二、朴素贝叶斯文本分类
2.1 朴素贝叶斯分类器
MultinomialNB 是 scikit-learn 中的一个朴素贝叶斯分类器,用于处理离散特征的分类任务。它基于多项式分布,对于词频等离散计数特征特别有效,因此常用于文本分类等问题。
2.2 MultinomialNB的用法及参数
通过以下方式创建 MultinomialNB 对象并进行训练:
from sklearn.naive_bayes import MultinomialNB
# 创建MultinomialNB分类器
clf = MultinomialNB(alpha=1.0, fit_prior=True)
# 训练模型
clf.fit(X_train, y_train)
# 预测
predictions = clf.predict(X_test)
主要参数
- alpha:
平滑参数,默认为 1.0。
alpha 是拉普拉斯平滑(Laplace Smoothing)或勒贝格平滑(Lidstone Smoothing)参数,用于防止概率为零的情况。
较高的 alpha 值会降低模型的过拟合风险,适用于小数据集。
平滑参数有助于避免零概率的问题,即在训练集中未出现的词在测试集上出现时,不会导致分类器无法处理。 - fit_prior:
指定是否考虑先验概率,默认为 True。
如果为 True,模型会根据数据估计类别的先验概率。
如果为 False,模型会假设所有类别的先验概率相等,对于一些实际问题(如某个类别特别少),可以考虑设置 fit_prior=False。 - class_prior:
指定每个类别的先验概率,默认情况下为 None,没有显式设置类别的先验概率,由模型自动估计。
如果设置了 class_prior,则会覆盖 fit_prior 的设置。 - force_alpha:
强制使用指定的 alpha 参数。
默认情况下为 ‘warn’,即显示警告而不强制。如果为 True,则强制使用 alpha 参数。
1.3 MultinomialNB分类器应用
同样,首先对文本数据进行预处理和数据集划分,然后创建朴素贝叶斯分类器:
# 创建朴素贝叶斯分类器
nb_model = MultinomialNB()
nb_model.fit(X_train, y_train)
# 在测试集上应用模型
predictions = nb_model.predict(X_test)
# 查看预测结果
df['predictions'] = nb_model.predict(tf)
print(df[['content', 'type', 'predictions']].head())
三、两种分类算法的差别
- 原理和方法
- SVM:
SVM 是一种最大化分类边界的监督学习模型。
它通过寻找一个最优超平面来分隔不同的类别,并尝试最大化类别之间的间隔。
对于文本数据,通常使用线性核,因为文本数据通常是高维稀疏数据。 - Naive Bayes:
Naive Bayes 是一种基于贝叶斯定理的概率模型。
它假设特征是相互独立的。
对于文本数据,常用的多项式朴素贝叶斯(MultinomialNB)适合处理词频或TF-IDF特征。
- 性能
- 准确性:
SVM:通常在大型、高维数据上表现较好。由于其复杂的优化算法,它往往比朴素贝叶斯准确。
Naive Bayes:由于特征独立的假设,它在某些情况下可能不准确,但在小数据集或简单问题上表现良好。 - 训练速度:
SVM:训练过程可能比较慢,尤其是数据量大时。然而,核函数可以通过非线性映射提升性能。
Naive Bayes:非常快速,适合大型数据集。 - 预测速度:
SVM:预测速度中等,尤其在复杂模型(如使用非线性核)中。
Naive Bayes:非常快,因为它只需要简单的概率计算。
- 应用场景
- SVM:
适用于数据维数高且类别数量较多的场景。
对异常值敏感,适合处理干净的数据。 - Naive Bayes:
适用于特征独立且类别分布明显的场景。
对数据噪音不敏感,适合处理有噪音的数据。