今日も今日とて昨日の続きです. 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()
結果は以下.
これにより,近傍数による違いがわかる. つまり,k-最近傍法では,
近傍数が小さいほど訓練データに近い決定境界[細かい]
近傍数が大きいほど訓練データを滑らかにした決定境界[荒い]
ということができるわけだ.
これらから,k-最近傍法は下記が言える.
メリット:了解性が高い
最も距離が近いクラスとして分類するため,理解が容易
デメリット:速度が遅い&疎なデータの性能が悪い
属性数が多くなると決定境界を判断するために,計算量が多くなる
ただ,デメリットが大きいため基本の分類手法だが,使っている人は少ないとのこと.
なるほど.
ちなみに,
mglearn.plots.plot_2d_separator(clf, X, fill=True, eps=0.5, ax=ax, alpha=.4)
この箇所の意味がイマイチわかってない・・・
では.