机器学习模型总结

创建用于二元分类的平衡数据集

我们知道,在机器学习中,平衡的数据集至关重要,因为它确保每个数据类别或类别的代表是相等的。这意味着每个类别中的观测数量大致相同,这防止了模型偏向多数类别。不平衡的数据集可能导致模型性能不佳,因为模型可能难以预测少数类别。正如我们已知,以下数据集高度不平衡,我们在创建多类别分类的平衡数据集时,采用了 SMOTE(合成少数类过采样技术)来增加少数类别的样本。这有助于我们创建一个整体平衡的数据集,以供分类模型使用。

逻辑回归(二元分类)

逻辑回归是一种用于根据一个或多个自变量预测二元结果概率的统计模型。它使用 Sigmoid 函数来输出介于 0 和 1 之间的概率分数,以建模自变量和因变量之间的关系。它常用于分类任务,其目标是确定一个观察值属于两个类别中的哪一个,例如判断一封电子邮件是否为垃圾邮件。

参数

max_iter

此参数设置求解器收敛的最大迭代次数。默认值设置为 100。然而,我们的模型仅用

100 次迭代无法收敛,因此我们将它增加到我们想要的值

C

此参数是正则化强度,控制着拟合训练数据良好和避免过拟合之间的权衡。C 的值越

小,表示正则化越强。我们为其中一个模型使用了较小的值,为其他模型使用了较大

的值,以观察在分别赋予高低重要性后,模型在避免过拟合方面的表现

求解器

此参数指定在拟合逻辑回归模型时在优化问题中使用的算法。有几种不同的求解器算

法可供选择,如 lbfgs、saga、liblinear 等。我们选择了'saga'和'sag'来训练我们的模型

random_state

这是为了确保输出是确定的并且可以重现

使用了 sklearn.linear_model 模块中的 LogisticRegression 类来创建并训练一个逻辑回归模型

from sklearn.linear_model import LogisticRegression
# 创建逻辑回归模型实例
lr1 = LogisticRegression(max_iter = 10000, C = 0.1, random_state = 0, solver = 'saga')
# 使用训练集拟合逻辑回归模型  lr1
lr1.fit(X_train_bc, y_train_bc)
# 使用cross_val_score  函数进行 5 折交叉验证
cv_lr1 = cross_val_score(lr1, X_train_bc, y_train_bc, cv = 5)
print('Logistic regression Model 1')
# 打印每个折的交叉验证分数
print(f'\nCross-validation scores:', ', '.join(map(str, cv_lr1)))
# 打印平均交叉验证分数
print(f'\nMean cross-validation score: {cv_lr1.mean():.2f}')
# 显示逻辑回归模型的系数
print('Logistic Regression Model 1 coefficients:')
print(*lr1.coef_, sep = ', ')
# 打印模型的截距  截距有时被称为偏置项或常数项,它代表了模型中的一个固定数值用于调整模型的输出
print('\nLogistic Regression Model 1 intercept:', *lr1.intercept_)
# 创建逻辑回归模型实例
lr1 = LogisticRegression(max_iter = 10000, C = 0.1, random_state = 0, solver = 'saga')       #模型1
lr2 = LogisticRegression(max_iter = 15000, solver = 'sag', C = 100, random_state = 0)        #模型2

交叉验证

交叉验证(Cross-validation)是一种统计学方法,用于评估并比较机器学习模型的性能,特别是在分类和回归问题中。它通过将数据集分成多个子集,然后使用这些子集来训练和验证模型,从而提供了一种评估模型泛化能力(即模型对新数据的预测能力)的有效方式。

1. 评估模型的泛化能力

交叉验证的主要目的是评估模型对未见数据的泛化能力。通过在不同的数据子集上训练和测试模型,可以确保模型不是过拟合(即仅仅记住训练数据)而是能够推广到新的、未见过的数据。

2. 模型选择和调优

交叉验证可以帮助选择最佳的模型参数或算法。例如,在网格搜索(Grid Search)中,可以通过交叉验证来确定最佳的超参数设置。

3. 稳定性评估模型复杂度

通过观察不同折的验证分数,可以评估模型对数据集变化的敏感性。如果模型在不同的数据折上表现差异很大,可能表明模型对数据的噪声或小的变化过于敏感。

4. 减少过拟合风险

通过交叉验证,可以减少模型过拟合的风险。过拟合的模型在训练集上表现得很好,但在新数据上表现差。交叉验证通过在多个数据子集上评估模型,提供了对模型泛化能力的更可靠的估计。


交叉验证的类型

交叉验证有几种常见的类型:

K折交叉验证(K-Fold Cross-Validation)

将数据集分成K个子集,每次留出一个子集作为测试集,其余K-1个子集作为训练集。这个过程重复K次,每次选择不同的子集作为测试集。

留一法交叉验证(Leave-One-Out Cross-Validation)

