機械学習ノート(アヤメ vol.2)

前回はscikit-learnに付属するアヤメのデータを使って、ちょっとしたデータの分析を行いました。

今回は機械学習のアルゴリズムを使っていきます。

機械学習においては訓練と評価のプロセスがありますが、絶対にはやってはいけないのは訓練と評価を同じデータで行ってしまうことです。

機械学習の訓練においては、いかに汎化性能と呼ばれる一般的な精度を引き上げるかがポイントであり、特定のデータだけで高い精度を出せるようにしても意味がありません。

当たり前のように聞こえるかもしれませんが、いかにいい感じの訓練データと評価データを作るかが意外と難しかったりします。

# 訓練データと評価データを作成するための関数をインポート
from sklearn.model_selection import train_test_split

# 75%:25%の割合で訓練データと評価データを生成。
# 乱数のシードを固定化するための、random_stateを設定。
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=0)

# 今回はシンプルなアルゴリズムであるkNNを使う。
from sklearn.neighbors import KNeighborsClassifier
model = KNeighborsClassifier(n_neighbors=1)

ここまでが下準備で、実際に訓練してみます。

model.fit(X_train, y_train)

これだけです。拍子抜けするほど簡単です。

kNN(最近傍探索)は単純なアルゴリズムとは言え、自前で実装しようとするとそれなりに大変ですが、scikit-learnというライブラリが誕生したことで、機械学習のハードルはグッと下がりました。

ちなみにkNNは与えられたデータに対して、訓練データとの類似度を一つずつ計算し、上位のもののデータを使って分類します。

このアルゴリズムは分かりやすいですが、訓練データが増えると、それに比例して計算時間も増えてしまいます。

その問題を解消するために「近似最近傍探索」というアルゴリズムが誕生しました。こちらも既にライブラリが提供されており、Pythonでインポートすればすぐに使えるようになります。

近似最近傍探索は画像検索など色々な場面で使えるので、またどこかのタイミングで深掘りできればなと思います。

さて、訓練したモデルを使って評価データを評価してみます。

print(model.score(X_test, y_test))

この結果は「0.9736842105263158」となり、約97%の精度となります!

全体の流れとしてはこのようになります。

もちろん実際の機械学習の現場ではもっともっと色々なことをやりますが、それは次の機会に紹介できればと思います。