LoginSignup
0
0

クラスタリングでラベリングして分類

Posted at

クラスタリングは教師なし学習の中で集合に対してラベリング処理を行います。
そこで、クラスタリングの結果をクラスとして、それを元に教師あり学習をやってみようという原始的なアノテーションをやってみます。

関数

from sklearn import preprocessing
import matplotlib.pyplot as plt
import numpy as np
def showline_clf(x, y, model, modelname, x0="x0", x1="x1"):
    fig, ax = plt.subplots(figsize=(8, 6))
    X, Y = np.meshgrid(np.linspace(*ax.get_xlim(), 1000), np.linspace(*ax.get_ylim(), 1000))
    XY = np.column_stack([X.ravel(), Y.ravel()])
    x = preprocessing.minmax_scale(x)
    model.fit(x, y)
    Z = model.predict(XY).reshape(X.shape)
    plt.contourf(X, Y, Z, alpha=0.1, cmap="brg")
    plt.scatter(x[:, 0], x[:, 1], c=y, cmap="brg")
    plt.xlim(min(x[:, 0]), max(x[:, 0]))
    plt.ylim(min(x[:, 1]), max(x[:, 1]))
    plt.title(modelname)
    plt.colorbar()
    plt.xlabel(x0)
    plt.ylabel(x1)
    plt.show()

プログラム

クラスタリング

ライブラリのインポート

from sklearn.datasets import make_blobs
from sklearn.svm import SVC
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt

アノテーションされていないデータを可視化

x, y = make_blobs(n_samples=300, centers=4, random_state=0, cluster_std=1.0)
plt.scatter(x[:, 0], x[:, 1])
plt.show()

Untitled.png
centerを4と設定している事は一旦置いといて、とりあえず4つ集合があるように見えますね。

k-means法で4つラベリング

km = KMeans(n_clusters=4)
km.fit(x)
y_pred = km.predict(x)
plt.scatter(x[:, 0], x[:, 1], c=y_pred, cmap="brg")
plt.show()

Untitled.png

データにラベリングされました。

SVMで分類

svm = SVC(kernel="linear")
svm.fit(x, y_pred)
showline_clf(x, y_pred, svm, "K-means -> SVM", x0="x0", x1="x1")

Untitled.png

これによって次回からはSVMを使って随時新しいデータが出た場合は分類すれば大丈夫になりました。

ただし

ただしこれが正しいアノテーションとは限りませんのでそこは疑いましょう。あくまでもクラスタリングの使い道の一つに過ぎません。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0