変わった数字を見つけよう
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
# 数字を見てみようより:64ピクセルのスキャン画像が1,797枚、インクの濃さは0から16
digits = load_digits()
X = digits.data
y = digits.target
# PCAで縮小しようより:各スキャン画像を13個の数値で表し、分散の80%を保持
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_]
# 以下にコードを書いてください
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
教師なし学習のすべてのレッスン
自分で練習してみよう: Pythonオンラインコンパイラ