見出し画像

k-最近傍法の解説と実践

こんにちは、コグラフ株式会社データアナリティクス事業部の平松です。
今回は機械学習の教師あり学習であるk-最近傍法についてコードを用いて解説します。

これから機械学習を学び始めようという方、初心者の方は是非、御一読ください!


k-近傍法とは

特徴空間における最も近い訓練例に基づいた分類の手法であり、
分類アルゴリズムとして使用され、類似したポイントが相互に近接して存在するという前提に基づいています。パターン認識でよく使われます。

実行のされ方は、特徴空間のユークリッド距離 で最も近い点を探索する「 最近傍探索問題 」に基づいておこなわれます。
ユークリッド距離の計算式は以下の通りです。

特に難しいことはやっておらず、それぞれ対応する点同士の二乗の総和の平方根です。
統計学を学んでいる方はピンとくるものがあるのではないでしょうか?
グラフにするこのような感じです。

機械学習入門でk-近傍法を学ぶべき理由

機械学習を学ぶ順番は、教師あり学習→半教師あり学習→教師なし学習が最もノーマルで習得がスムーズといわれています。
中でも「k近傍法」は、機械学習の「教師あり学習」の中で、最も簡単なアルゴリズムの一つといわれています。
機械学習を学び始めるときの最初の壁でしょう。
ドラクエで例えるならドラゴンや、ゴーレムといったところでしょうか(笑)
一緒に超えて大量の経験値を得てレベルアップしていきましょう!

k-近傍法の解説

ライブラリ等のインポート

まず必要なライブラリやパッケージをインポートしていきます。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import mglearn
from sklearn.datasets import load_iris

Pandas、NumPy、Matplotlibをインポートします。

mglearnとは、コードを読みやすくするためのライブラリのことで、「Pythonではじめる機械学習」の著者が作成したものです。

「sklearn.datasets import load_iris」のデータセットは、ロナルド・エイルマー・フィッシャー(Ronald Aylmer Fisher)が論文で使用したものです。
インポートするだけですぐに実装できる状態にデータが整理されているので、前処理は不要です。

データの分割

分割する理由としては、モデルを構築するのに使用したデータは、モデルの評価の際に使用してはいけないからです。
訓練データををもとに作成しているので、訓練データをモデルに当てはめたら精度が確実に100%になります。丸暗記している状態と変わらないからです。
よって、元データを訓練データとテストデータに分割します。

#テストデータ・トレーニングデータに分割、データセットの定義

from sklearn.model_selection import train_test_split

iris_dataset = load_iris()
X_train, X_test, y_train, y_test = train_test_split(iris_dataset['data'],iris_dataset['target'],random_state=0) 

「from sklearn.model_selection import train_test_split」のtrain_test_splitは、データをランダムに、設定した割合で分割できる関数です。

データ検査

機械学習モデルを構築する前に必ずデータ検査が必要です。
なぜなら、機械学習を用いなくても解決できる問題の可能性や、cmとインチ、分と時間など単一の尺度で表記されていない場合があるからです。

データを検査する最良の方法は、可視化です。

#機械学習をする前のデータ検査

from pandas.plotting import scatter_matrix

iris_dataframe = pd.DataFrame(X_train, columns=iris_dataset.feature_names)
graph = scatter_matrix(iris_dataframe, c=y_train, figsize=(15, 15), marker='o',hist_kwds={'bins':20}, s=60, alpha=.8, cmap=mglearn.cm3)
graph = scatter_matrix(iris_dataframe, c=y_train, hist_kwds={'bins':20}, s=60, alpha=.8, cmap=mglearn.cm3)
print(graph)
plt.show()

まずは分割したデータをPandasのdataframeに変換します。
次に可視化します。

scatter_matrixは、Pandasのプロット機能を使用して、データフレーム内の数値列の間で散布図行列(scatter matrix)を作成するための関数です。

k-最近傍法

k-最近傍法は分類モデルです。
新しいデータモデルに対して予測する際、新しい点に最も近い点を訓練データから探し、そのラベルを新しいデータポイントに付与します。

#k-最近傍法

from sklearn.neighbors import KNeighborsClassifier

knn = KNeighborsClassifier(n_neighbors=1)
knn = knn.fit(X_train, y_train)
print(knn)

k-最近傍法のライブラリをインストールし、実装します。

fit()はモデルの学習を実行するメソッドです。 引数に訓練データを渡すことで学習してくれます。

作成したデータの予測

#作成したデータの予測

X_new = np.array([[5, 2.9, 1, 0.2]])
prediction = knn.predict(X_new)
print(prediction)
print(iris_dataset['target_names'][prediction])

予測したいデータは、「X_new」です。
この時、データは「2次元numpy配列」です。
数学では「行列」といい、scikit-learnではこの形を前提としてます。

predict()は学習したデータから結果を予測するメソッドです。

テストデータの予測

最初に分割したデータの片方であるテストデータを予測します。

#テストデータの予測

y_pred = knn.predict(X_test)
print(y_pred)

上記、作成したデータと同様、predict()メソッドで予測を行います。

評価(テストデータ)

どのくらいテストデータが正しくラベル付けされているか評価を行います。

score = knn.score(X_test, y_test)
print(score)

score()メソッドは精度を計算してくれる。
この場合、引数にテストデータを渡すことで、テストデータの精度を計測してくれます。

データ分析に興味のある方募集中!

コグラフ株式会社データアナリティクス事業部ではPythonやSQLの研修を行った後、実務に着手します。
研修内容の充実はもちろん、経験者に相談できる環境が備わっています。
このようにコグラフの研修には、実務を想定し着実にスキルアップを目指す環境があります。
興味がある方は、下記リンクよりお問い合わせください。


Twitterもやってます!

コグラフデータ事業部ではTwitterでも情報を発信しています。
データ分析に興味がある、データアナリストになりたい人など、ぜひフォローお願いします!


この記事が参加している募集

#AIとやってみた

27,336件

この記事が気に入ったらサポートをしてみませんか?