Translated ['src/AI/AI-Unsupervised-Learning-algorithms.md'] to zh

This commit is contained in:
Translator 2025-06-08 00:42:35 +00:00
parent 033067c5ec
commit 0a7a0a8b3f

View File

@ -4,7 +4,7 @@
## 无监督学习
无监督学习是一种机器学习类型,其中模型在没有标记响应的数据上进行训练。目标是发现数据中的模式、结构或关系。与监督学习不同,监督学习模型从标记示例中学习,无监督学习算法则处理未标记的数据。
无监督学习是一种机器学习类型,其中模型在没有标记响应的数据上进行训练。目标是发现数据中的模式、结构或关系。与监督学习不同,监督学习模型从标记示例中学习,无监督学习算法则处理未标记的数据。
无监督学习通常用于聚类、降维和异常检测等任务。它可以帮助发现数据中的隐藏模式,将相似的项目分组,或在保留数据基本特征的同时减少数据的复杂性。
### K均值聚类
@ -12,7 +12,7 @@
K均值是一种基于质心的聚类算法通过将每个点分配给最近的聚类均值将数据划分为K个聚类。该算法的工作流程如下
1. **初始化**选择K个初始聚类中心质心通常是随机选择或通过更智能的方法如k-means++。
2. **分配**:根据距离度量(例如,欧几里得距离)将每个数据点分配给最近的质心。
3. **更新**:通过取分配给每个聚类的所有数据点的均值重新计算质心。
3. **更新**:通过计算分配给每个聚类的所有数据点的均值来重新计算质心。
4. **重复**重复步骤2-3直到聚类分配稳定质心不再显著移动
> [!TIP]
@ -21,12 +21,12 @@ K均值是一种基于质心的聚类算法通过将每个点分配给最近
#### K的选择
聚类的数量K是一个超参数需要在运行算法之前定义。像肘部法则或轮廓系数等技术可以通过评估聚类性能来帮助确定K的适当值
- **肘部法则**绘制每个点到其分配的聚类质心的平方距离之和与K的关系图。寻找“肘部”点,在该点处,减少的速率急剧变化,指示适合的聚类数量。
- **肘部法则**将每个点到其分配的聚类质心的平方距离之和绘制为K的函数。寻找“肘部”点,在该点处,减少的速率急剧变化,指示适合的聚类数量。
- **轮廓系数**计算不同K值的轮廓系数。较高的轮廓系数表示聚类定义更好。
#### 假设和限制
K均值假设**聚类是球形且大小相等**这可能不适用于所有数据集。它对质心的初始位置敏感并可能收敛到局部最小值。此外K均值不适合具有不同密度或非球形形状的数据集以及具有不同尺度的特征。可能需要进行预处理步骤如归一化或标准化以确保所有特征对距离计算的贡献相等。
K均值假设**聚类是球形且大小相等**,这可能不适用于所有数据集。它对质心的初始位置敏感,并可能收敛到局部最小值。此外K均值不适合具有不同密度或非球形形状的数据集以及具有不同尺度的特征。可能需要进行预处理步骤如归一化或标准化以确保所有特征对距离计算的贡献相等。
<details>
<summary>示例 -- 聚类网络事件
@ -57,32 +57,32 @@ print("Cluster centers (duration, bytes):")
for idx, center in enumerate(kmeans.cluster_centers_):
print(f" Cluster {idx}: {center}")
```
在这个例子中K-Means 应该找到 4 个聚类。小型攻击聚类(持续时间异常高 ~200理想情况下会形成自己的聚类因为它与正常聚类的距离较远。我们打印聚类的大小和中心以解释结果。在实际场景中可以将少量点的聚类标记为潜在异常,或检查其成员是否存在恶意活动。
在这个例子中K-Means 应该找到 4 个簇。小型攻击簇(持续时间异常高 ~200理想情况下会形成自己的簇因为它与正常簇的距离较远。我们打印簇的大小和中心以解释结果。在实际场景中可以将少量点的簇标记为潜在异常,或检查其成员是否存在恶意活动。
</details>
### 层次聚类
层次聚类使用自下而上的(聚合)方法或自上而下的(分裂)方法构建聚类的层次结构:
层次聚类使用自下而上(聚合)或自上而下(分裂)的方法构建簇的层次结构:
1. **聚合(自下而上)**:从每个数据点作为单独的聚类开始,迭代地合并最近的聚类,直到只剩下一个聚类或满足停止标准。
2. **分裂(自上而下)**:从所有数据点在一个聚类中开始,迭代地拆分聚类,直到每个数据点都是自己的聚类或满足停止标准。
1. **聚合(自下而上)**:从每个数据点作为单独的簇开始,迭代地合并最近的簇,直到只剩下一个簇或满足停止标准。
2. **分裂(自上而下)**:从所有数据点在一个簇中开始,迭代地拆分簇,直到每个数据点都是自己的簇或满足停止标准。
聚合聚类需要定义聚类间距离和链接标准,以决定合并哪些聚类。常见的链接方法包括单链接(两个聚类之间最近点的距离)、完全链接(最远点的距离)、平均链接等,距离度量通常是欧几里得距离。链接的选择会影响生成的聚类形状。无需预先指定聚类数量 K可以在所选级别“切割”树状图以获得所需数量的聚类
聚合聚类需要定义簇间距离和链接标准,以决定合并哪些簇。常见的链接方法包括单链接(两个簇之间最近点的距离)、完全链接(最远点的距离)、平均链接等,距离度量通常是欧几里得距离。链接的选择会影响生成簇的形状。无需预先指定簇的数量 K可以在所选级别“切割”树状图以获得所需数量的簇
层次聚类生成一个树状图,显示不同粒度级别的聚类之间的关系。可以在所需级别切割树状图以获得特定数量的聚类
层次聚类生成一个树状图,显示不同粒度级别的簇之间的关系。可以在所需级别切割树状图以获得特定数量的簇
> [!TIP]
> *网络安全中的用例:* 层次聚类可以将事件或实体组织成树状结构,以发现关系。例如,在恶意软件分析中,聚合聚类可以根据行为相似性对样本进行分组,揭示恶意软件家族和变种的层次结构。在网络安全中,可以对 IP 流量进行聚类,并使用树状图查看流量的子分组(例如,按协议,然后按行为)。因为不需要提前选择 K所以在探索未知攻击类别数量的新数据时非常有用。
#### 假设和限制
层次聚类不假设特定的聚类形状,可以捕捉嵌套聚类。它对于发现分类法或群体之间的关系(例如,根据家族子组对恶意软件进行分组)非常有用。它是确定性的(没有随机初始化问题)。一个关键优势是树状图,它提供了对数据聚类结构在所有尺度上的洞察——安全分析师可以决定适当的截止点以识别有意义的聚类。然而,它在计算上是昂贵的(通常对于简单实现是 $O(n^2)$ 时间或更差),并且对于非常大的数据集不可行。它也是一种贪婪过程——一旦合并或拆分完成,就无法撤销,这可能导致如果早期发生错误而产生次优聚类。离群值也可能影响某些链接策略(单链接可能导致“链式”效应,即聚类通过离群值连接)。
层次聚类不假设特定的簇形状,可以捕捉嵌套簇。它对于发现分类法或群体之间的关系(例如,根据家族子组对恶意软件进行分组)非常有用。它是确定性的(没有随机初始化问题)。一个关键优势是树状图,它提供了对数据聚类结构在所有尺度上的洞察——安全分析师可以决定适当的截止点以识别有意义的。然而,它在计算上是昂贵的(通常对于简单实现是 $O(n^2)$ 时间或更差),并且对于非常大的数据集不可行。它也是一种贪婪过程——一旦合并或拆分完成,就无法撤销,这可能导致如果早期发生错误则产生次优簇。离群值也可能影响某些链接策略(单链接可能导致“链式”效应,即簇通过离群值链接)。
<details>
<summary>示例 -- 事件的聚合聚类
</summary>
我们将重用 K-Means 示例中的合成数据3 个正常聚类 + 1 个攻击聚类),并应用聚合聚类。然后我们将说明如何获得树状图和聚类标签。
我们将重用 K-Means 示例中的合成数据3 个正常簇 + 1 个攻击簇)并应用聚合聚类。然后我们将说明如何获得树状图和簇标签。
```python
from sklearn.cluster import AgglomerativeClustering
from scipy.cluster.hierarchy import linkage, dendrogram
@ -118,11 +118,11 @@ DBSCAN 识别核心点、边界点和噪声点:
聚类通过选择一个未访问的核心点开始将其标记为新聚类然后递归地添加所有从该点密度可达的点核心点及其邻居等。边界点被添加到附近核心的聚类中。在扩展所有可达点后DBSCAN 移动到另一个未访问的核心以开始新的聚类。未被任何核心到达的点仍然标记为噪声。
> [!TIP]
> *在网络安全中的用例:* DBSCAN 对于网络流量中的异常检测非常有用。例如正常用户活动可能在特征空间中形成一个或多个密集聚类而新颖的攻击行为则表现为分散的点DBSCAN 将其标记为噪声(离群点)。它已被用于聚类网络流量记录,可以检测到端口扫描或拒绝服务流量作为稀疏的点区域。另一个应用是对恶意软件变种进行分组:如果大多数样本按家族聚类,但少数样本不适合任何地方,这些少数样本可能是零日恶意软件。标记噪声的能力意味着安全团队可以专注于调查这些离群点。
> *在网络安全中的用例:* DBSCAN 对于网络流量中的异常检测非常有用。例如正常用户活动可能在特征空间中形成一个或多个密集聚类而新颖的攻击行为则表现为分散的点DBSCAN 将其标记为噪声(离群点)。它已被用于聚类网络流量记录,可以检测到端口扫描或拒绝服务流量作为稀疏的点区域。另一个应用是对恶意软件变种进行分组:如果大多数样本按家族聚类,但少数样本不适合任何地方,这些少数样本可能是零日恶意软件。标记噪声的能力意味着安全团队可以专注于调查这些离群点。
#### 假设和局限性
**假设与优势:** DBSCAN 不假设球形聚类——它可以找到任意形状的聚类(甚至链状或相邻聚类)。它根据数据密度自动确定聚类数量,并能有效地将离群点识别为噪声。这使得它在具有不规则形状和噪声的真实数据中非常强大。它对离群点具有鲁棒性(与 K-Means 不同,后者将其强行归入聚类)。当聚类具有大致均匀的密度时,它表现良好。
**假设与优势:** DBSCAN 不假设球形聚类——它可以找到任意形状的聚类(甚至链状或相邻聚类)。它根据数据密度自动确定聚类数量,并能有效地将离群点识别为噪声。这使得它在具有不规则形状和噪声的真实世界数据中非常强大。它对离群点具有鲁棒性(与 K-Means 不同,后者将其强行归入聚类)。当聚类具有大致均匀的密度时,它表现良好。
**局限性:** DBSCAN 的性能依赖于选择合适的 ε 和 MinPts 值。它可能在具有不同密度的数据上表现不佳——单一的 ε 无法同时适应密集和稀疏的聚类。如果 ε 太小它会将大多数点标记为噪声如果太大聚类可能会错误合并。此外DBSCAN 在非常大的数据集上可能效率低下(天真地为 $O(n^2)$,尽管空间索引可以有所帮助)。在高维特征空间中,“在 ε 内的距离”概念可能变得不那么有意义维度诅咒DBSCAN 可能需要仔细的参数调整,或者可能无法找到直观的聚类。尽管如此,像 HDBSCAN 这样的扩展解决了一些问题(如不同密度)。
@ -150,13 +150,13 @@ num_noise = np.sum(labels == -1)
print(f"DBSCAN found {num_clusters} clusters and {num_noise} noise points")
print("Cluster labels for first 10 points:", labels[:10])
```
在这个片段中,我们调整了 `eps``min_samples` 以适应我们的数据规模(特征单位为 15.0,并且需要 5 个点来形成一个聚类。DBSCAN 应该找到 2 个聚类(正常流量聚类)并将 5 个注入的异常值标记为噪声。我们输出聚类数量与噪声点的对比以验证这一点。在实际设置中,可以通过 ε(使用 k-距离图启发式选择 ε)和 MinPts通常设置为数据维度 + 1 作为经验法则)进行迭代,以找到稳定的聚类结果。显式标记噪声的能力有助于分离潜在攻击数据以进行进一步分析。
在这个片段中,我们调整了 `eps``min_samples` 以适应我们的数据规模(特征单位为 15.0,并且需要 5 个点来形成一个聚类。DBSCAN 应该找到 2 个聚类(正常流量聚类)并将 5 个注入的异常值标记为噪声。我们输出聚类数量与噪声点的对比以验证这一点。在实际设置中,可以对 ε 进行迭代(使用 k-距离图启发式选择 ε)和 MinPts通常设置为数据维度 + 1 作为经验法则)以找到稳定的聚类结果。显式标记噪声的能力有助于分离潜在攻击数据以进行进一步分析。
</details>
### 主成分分析 (PCA)
PCA 是一种 **降维** 技术它找到一组新的正交轴主成分捕捉数据中的最大方差。简单来说PCA 将数据旋转并投影到一个新的坐标系中,使得第一个主成分 (PC1) 解释最大的方差,第二个主成分 (PC2) 解释与 PC1 正交的最大方差依此类推。从数学上讲PCA 计算数据协方差矩阵的特征向量——这些特征向量是主成分方向,相应的特征值指示每个方向解释的方差量。它通常用于特征提取、可视化和噪声减少。
PCA 是一种 **降维** 技术它找到一组新的正交轴主成分捕捉数据中的最大方差。简单来说PCA 将数据旋转并投影到一个新的坐标系中,使得第一个主成分 (PC1) 解释最大的方差,第二个主成分 (PC2) 解释与 PC1 正交的最大方差依此类推。从数学上讲PCA 计算数据协方差矩阵的特征向量——这些特征向量是主成分方向,相应的特征值指示每个主成分解释的方差量。它通常用于特征提取、可视化和噪声减少。
请注意,如果数据集维度包含 **显著的线性依赖或相关性**,这将是有用的。
@ -165,12 +165,12 @@ PCA 通过识别数据的主成分来工作,这些主成分是最大方差的
2. **协方差矩阵**:计算标准化数据的协方差矩阵,以了解特征之间的关系。
3. **特征值分解**:对协方差矩阵进行特征值分解,以获得特征值和特征向量。
4. **选择主成分**:按降序排列特征值,并选择与最大特征值对应的前 K 个特征向量。这些特征向量形成新的特征空间。
5. **转换数据**:使用选的主成分将原始数据投影到新的特征空间。
5. **转换数据**:使用选的主成分将原始数据投影到新的特征空间。
PCA 广泛用于数据可视化、噪声减少,以及作为其他机器学习算法的预处理步骤。它有助于在保留数据基本结构的同时减少数据的维度。
#### 特征值和特征向量
特征值是一个标量,指示其对应特征向量捕获的方差量。特征向量表示特征空间中数据变化最大的方向
特征值是一个标量,指示其对应特征向量捕获的方差量。特征向量表示特征空间中的一个方向,数据在该方向上变化最大。
假设 A 是一个方阵v 是一个非零向量,使得: `A * v = λ * v`
其中:
@ -196,9 +196,9 @@ PCA 广泛用于数据可视化、噪声减少,以及作为其他机器学习
> [!TIP]
> *网络安全中的用例:* PCA 在安全中的一个常见用途是异常检测的特征减少。例如,一个具有 40 多个网络指标(如 NSL-KDD 特征)的入侵检测系统可以使用 PCA 将其减少到少数几个组件以便于可视化或输入聚类算法。分析师可能会在前两个主成分的空间中绘制网络流量以查看攻击是否与正常流量分开。PCA 还可以帮助消除冗余特征(如发送的字节与接收的字节如果它们相关)以使检测算法更强大和更快。
#### 假设和限制
#### 假设和局限性
PCA 假设 **方差的主轴是有意义的**——这是一种线性方法因此它捕捉数据中的线性相关性。它是无监督的因为它仅使用特征协方差。PCA 的优点包括噪声减少(小方差组件通常对应于噪声)和特征的去相关性。对于中等高维度,它在计算上是高效的,并且通常是其他算法的有用预处理步骤(以减轻维度诅咒)。一个限制是 PCA 限于线性关系——它不会捕捉复杂的非线性结构(而自编码器或 t-SNE 可能会。此外PCA 组件在原始特征方面可能难以解释(它们是原始特征的组合)。在网络安全中,必须谨慎:仅在低方差特征中造成微小变化的攻击可能不会出现在前几个主成分中(因为 PCA 优先考虑方差,而不一定是“有趣性”)。
PCA 假设 **方差的主轴是有意义的**——这是一种线性方法因此它捕捉数据中的线性相关性。它是无监督的因为它仅使用特征协方差。PCA 的优点包括噪声减少(小方差组件通常对应于噪声)和特征的去相关性。对于中等高维度,它在计算上是高效的,并且通常是其他算法的有用预处理步骤(以减轻维度诅咒)。一个局限性是 PCA 限于线性关系——它不会捕捉复杂的非线性结构(而自编码器或 t-SNE 可能会。此外PCA 组件在原始特征方面可能难以解释(它们是原始特征的组合)。在网络安全中,必须谨慎:仅在低方差特征中造成微小变化的攻击可能不会出现在前几个主成分中(因为 PCA 优先考虑方差,而不一定是“有趣性”)。
<details>
<summary>示例 -- 降低网络数据的维度
@ -224,11 +224,11 @@ print("Original shape:", data_4d.shape, "Reduced shape:", data_2d.shape)
# We can examine a few transformed points
print("First 5 data points in PCA space:\n", data_2d[:5])
```
在这里,我们将早期的正常流量聚类扩展,每个数据点增加了两个额外特征数据包和错误这些特征与字节和持续时间相关。然后使用PCA将这4个特征压缩为2个主成分。我们打印解释的方差比率这可能显示例如>95%的方差由2个成分捕获意味着信息损失很小。输出还显示数据形状从(1500, 4)减少到(1500, 2)。PCA空间中的前几个点作为示例给出。在实践中可以绘制data_2d以直观检查聚类是否可区分。如果存在异常可能会看到它作为一个位于PCA空间主聚类之外的点。因此PCA有助于将复杂数据提炼为可供人类解释或作为其他算法输入的可管理形式。
在这里我们将早期的正常流量聚类扩展每个数据点增加了两个额外特征数据包和错误这些特征与字节和持续时间相关。然后使用PCA将这4个特征压缩为2个主成分。我们打印解释的方差比率这可能显示例如>95%的方差由2个成分捕获意味着信息损失很小。输出还显示数据形状从(1500, 4)减少到(1500, 2)。PCA空间中的前几个点作为示例给出。在实践中可以绘制data_2d以直观检查聚类是否可区分。如果存在异常可能会看到它作为一个位于PCA空间主聚类之外的点。因此PCA有助于将复杂数据提炼为可供人类解释或作为其他算法输入的可管理形式。
### 高斯混合模型 (GMM)
高斯混合模型假设数据是由**几个具有未知参数的高斯(正态)分布的混合生成的**。本质上,它是一种概率聚类模型:它试图将每个点软性分配给K个高斯成分之一。每个高斯成分k具有均值向量μ_k、协方差矩阵Σ_k和混合权重π_k表示该聚类的普遍性。与K-Means进行“硬”分配不同GMM为每个点提供属于每个聚类的概率。
高斯混合模型假设数据是由**几个具有未知参数的高斯(正态)分布的混合生成的**。本质上它是一种概率聚类模型它试图将每个点软性分配给K个高斯成分之一。每个高斯成分k都有一个均值向量μ_k、协方差矩阵Σ_k一个混合权重π_k表示该聚类的普遍性。与K-Means进行“硬”分配不同GMM为每个点提供属于每个聚类的概率。
GMM拟合通常通过期望最大化EM算法完成
@ -256,7 +256,7 @@ r_{nk} = \frac{\pi_k \mathcal{N}(x_n | \mu_k, \Sigma_k)}{\sum_{j=1}^{K} \pi_j \m
#### 假设和限制
GMM是K-Means的推广结合了协方差因此聚类可以是椭球形的不仅仅是球形。如果协方差是完整的它可以处理不同大小和形状的聚类。当聚类边界模糊时软聚类是一优势——例如在网络安全中一个事件可能具有多种攻击类型的特征GMM可以通过概率反映这种不确定性。GMM还提供了数据的概率密度估计有助于检测离群值在所有混合成分下似然性低的点
GMM是K-Means的推广结合了协方差因此聚类可以是椭球形的不仅仅是球形。如果协方差是完整的它可以处理不同大小和形状的聚类。当聚类边界模糊时软聚类是一优势——例如在网络安全中一个事件可能具有多种攻击类型的特征GMM可以通过概率反映这种不确定性。GMM还提供了数据的概率密度估计有助于检测离群值在所有混合成分下似然性低的点
缺点是GMM需要指定成分数量K尽管可以使用BIC/AIC等标准来选择。EM有时可能收敛缓慢或达到局部最优因此初始化很重要通常多次运行EM。如果数据实际上不遵循高斯混合模型可能不适合。还有一个风险是一个高斯收缩到仅覆盖一个离群值尽管正则化或最小协方差界限可以缓解这一点
@ -287,16 +287,16 @@ print("Log-likelihood of sample attack under GMM:", log_likelihood)
**隔离森林**是一种基于随机隔离点思想的集成异常检测算法。其原理是异常点数量少且不同,因此比正常点更容易被隔离。隔离森林构建许多二叉隔离树(随机决策树),随机划分数据。在树的每个节点,选择一个随机特征,并在该特征的最小值和最大值之间选择一个随机分割值。这个分割将数据分为两个分支。树的生长直到每个点在自己的叶子中被隔离,或者达到最大树高。
通过观察每个点在这些随机树中的路径长度来执行异常检测——隔离该点所需的分割次数。直观上,异常点(离群点)往往被更快地隔离,因为随机分割更可能将离群点(位于稀疏区域)与密集聚类中的正常点分开。隔离森林从所有树的平均路径长度计算异常分数:平均路径越短→越异常。分数通常归一化到[0,1]其中1表示非常可能是异常。
通过观察每个点在这些随机树中的路径长度来执行异常检测——隔离该点所需的分割次数。直观上,异常点(离群点)往往更快被隔离,因为随机分割更可能将离群点(位于稀疏区域)与密集聚类中的正常点分开。隔离森林从所有树的平均路径长度计算异常分数:平均路径越短→越异常。分数通常归一化到[0,1]其中1表示非常可能是异常。
> [!TIP]
> *网络安全中的用例:* 隔离森林已成功用于入侵检测和欺诈检测。例如在主要包含正常行为的网络流量日志上训练一个隔离森林该森林将为奇怪的流量如使用不常见端口的IP或不寻常的数据包大小模式生成短路径标记其进行检查。因为它不需要标记攻击所以适合检测未知攻击类型。它还可以部署在用户登录数据上以检测账户接管异常的登录时间或地点会迅速被隔离。在一个用例中隔离森林可能通过监控系统指标并在一组指标CPU、网络、文件更改的组合与历史模式看起来非常不同短隔离路径时生成警报从而保护企业。
#### 假设和局限性
#### 假设和限制
**优点**:隔离森林不需要分布假设;它直接针对隔离。它在高维数据和大数据集上效率高(构建森林的线性复杂度为$O(n\log n)$),因为每棵树仅使用部分特征和分割来隔离点。它通常能很好地处理数值特征,并且比基于距离的方法(可能是$O(n^2)$)更快。它还自动给出异常分数,因此您可以设置警报的阈值(或使用污染参数根据预期的异常比例自动决定截止点)。
**优点**:隔离森林不需要分布假设;它直接针对隔离。它在高维数据和大数据集上效率高(构建森林的线性复杂度为$O(n\log n)$),因为每棵树仅使用特征的子集和分割来隔离点。它通常能很好地处理数值特征,并且比基于距离的方法更快,后者可能是$O(n^2)$。它还自动给出异常分数,因此您可以设置警报的阈值(或使用污染参数根据预期的异常比例自动决定截止点)。
**局限性**:由于其随机特性,结果在不同运行之间可能略有不同(尽管树的数量足够多时,这种差异很小)。如果数据有很多无关特征,或者异常在任何特征上没有明显区分,隔离可能效果不佳(随机分割可能偶然隔离正常点——然而,平均许多树可以减轻这一点)。此外,隔离森林通常假设异常是少数(这在网络安全场景中通常是正确的)。
**限制**:由于其随机特性,结果在不同运行之间可能略有不同(尽管树的数量足够多时,这种差异很小)。如果数据有很多无关特征,或者异常在任何特征上没有明显区分,隔离可能效果不佳(随机分割可能偶然隔离正常点——然而,平均许多树可以减轻这一点)。此外,隔离森林通常假设异常是少数(这在网络安全场景中通常是正确的)。
<details>
<summary>示例 -- 检测网络日志中的离群点
@ -318,9 +318,9 @@ print("Isolation Forest predicted labels (first 20):", preds[:20])
print("Number of anomalies detected:", np.sum(preds == -1))
print("Example anomaly scores (lower means more anomalous):", anomaly_scores[:5])
```
在这段代码中我们用100棵树实例化了`IsolationForest`并设置`contamination=0.15`这意味着我们预计大约有15%的异常;模型将设置其分数阈值,以便~15%的点被标记)。我们在包含正常和攻击点混合的`X_test_if`上进行拟合(注意:通常你会在训练数据上进行拟合,然后在新数据上使用预测,但这里为了说明我们在同一组上进行拟合和预测,以直接观察结果)。
在这段代码中我们用100棵树实例化了`IsolationForest`并设置`contamination=0.15`这意味着我们预计大约有15%的异常;模型将设置其分数阈值,使得~15%的点被标记)。我们在包含正常和攻击点混合的`X_test_if`上进行拟合(注意:通常你会在训练数据上进行拟合,然后在新数据上使用预测,但这里为了说明我们在同一组上进行拟合和预测,以直接观察结果)。
输出显示了前20个点的预测标签其中-1表示异常。我们还打印了总共检测到的异常数量和一些示例异常分数。我们预计大约120个点中有18个会被标记为-1因为污染率为15%。如果我们的20个攻击样本确实是最偏离的大多数应该出现在这些-1预测中。异常分数Isolation Forest的决策函数对于正常点较高对于异常点较低更负——我们打印了一些值以查看分离。在实践中人们可能会按分数对数据进行排序以查看顶级异常并进行调查。因此Isolation Forest提供了一种有效的方法来筛选大量未标记的安全数据并挑选出最不规则的实例以供人工分析或进一步的自动审查。
输出显示了前20个点的预测标签其中-1表示异常。我们还打印了总共检测到多少个异常以及一些示例异常分数。我们预计大约120个点中有18个会被标记为-1因为污染率为15%。如果我们的20个攻击样本确实是最偏离的大多数应该出现在这些-1预测中。异常分数Isolation Forest的决策函数对于正常点较高对于异常点较低更负——我们打印了一些值以查看分离。在实践中人们可能会按分数对数据进行排序以查看顶级异常并进行调查。因此Isolation Forest提供了一种有效的方法来筛选大量未标记的安全数据并挑选出最不规则的实例以供人工分析或进一步的自动审查。
### t-SNE (t-分布随机邻域嵌入)