クラスタリングは教師なし学習の中で集合に対してラベリング処理を行います。
そこで、クラスタリングの結果をクラスとして、それを元に教師あり学習をやってみようという原始的なアノテーションをやってみます。
関数
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()
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()
データにラベリングされました。
SVMで分類
svm = SVC(kernel="linear")
svm.fit(x, y_pred)
showline_clf(x, y_pred, svm, "K-means -> SVM", x0="x0", x1="x1")
これによって次回からはSVMを使って随時新しいデータが出た場合は分類すれば大丈夫になりました。
ただし
ただしこれが正しいアノテーションとは限りませんのでそこは疑いましょう。あくまでもクラスタリングの使い道の一つに過ぎません。