🤵♂️ 个人主页:@艾派森的个人主页
✍🏻作者简介:Python学习者
🐋 希望大家多多支持,我们一起进步!😄
如果文章对你有帮助的话,
欢迎评论 💬点赞👍🏻 收藏 📂加关注+
目录
1.项目背景
随着互联网的快速发展,网络安全问题日益凸显。互联网防火墙作为网络安全的第一道防线,负责监控和过滤进出网络的数据包,以阻止恶意攻击和非法访问。然而,随着网络攻击手段的不断更新和复杂化,传统的防火墙技术已难以满足日益增长的安全需求。因此,开发一种高效、智能的异常行为识别模型对于提升防火墙的防护能力具有重要意义。
近年来,机器学习算法在各个领域取得了显著的成功,尤其在处理大规模、高维度数据时展现出了强大的优势。XGBoost作为一种基于梯度提升决策树(Gradient Boosting Decision Tree)的集成学习算法,以其高效性、稳定性和准确性受到了广泛关注。XGBoost通过构建多个弱分类器(如决策树)并将其组合成强分类器,能够自动提取数据的特征并进行分类,适用于处理复杂的分类问题。
因此,本研究旨在利用XGBoost算法构建一种互联网防火墙异常行为识别模型。通过对网络流量数据的收集和分析,提取出与网络攻击相关的特征,并基于这些特征训练XGBoost模型。通过不断优化模型参数和调整特征选择,提高模型的识别精度和泛化能力。最终,将训练好的模型部署到防火墙系统中,实现对网络流量的实时监控和异常行为的自动识别,从而提升防火墙的防护能力和网络安全性。
2.数据集介绍
本实验数据集来源于Kaggle,原始数据集共有65532条,12个变量,数据部分截图如下:
3.技术工具
Python版本:3.9
代码编辑器:jupyter notebook
4.实验过程
4.1加载数据
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import seaborn as sns
sns.set(font='SimHei')
import warnings
warnings.filterwarnings('ignore')
df = pd.read_csv('互联网防火墙数据集.csv')
df.head()
查看数据大小
查看数据基本信息
查看数据描述性统计
4.2数据预处理
统计缺失值情况
发现各列并不存在缺失值
统计重复值情况
发现原始数据存在8362条重复数据需要处理,直接删除即可
4.3数据可视化
sns.countplot(data=df,x='Action')
plt.show()
fig = plt.figure(figsize=(18,18))
sns.heatmap(df.corr(),vmax=1,annot=True,linewidths=0.5,cbar=False,cmap='YlGnBu',annot_kws={'fontsize':18})
plt.xticks(fontsize=20)
plt.yticks(fontsize=20)
plt.title('各个因素之间的相关系数',fontsize=20)
plt.show()
4.4特征工程
由于目标变量是非数值类型,故需要进行编码处理
接着准备建模数据,即特征变量和目标变量,并拆分数据集为训练集和测试集
# 准备用于创建模型的数据
from sklearn.model_selection import train_test_split
X = df.drop('Action', axis=1)
y = df["Action"]
# 划分数据集
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2,random_state=42)
print('训练集大小:',X_train.shape[0])
print('测试集大小:',X_test.shape[0])
4.5构建模型
# 构建逻辑回归模型
from sklearn.linear_model import LogisticRegression
lr = LogisticRegression()
lr.fit(X_train,y_train)
print('逻辑回归模型准确率:',lr.score(X_test,y_test))
# 构建KNN模型
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier()
knn.fit(X_train,y_train)
print('KNN模型准确率:',knn.score(X_test,y_test))
# 构建决策树模型
from sklearn.tree import DecisionTreeClassifier
tree = DecisionTreeClassifier()
tree.fit(X_train,y_train)
print('决策树模型准确率:',tree.score(X_test,y_test))
# 构建xgboost模型
from xgboost import XGBClassifier
xgb = XGBClassifier()
xgb.fit(X_train,y_train)
print('xgboost模型准确率:',xgb.score(X_test,y_test))
通过对比4个模型的准确率,我们选择准确率最高的xgboost模型作为最终的训练模型
4.6模型评估
from sklearn.metrics import r2_score,confusion_matrix,classification_report,auc,roc_curve
# 模型评估
y_pred = xgb.predict(X_test)
print('模型的R方值:',r2_score(y_test,y_pred))
print('模型混淆矩阵:','\n',confusion_matrix(y_test,y_pred))
print('模型分类报告:','\n',classification_report(y_test,y_pred))
# 混淆矩阵可视化
fig = plt.figure(figsize=(8,8))
sns.heatmap(confusion_matrix(y_test,y_pred),vmax=1,annot=True,linewidths=0.5,cbar=False,cmap='YlGnBu',annot_kws={'fontsize':18})
plt.xticks(fontsize=20)
plt.yticks(fontsize=20)
plt.title('XGBoost模型混淆矩阵',fontsize=20)
plt.show()
4.7特征重要性
#打印特征重要性评分
feat_labels = X_train.columns[0:]
importances = xgb.feature_importances_
indices = np.argsort(importances)[::-1]
index_list = []
value_list = []
for f,j in zip(range(X_train.shape[1]),indices):
index_list.append(feat_labels[j])
value_list.append(importances[j])
print(f + 1, feat_labels[j], importances[j])
plt.figure(figsize=(10,6))
plt.barh(index_list[::-1],value_list[::-1])
plt.yticks(fontsize=12)
plt.title('各特征重要程度排序',fontsize=14)
plt.show()
4.8模型预测
随机抽取10个预测结果进行检验
# 模型预测
res = pd.DataFrame()
res['真实值'] = y_test
res['预测值'] = y_pred
res.sample(10)
从结果可以发现预测结果全部正确,模型效果很棒!
5.总结
基于XGBoost算法构建的互联网防火墙异常行为识别模型在本实验中取得了显著的效果。通过对网络流量数据的收集、处理和分析,结合XGBoost算法的优势,我们成功地训练出了一个高效的异常行为识别模型。在测试阶段,该模型展现出了出色的性能,准确率达到了0.998,这意味着模型能够准确地识别出网络流量中的正常行为和异常行为。
这一实验结果表明,利用XGBoost算法构建互联网防火墙异常行为识别模型是可行的,并且具有较高的实际应用价值。通过部署该模型到防火墙系统中,我们可以实现对网络流量的实时监控和异常行为的自动识别,从而及时发现并应对网络攻击,提升网络安全性。
此外,本实验还验证了XGBoost算法在处理大规模、高维度数据时的有效性。通过自动提取数据的特征并进行分类,XGBoost算法能够充分利用网络流量数据中的信息,提高异常行为识别的准确性。
综上所述,基于XGBoost算法构建的互联网防火墙异常行为识别模型在本实验中取得了令人满意的成果,对于提升防火墙的防护能力和网络安全性具有重要意义。未来,我们将继续优化模型参数和调整特征选择,以进一步提高模型的性能,并探索将其应用于更广泛的网络安全领域。
源代码
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import seaborn as sns
sns.set(font='SimHei')
import warnings
warnings.filterwarnings('ignore')
df = pd.read_csv('互联网防火墙数据集.csv')
df.head()
df.shape
df.info()
df.describe().T
df.isnull().sum()
df.duplicated().sum()
df.drop_duplicates(inplace=True)
df.duplicated().sum()
sns.countplot(data=df,x='Action')
plt.show()
fig = plt.figure(figsize=(18,18))
sns.heatmap(df.corr(),vmax=1,annot=True,linewidths=0.5,cbar=False,cmap='YlGnBu',annot_kws={'fontsize':18})
plt.xticks(fontsize=20)
plt.yticks(fontsize=20)
plt.title('各个因素之间的相关系数',fontsize=20)
plt.show()
df['Action'].value_counts()
df['Action'].replace(to_replace={'allow':0,'drop':1,'deny':2,'reset-both':3},inplace=True)
df['Action'].value_counts()
# 准备用于创建模型的数据
from sklearn.model_selection import train_test_split
X = df.drop('Action', axis=1)
y = df["Action"]
# 划分数据集
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2,random_state=42)
print('训练集大小:',X_train.shape[0])
print('测试集大小:',X_test.shape[0])
# 构建逻辑回归模型
from sklearn.linear_model import LogisticRegression
lr = LogisticRegression()
lr.fit(X_train,y_train)
print('逻辑回归模型准确率:',lr.score(X_test,y_test))
# 构建KNN模型
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier()
knn.fit(X_train,y_train)
print('KNN模型准确率:',knn.score(X_test,y_test))
# 构建决策树模型
from sklearn.tree import DecisionTreeClassifier
tree = DecisionTreeClassifier()
tree.fit(X_train,y_train)
print('决策树模型准确率:',tree.score(X_test,y_test))
# 构建lightgbm模型
from lightgbm import LGBMClassifier
gbm = LGBMClassifier()
gbm.fit(X_train,y_train)
print('lightgbm模型准确率:',gbm.score(X_test,y_test))
# 构建xgboost模型
from xgboost import XGBClassifier
xgb = XGBClassifier()
xgb.fit(X_train,y_train)
print('xgboost模型准确率:',xgb.score(X_test,y_test))
from sklearn.metrics import r2_score,confusion_matrix,classification_report,auc,roc_curve
# 模型评估
y_pred = xgb.predict(X_test)
print('模型的R方值:',r2_score(y_test,y_pred))
print('模型混淆矩阵:','\n',confusion_matrix(y_test,y_pred))
print('模型分类报告:','\n',classification_report(y_test,y_pred))
# 混淆矩阵可视化
fig = plt.figure(figsize=(8,8))
sns.heatmap(confusion_matrix(y_test,y_pred),vmax=1,annot=True,linewidths=0.5,cbar=False,cmap='YlGnBu',annot_kws={'fontsize':18})
plt.xticks(fontsize=20)
plt.yticks(fontsize=20)
plt.title('XGBoost模型混淆矩阵',fontsize=20)
plt.show()
#打印特征重要性评分
feat_labels = X_train.columns[0:]
importances = xgb.feature_importances_
indices = np.argsort(importances)[::-1]
index_list = []
value_list = []
for f,j in zip(range(X_train.shape[1]),indices):
index_list.append(feat_labels[j])
value_list.append(importances[j])
print(f + 1, feat_labels[j], importances[j])
plt.figure(figsize=(10,6))
plt.barh(index_list[::-1],value_list[::-1])
plt.yticks(fontsize=12)
plt.title('各特征重要程度排序',fontsize=14)
plt.show()
# 模型预测
res = pd.DataFrame()
res['真实值'] = y_test
res['预测值'] = y_pred
res.sample(10)
资料获取,更多粉丝福利,关注下方公众号获取