ろきろぐ

NFT、投資、テクノロジー、農業等を書きなぐるチラシの裏

Pythonではじめる機械学習 [part.2]

今日も今日とて昨日の続きです. www.oreilly.co.jp

k-最近傍法

本日はk-最近傍法について.

k-最近傍法の識別器を使い,forgeデータを識別してみる.

kNeighborClassifierをsklearnで呼び出し,1最近傍法,3最近傍法,9最近傍法で 分類した場合の違いを確認する.

import mglearn
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier

X, y = mglearn.datasets.make_forge()

# データセットを分割
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)

# 識別器の生成
clf = KNeighborsClassifier(n_neighbors=3)

# 識別器の訓練
clf.fit(X_train, y_train)

# KNeighborsClassifierの解析
fig, axes = plt.subplots(1, 3, figsize=(10, 3))

for n_neighbors, ax in zip([1, 3, 9], axes):
    clf = KNeighborsClassifier(n_neighbors=n_neighbors).fit(X, y)
    mglearn.plots.plot_2d_separator(clf, X, fill=True, eps=0.5, ax=ax, alpha=.4)
    mglearn.discrete_scatter(X[:, 0], X[:, 1], y, ax=ax)
    ax.set_title("{} neighbors(s)".format(n_neighbors))
    ax.set_xlabel("feature 0")
    ax.set_ylabel("feature 1")
axes[0].legend(loc=3)


# 結果表示
print("Test set predictions:{}".format(clf.predict(X_test)))
print("Test set accuracy:{:.2f}".format(clf.score(X_test, y_test)))

# 判例
plt.legend(["Class 0", "Class 1"], loc=4)
plt.xlabel("First feature")
plt.ylabel("Second feature")
print("X.shape: {}".format(X.shape))

# グラフ化
mglearn.plots.plot_knn_classification(n_neighbors=3)
plt.plot()
plt.savefig("image.png")

plt.show()

結果は以下.
f:id:roki_ex:20180927013120p:plain

これにより,近傍数による違いがわかる. つまり,k-最近傍法では,

  • 近傍数が小さいほど訓練データに近い決定境界[細かい]

  • 近傍数が大きいほど訓練データを滑らかにした決定境界[荒い]

ということができるわけだ.



これらから,k-最近傍法は下記が言える.

メリット:了解性が高い

最も距離が近いクラスとして分類するため,理解が容易

デメリット:速度が遅い&疎なデータの性能が悪い

属性数が多くなると決定境界を判断するために,計算量が多くなる

ただ,デメリットが大きいため基本の分類手法だが,使っている人は少ないとのこと.

なるほど.



ちなみに,

mglearn.plots.plot_2d_separator(clf, X, fill=True, eps=0.5, ax=ax, alpha=.4)

この箇所の意味がイマイチわかってない・・・

では.