这是K折交叉验证的特例,其中K=N(数据集中的样本数)。每次留出一个样本作为测试集,其余作为训练集。

分层K折交叉验证(Stratified K-Fold Cross-Validation)

当数据集类别分布不均匀时使用,分层K折可以保证每个子集中各类别的比例与完整数据集相同,常用于分类问题。


泛化能力


泛化能力(Generalization ability)是机器学习中一个核心概念,指的是模型在未见过的数据上的表现能力。换句话说,就是模型不仅仅在训练数据上表现良好,而且在新的、未见过的数据上也能做出准确预测的能力。一个具有强泛化能力的模型能够从训练数据中学习到通用的模式,并将其应用到新数据。

为什么泛化能力重要?

适应新数据

现实世界不断变化,模型需要能够处理未来的数据,这些数据可能与训练数据有所不同

避免过拟合

过拟合的模型在训练数据上表现很好,但在新数据上表现差。泛化能力可以帮助识别和避免过拟合

模型部署

在实际应用中,模型需要处理各种不同的数据,泛化能力确保模型在不同环境下的可靠性和有效性


如何评估泛化能力?

交叉验证

通过将数据集分成多个子集,每次留出一个子集作为测试集,其余作为训练集,可以评估模型在不同数据上的表现

测试集

保留一部分数据不用于训练模型,仅用于评估模型的最终性能

验证集外测试

使用与训练数据完全不同的数据集来测试模型,例如,使用公开数据集或真实世界的数据

性能指标

使用准确率、精确率、召回率、F1分数等性能指标评估模型在新数据上的表现

学习曲线

绘制学习曲线和验证曲线可以帮助理解模型在不同数据量下的表现,从而评估其泛化能力


提高泛化能力的方法

数据增强

通过数据增强技术(如旋转、缩放、裁剪等)增加训练数据的多样性,提高模型的泛化能力

正则化

通过正则化处理减少数据中的噪声和异常值的影响,使模型更加鲁棒

模型选择

选择适合问题的模型,避免过于复杂或过于简单的模型

超参数调优

调整模型的超参数,避免过拟合或欠拟合

集成方法

使用集成学习方法(如随机森林、梯度提升)结合多个模型的预测,通常能提高泛化能力

早停

在训练过程中,当验证集上的性能不再提升时停止训练,避免过拟合

泛化能力是机器学习模型成功的关键因素之一,确保模型不仅在训练数据上表现良好,而且能够适应新环境和数据。通过上述方法和评估技巧,可以提高模型的泛化能力,从而提高模型的实际应用价值。

支持向量机(二元分类法)

支持向量机(SVM)是一种用于分类和回归分析的监督式机器学习算法。它通过在多维空间中找到一个超平面,将数据点最佳地分离成不同的类别来实现。

参数

内核

内核参数指定要使用的内核函数类型。在这种情况下,我们使用了径向基函数(rbf)和多项式内核

C

C 参数控制最大化边缘和最小化分类误差之间的权衡

gamma

gamma 参数是一个超参数,它决定了单个训练样本对决策边界的影响

random_state

这是为了确保输出是确定的并且可以重现

# 创建支持向量机分类器实例
svm1 = SVC(kernel = 'poly', C = 1, random_state = 0, probability = True)                      #模型1
svm2 = SVC(kernel = 'rbf', C = 1, gamma = 0.1, random_state = 0, probability = True)          #模型2

创建多类分类的平衡数据集

from imblearn.over_sampling import SMOTE

X = df.drop('Attack Type', axis=1) # 特征变量
y = df['Attack Type']  #目标变量

smote = SMOTE(sampling_strategy='auto', random_state=0)
# 使用 fit_resample 方法对特征 X 和 目标变量 y 进行过采样,这将返回过采样后的特征和目标变量
X_upsampled, y_upsampled = smote.fit_resample(X, y)

blnc_data = pd.DataFrame(X_upsampled)
blnc_data['Attack Type'] = y_upsampled
# 从 blnc_data 中随机抽取一个样本,使得每个类别的样本数量相等,从而创建一个平衡的数据集
blnc_data = blnc_data.sample(frac=1)

blnc_data['Attack Type'].value_counts()
# 将经过 SMOTE 过采样处理后的数据集  blnc_data 划分为 特征集 features 和 标签集 labels
features = blnc_data.drop('Attack Type', axis = 1)
labels = blnc_data['Attack Type']
# 训练集的特征数据  测试集的特征数据  训练集的标签数据  测试集的标签数据
X_train, X_test, y_train, y_test = train_test_split(features, labels, test_size = 0.25, random_state = 0)

随机森林分类器

随机森林是一种集成学习方法,它结合多个决策树来提高模型的准确性和泛化性能。随机森林背后的基本思想是在训练数据的随机子集上拟合多个决策树,并平均它们的预测结果,以减少过拟合并提高泛化性能。

参数

n_estimators

此参数指定在随机森林中拟合的决策树数量

