Menu
CoddyTech

Находим необычные цифры

Часть раздела Обучение без учителя путешествия по Machine Learning на Coddy. Урок 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 пикселя.

challenge icon

Задание

Средне

Финал. В стартовом коде уже есть всё, что мы использовали до сих пор, а также guess — название кластера для каждого изображения.

  1. Обучи лес изоляции на X_small (contamination=0.02, random_state=0). Выведи, сколько изображений он помечает, какая цифра помечается чаще всего и для скольких из них название кластера указано верно.
  2. Нарисуй 10 самых необычных изображений, начиная с самого необычного: галерею 2 на 5 в gray_r, с цифрами в заголовках.

При 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

Галерея самых обычных семёрок выглядит так:

Десять написанных от руки семёрок в галерее 2 на 5, каждая подписана цифрой 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

# Из раздела «Рассмотрите цифры»: 1,797 изображений по 64 пикселя, интенсивность от 0 до 16
digits = load_digits()
X = digits.data
y = digits.target

# Из раздела «Сократите размерность с помощью PCA»: 80% дисперсии в 13 числах на изображение
pca = PCA(n_components=0.8)
X_small = pca.fit_transform(X)

# Из раздела «Сгруппируйте цифры»: 10 кластеров, найденных без меток
km = KMeans(n_clusters=10, n_init=10, random_state=0).fit(X_small)

# Из раздела «Назовите кластеры»: цифра, в честь которой назван кластер каждого изображения (79.2% совпадений с y)
names = pd.crosstab(km.labels_, y).idxmax(axis=1)
guess = names.to_numpy()[km.labels_]

# Напишите свой код ниже
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Обучение без учителя

Потренируйтесь самостоятельно: Онлайн-компилятор Python