利用KMeans算法识别黑客类型

在本次咨询项目中,将与一家大型科技公司合作,预测某些类型的黑客是否参与了对其服务器的攻击。为了解决这一现实世界问题,将借助PySparkKMeans算法,并基于取证工程师提取的特征,找出是否涉及第三种类型的黑客。

数据集介绍

数据集是在黑客攻击服务器后生成的,目的是为了保存公司数据,防止未来此类活动。取证工程师提取了一些特征,这些特征将为提供有关黑客类型的相关元数据。以下是每个特征的简要描述:

  • 会话连接时间:表示会话存在的总时间(分钟)。
  • 传输字节:让知道在会话期间传输了多少兆字节。
  • Kali痕迹使用:这是一个标志变量,表示黑客是否使用了Kali Linux操作系统。
  • 服务器损坏:在攻击期间有多少服务器被破坏。
  • 页面损坏:他们非法访问了多少页面。
  • 位置:虽然也有这个元信息,但这对没有用,因为黑客使用VPN。
  • WPM打字速度:基于可用日志的犯罪分子的打字速度。

方法论

首先,来了解公司已经知道的情况。他们知道有三种类型的黑客可能发动攻击。他们对其中两种非常确定,但他们希望能确定是否有第三种类型的攻击者参与了这一犯罪行为。

在继续之前,需要知道取证工程师知道黑客的权衡,这意味着每种黑客的攻击次数是相同的。因此,如果有三种类型的黑客,他们可能会平均分配攻击。否则,第三种嫌疑人这次就不会参与。

例如,如果所有三种类型的攻击者都是嫌疑人,那么在100次攻击中,每种类型将负责33次。

必须遵循的步骤

在对数据集进行高层次分析并在其上实现KMeans聚类算法之前,必须遵循以下步骤:

  1. 初始化Spark对象:在这一步中,将为Apache Spark设置一个环境,以便创建Spark会话,并可以访问Spark支持的所有库。
  2. 读取数据集:与烹饪需要火一样,读取数据集在模型准备和数据分析之前同样重要。
from pyspark.sql import SparkSession spark = SparkSession.builder.appName('find_hackers').getOrCreate() spark

创建了一个名为“find_hackers”的SparkSession,使用getOrCreate()函数。注意,在“create”方法之前有一个builder方法,它设置了会话/应用程序的名称。

dataset = spark.read.csv("hack_data.csv", header=True, inferSchema=True) dataset.show()

保持header和inferSchema为True,以便将记录的第一个元组视为特征列的标题,并返回每列数据的原始类型。在输出中,代码返回了一个包含20行的DataFrame。

dataset.head()

Head是PySpark支持的方法之一,它将返回列名和关联值。

dataset.describe().show()

获取统计信息是分析数据集时的关键步骤之一,因为它将告诉关于最小值、最大值、标准差等信息。同样,从输出中可以看到数据集中没有空值(从计数行)。

向量组装器

机器学习算法总是接受正确格式化的数据,无论使用什么库,无论是scikit-learn还是案例中的PySpark;格式化数据始终是必要的,以便只向KMeans模型提供正确类型的数据。

from pyspark.ml.linalg import Vectors from pyspark.ml.feature import VectorAssembler feat_cols = ['Session_Connection_Time', 'Bytes_Transferred', 'Kali_Trace_Used', 'Servers_Corrupted', 'Pages_Corrupted', 'WPM_Typing_Speed'] vec_assembler = VectorAssembler(inputCols=feat_cols, outputCol='features') final_data = vec_assembler.transform(dataset)

从ml库的特征模块导入VectorAssembler对象。然后创建一个新变量,将存储所有特征的列表。最后,调用组装器对象并传递输入列作为特征,并转换它,以便原始数据中也应该有变化。

特征缩放

当数据集中的值范围多样性很大时,特征缩放是一个重要步骤,即范围变化很大,可能导致维度灾难的条件,这将产生结果,但不是期望的,因此现在将缩小特征列。

from pyspark.ml.feature import StandardScaler scaler = StandardScaler(inputCol="features", outputCol="scaledFeatures", withStd=True, withMean=False) scalerModel = scaler.fit(final_data) cluster_final_data = scalerModel.transform(final_data)

导入StandardScaler对象,然后调用它,以便可以将输入列作为特征,保持withStd参数为True,因为希望根据标准差缩放数据,而不是平均值。提取通过拟合标准缩放器从拟合方法获得的统计摘要。拟合对象后,转换是下一步,每个特征将被标准化为单位标准差度量。

模型训练

现在是模型训练阶段,将创建一个KMeans模型来帮助创建涉及黑客服务器的所有三种或更多类型的聚类。

from pyspark.ml.clustering import KMeans kmeans3 = KMeans(featuresCol='scaledFeatures', k=3) kmeans2 = KMeans(featuresCol='scaledFeatures', k=2) model_k3 = kmeans3.fit(cluster_final_data) model_k2 = kmeans2.fit(cluster_final_data) model_k3 = model_k3.transform(cluster_final_data) model_k2 = model_k2.transform(cluster_final_data)

在上面的代码中,简单地创建了两个KMeans模型,一个是k=3,另一个是k=2,以便可以比较这两种情况,并解决需要找出第三黑客是否参与了这次恶意活动的问题。

构建模型后,评估它同样重要,因为“可能有数百万种模型,但只有1种有用。”为了获得最优化的模型,需要根据一些指标来评估它。在KMeans模型的情况下,使用聚类评估器对象进行评估。

from pyspark.ml.evaluation import ClusteringEvaluator evaluator = ClusteringEvaluator() k3_evaluator = evaluator.evaluate(model_k3) k2_evaluator = evaluator.evaluate(model_k2) print("When K=3") print("Error results = " + str(k3_evaluator)) print('-'*53) print("When K=2") print("Error results = " + str(k2_evaluator))

在评估后,打印了结果。从这里可以看到,当k值为2时,错误结果相对较高,而当k=3时则较低。

文章的最后部分是结论,将简要介绍每一步,以便项目的流程清晰明了,以便其他人可以将此作为其他类似问题的模板。首先,彻底调查了问题陈述并澄清了方法。然后,完成了一些必须的步骤,如读取数据集和设置Spark会话。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485