max_depth

此参数指定随机森林中每个决策树的最大深度。深度更大的树可以捕捉到数据中更复杂的交

互。在我们的案例中,此参数在获得更好的结果中发挥了重要作用

max_features

此参数指定在寻找每个树的最佳分割时考虑的特征数量。我们训练第一个模型时考虑了所有

特征,而对于第二个模型,我们只使用了 20 个特征

random_state

这是为了确保输出是确定的并且可以重现

# 创建随机森林分类器实例
rf1 = RandomForestClassifier(n_estimators = 10, max_depth = 6, max_features = None, random_state = 0)      #模型1
rf2 = RandomForestClassifier(n_estimators = 15, max_depth = 8, max_features = 20, random_state = 0)        #模型2

决策树分类器

决策树是一种用于机器学习的算法,用于分类和回归任务。该算法通过递归地将数据根据输入特征值分割成更小的子集,直到满足停止条件为止。在我们的情况下,这是树的最大深度。

参数

max_depth

此参数指定树的深度。深度更大的树可以捕捉到数据中更复杂的交互,但可能计算成本较高。

我们最初使用较小的深度,后来逐渐增加

# 创建决策树分类器实例
dt1 = DecisionTreeClassifier(max_depth = 6)      #模型1
dt2 = DecisionTreeClassifier(max_depth = 8)      #模型2

K最近邻算法

K 最近邻(KNN)是一种简单的算法,它根据某种距离度量(通常是欧几里得距离),在训练集中搜索与新的输入数据点最近的 k 个数据点(邻居)。然后,该算法对这些 k 个邻居的标签或目标值进行多数投票,以预测新数据点的标签或目标值。

参数

n_neighbors

这是 KNN 算法的一个超参数,用于指定在为新输入数据点进行预测时考虑的邻居数量。在我们的

情况下,我们最初从 16 开始进行预测。因此,模型将考虑 16 个最近的数据点(邻居)。

# 创建 KNeighbors 分类器实例
knn1 = KNeighborsClassifier(n_neighbors = 16)      #模型1
knn2 = KNeighborsClassifier(n_neighbors = 8)       #模型2

性能评估与讨论

Binary Classification Algorithms 二分类算法

  • Logistic Regression 逻辑回归

  • Support Vector Machine 支持向量机

为了比较不同的分类算法,我们选取了每个算法中表现最好的模型。

基于我们的各种测试,我们发现:

优点

缺点

逻辑回归

可以处理大量数据,在非常短的时间内进行训练

模型精度较低

支持向量机

准确率得分远高于逻辑回归模型

在计算上相当昂贵

我们在一些参数上进行了调整,以提高模型的精度。我们还进行了交叉验证,以确保我们的模型没有过拟合,并且训练恰到好处。

提到另一件事,那就是模型的准确性取决于数据集的标准化。我们使用和未使用标准缩放器训练了我们的模型。在测试不同模型的过程中,我们发现标准化数据集后,准确性和其他性能指标分数显著提高。因此,我们在应用 PCA 之前选择标准化数据。


Multi-class Classification Algorithms 多类分类算法

  • Random Forest 随机森林

  • Decision Trees 决策树

  • K Nearest Neighbours K 最近邻

再次,为了比较不同的分类算法,我们从每种算法中选择了表现最好的模型。

训练多类分类模型所需时间相对较低,这可能是由于训练数据量小于二分类训练数据。

如上分析部分所示,数据集高度不平衡。为了保持所有类别的数据平衡,我们首先从少数类中选取了最多的样本,从多数类中选取了足够的样本。随后,我们使用了 SMOTE(合成少数类过采样技术)来创建一个整体平衡的数据集,用于训练多类分类模型。

通过比较模型的性能指标,我们发现随机森林是表现最好的模型,其次是 KNN 和决策树。从混淆矩阵和分类报告中可以看出,随机森林在精确度、召回率和 f1 分数方面的优势明显。决策树表现不佳的原因在于它并不总是能够充分表达输入特征与目标变量之间的复杂关系。决策树可能难以处理目标变量依赖于输入特征组合而非单一或两个特征的问题。KNN 和随机森林可以通过使用更灵活的模型来处理输入特征与目标变量之间更复杂的关系。此外,我们调整决策树模型时使用的参数相对较少。就像二分类算法一样,我们也对多分类分类模型进行了交叉验证,以确保它们没有过拟合。

未来工作:考虑到这一点,如果我们想坚持使用一个模型,我们必须相应地选择我们的模型。然而,在这种情况下,我们也可以使用集成方法结合 KNN 和随机森林分类器。这可以通过利用两个模型的优势并减少过拟合的风险来提高我们入侵检测系统的准确性。集成方法将允许模型协同工作,产生更稳健的预测,这可能在识别不同类型的网络攻击方面更有效。

文章作者: zzxx
本文链接:
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 xxzz
喜欢就支持一下吧