在本次咨询项目中,将与一家大型科技公司合作,预测某些类型的黑客是否参与了对其服务器的攻击。为了解决这一现实世界问题,将借助PySpark的KMeans算法,并基于取证工程师提取的特征,找出是否涉及第三种类型的黑客。
数据集是在黑客攻击服务器后生成的,目的是为了保存公司数据,防止未来此类活动。取证工程师提取了一些特征,这些特征将为提供有关黑客类型的相关元数据。以下是每个特征的简要描述:
首先,来了解公司已经知道的情况。他们知道有三种类型的黑客可能发动攻击。他们对其中两种非常确定,但他们希望能确定是否有第三种类型的攻击者参与了这一犯罪行为。
在继续之前,需要知道取证工程师知道黑客的权衡,这意味着每种黑客的攻击次数是相同的。因此,如果有三种类型的黑客,他们可能会平均分配攻击。否则,第三种嫌疑人这次就不会参与。
例如,如果所有三种类型的攻击者都是嫌疑人,那么在100次攻击中,每种类型将负责33次。
在对数据集进行高层次分析并在其上实现KMeans聚类算法之前,必须遵循以下步骤:
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会话。