Menu
CoddyTech

找出异常项

本课属于 Coddy Machine Learning 学习旅程的“无监督学习”单元。第 47 课,共 51 课。

最后一个问题:哪些扫描图像是异常值?隔离森林会为每张扫描图像评分,分数越低,就越奇怪。先看分数最高、最普通的图像:

两排共 10 张整洁的手写扫描图像,是这组图像中最普通的:5 个圆圆的 0,3 个 9,一个 8 和一个 2

iso = IsolationForest(contamination=0.02, random_state=0)
flags = iso.fit_predict(X_small)
scores = iso.score_samples(X_small)
typical = np.argsort(scores)[::-1][:10]

np.argsort 会按分数从低到高列出行号,因此反转后,最普通的样本会排在最前面。用 X 显示它们:全部 64 个像素。

challenge icon

挑战

中等

最后一关。起始代码包含了目前为止的所有内容,以及 guess,也就是每张扫描图像所属簇的名称。

  1. 在 X_small 上拟合一个孤立森林(contamination=0.02,random_state=0)。打印它标记出的数量、最常被标记的数字,以及其中有多少张扫描图像的簇名称正确。
  2. 绘制最奇特的 10 张扫描图像,按奇特程度从高到低排列:用 gray_r 绘制成 2 行 5 列的图集,并以对应的数字作为标题。

使用 contamination=0.01 时:

Flagged as odd: 18 of 1797 scans
Most often odd: 7 (10 scans)
Named right by their cluster: 11 of 18 odd scans

最普通的 7 的图集如下所示:

2 行 5 列图集中的 10 个手写 7,每个标题都是 7,看起来都一样:一条顶横线、一条短横线和一笔向下的笔画

你的图集展示的是最奇特的扫描图像。簇为全部扫描图像正确命名的比例是 79.2%:这些奇特的图像表现如何?你探索了 1,797 张扫描图像,而且从未使用标签进行训练。

亲手试试

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_digits
from sklearn.decomposition import PCA
from sklearn.cluster import KMeans
from sklearn.ensemble import IsolationForest

# 来自 Look at the Digits:1,797 张扫描图,每张有 64 个像素,墨迹值从 0 到 16
digits = load_digits()
X = digits.data
y = digits.target

# 来自 Shrink with PCA:每张扫描图用 13 个数字保留 80% 的方差
pca = PCA(n_components=0.8)
X_small = pca.fit_transform(X)

# 来自 Cluster the Digits:不使用标签,找出 10 个簇
km = KMeans(n_clusters=10, n_init=10, random_state=0).fit(X_small)

# 来自 Name the Clusters:每张扫描图所属的簇以一个数字命名(79.2% 与 y 一致)
names = pd.crosstab(km.labels_, y).idxmax(axis=1)
guess = names.to_numpy()[km.labels_]

# 在下方编写你的代码
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

无监督学习中的所有课

自己练习: Python 在线编译器