找出异常项
本课属于 Coddy Machine Learning 学习旅程的“无监督学习”单元。第 47 课,共 51 课。
最后一个问题:哪些扫描图像是异常值?隔离森林会为每张扫描图像评分,分数越低,就越奇怪。先看分数最高、最普通的图像:
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 个像素。
挑战
中等最后一关。起始代码包含了目前为止的所有内容,以及 guess,也就是每张扫描图像所属簇的名称。
- 在
X_small上拟合一个孤立森林(contamination=0.02,random_state=0)。打印它标记出的数量、最常被标记的数字,以及其中有多少张扫描图像的簇名称正确。 - 绘制最奇特的 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 的图集如下所示:
你的图集展示的是最奇特的扫描图像。簇为全部扫描图像正确命名的比例是 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_]
# 在下方编写你的代码
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
无监督学习中的所有课
自己练习: Python 在线编译器