Analysis of the Intrusion Detection Evaluation Dataset (CIC-IDS2017)
机器学习模型总结
创建用于二元分类的平衡数据集
我们知道,在机器学习中,平衡的数据集至关重要,因为它确保每个数据类别或类别的代表是相等的。这意味着每个类别中的观测数量大致相同,这防止了模型偏向多数类别。不平衡的数据集可能导致模型性能不佳,因为模型可能难以预测少数类别。正如我们已知,以下数据集高度不平衡,我们在创建多类别分类的平衡数据集时,采用了 SMOTE(合成少数类过采样技术)来增加少数类别的样本。这有助于我们创建一个整体平衡的数据集,以供分类模型使用。
逻辑回归(二元分类)
逻辑回归是一种用于根据一个或多个自变量预测二元结果概率的统计模型。它使用 Sigmoid 函数来输出介于 0 和 1 之间的概率分数,以建模自变量和因变量之间的关系。它常用于分类任务,其目标是确定一个观察值属于两个类别中的哪一个,例如判断一封电子邮件是否为垃圾邮件。
使用了 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)是机器学习中一个核心概念,指的是模型在未见过的数据上的表现能力。换句话说,就是模型不仅仅在训练数据上表现良好,而且在新的、未见过的数据上也能做出准确预测的能力。一个具有强泛化能力的模型能够从训练数据中学习到通用的模式,并将其应用到新数据。
为什么泛化能力重要?
如何评估泛化能力?
提高泛化能力的方法
泛化能力是机器学习模型成功的关键因素之一,确保模型不仅在训练数据上表现良好,而且能够适应新环境和数据。通过上述方法和评估技巧,可以提高模型的泛化能力,从而提高模型的实际应用价值。
支持向量机(二元分类法)
支持向量机(SVM)是一种用于分类和回归分析的监督式机器学习算法。它通过在多维空间中找到一个超平面,将数据点最佳地分离成不同的类别来实现。
# 创建支持向量机分类器实例
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)
随机森林分类器
随机森林是一种集成学习方法,它结合多个决策树来提高模型的准确性和泛化性能。随机森林背后的基本思想是在训练数据的随机子集上拟合多个决策树,并平均它们的预测结果,以减少过拟合并提高泛化性能。
# 创建随机森林分类器实例
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
决策树分类器
决策树是一种用于机器学习的算法,用于分类和回归任务。该算法通过递归地将数据根据输入特征值分割成更小的子集,直到满足停止条件为止。在我们的情况下,这是树的最大深度。
# 创建决策树分类器实例
dt1 = DecisionTreeClassifier(max_depth = 6) #模型1
dt2 = DecisionTreeClassifier(max_depth = 8) #模型2
K最近邻算法
K 最近邻(KNN)是一种简单的算法,它根据某种距离度量(通常是欧几里得距离),在训练集中搜索与新的输入数据点最近的 k 个数据点(邻居)。然后,该算法对这些 k 个邻居的标签或目标值进行多数投票,以预测新数据点的标签或目标值。
# 创建 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 和随机森林分类器。这可以通过利用两个模型的优势并减少过拟合的风险来提高我们入侵检测系统的准确性。集成方法将允许模型协同工作,产生更稳健的预测,这可能在识别不同类型的网络攻击方面更有效。