// // //

【初めての機械学習】Pythonとscikit-learnを使ってK近傍法を実装

kNN_00 Programming
kNN_00
この記事は約5分で読めます。

それでは早速、Pythonscikit-learnを使ってK近傍法を実装していきます。また、前提状況として、Pythonとそのライブラリーそしてユリのデータがインストールされているものとしています。まだ、実装・インストールを行われていない方は、以下の2つの関連記事を参照して、行ってください。

機械学習・深層学習の第一歩【Python】を実装しよう!

初めての機械学習【ライブラリーとデータの登録】

データをトレーニングデータとテストデータの分離する

機械学習を構築するためには、得られたデータを2つ(場合によっては3つに)に分離して、1つ目のデータで学習を行い、2つの目のデータでその検証を行うのが一般的です。また、学習に使ったデータを検証の目的で再度使用することはできません(検証のために使うデータは新しいデータでなければならない。)ので2つのデータ間での重複は許されません
それでは、scikit-learnの「train_test_split」を使ってユリのデータを分離しよう。

kNN_01
kNN_01

上記のコードによって、「train_test_split」ファンクションをscikit-learnから呼び出し、ユリのデータをシャッフルしたのち、75%をトレーニングデータに残りの25%をテストデータに割り当てて分離します。ここで、トレーニングデータの dataはX_trainに、targetはy_trainに、テストデータのdataはX_testに、テストデータのtargetはy_testに代入されます。ここでXは大文字、yは小文字が使われていることに注意してください。

データの内容を確認する

それでは、train_test_splitで作成したトレーニングデータとテストデータの構造を見てみましょう。

kNN_02
kNN_02

上記のコードを実行すると、以下の結果が得られ、トレーニング・テストのdataには4つの要素を持ったデータが、targetには1つの要素を持ったデータが代入されており、トレーニングデータは112個、テストデータは38個作成されており、デフォルトの設定通り、75%と25%に’分けられているのが分かります。

kNN_03
kNN_03

K近傍法を実装する

それでは、次にK近傍法の実装を行います。K近傍法の実装を行うということは、K近傍法のアルゴリズムに先ほど作ったトレーシングデータを使って学習させることを意味します。ここでも、scikit-learnにはK近傍法のアルゴリズムやそれを学習させるコマンドがすでに用意されているので、あとはそれらを使って進めていくだけです

それでは、具体的にscikit-learnからK近傍法のアルゴリズムを呼び出して、パラメータに1を指定しましょう。このパラメータに最も近い学習データを1つだけ参照するというイムです。興味がある方は1以外の数字でも試してみてください。また、基本的に多数決を行いますので、奇数を使うのがコツです。それでは以下のコードを作成して、実行してください。

kNN_04
kNN_04

それでは、呼び出したK近傍法のアルゴリズムをトレーニングデータを使って学習させましょう。以下のコードを作成して、In [22]の後の1行のコードを作成して実行させてください。

kNN_05
kNN_05

実行後、 Out[22]以下の結果が出力されれば作業は正常に行われています。

K近傍法を使って結果を予測する

それでは、X_newという新しいデータを作って、このデータはどのtargetつまりユリのどの品種に属するのか、作ったばかりのK近傍法のアルゴリズムに推測させましょう。ここでは、X_newのデータは「5, 2.9, 1, 0.2]つまり、花の花弁とがく片のサイズ(長さと幅)がそれぞれの数値(cm)であることを示しています。つまりこのサイズの花弁とがく片を持つユリがどの品種かを推測するのが、今回のお題です。

kNN_06
kNN_06

上記のコードを作成して実行してください。

kNN_07
kNN_07

実行後、上記の結果が出力されるはずです。この出力は、新たに作ったX_newのデータの花を持っているユリは「setosa」という品種であるとK近傍法のアルゴリズムが推測していることを意味しています。

K近傍法によって得られた結果の確からしさを検証する

それでは最後にトレーニングデータで学習したK近傍法のアルゴリズムが、テストデータを使った時、どれだけ正しい確率で推測できるかを検証します。

kNN_08
kNN_08

上記のコードを作成して実行します。

kNN_09
kNN_09

問題なければ、上記のような出力があります。ここで、Test set predictionsはここのテストデータをもとにK近傍法のアルゴリズムが推測したユリの品種を示し、Test set scoreがその正確さを示しています。つまり我々のアルゴリズムは97%の確率で正しい回答を出したことを示しています。

まとめ

いかがでしたでしょうか。かなり駆け足で実装してきたので、内容を理解されていない方もおられるかと思います。詳しい解説については後ほど、オイオイしていく予定にしております。この時点で認識していただきたいことは、ごく初歩的ではありますが、みなさんのコンキュータの中に機械学習のアルゴリズムが1つ実装されて、正常に作動しているといった事実です。本来であれば、かなりの量の作業を行わなければ、初歩的といえども実装することはできません。ひとえにPythonとScikit-Learnのおかげ、こんなに簡単に実装できました

また、本記事はAndreas C. Muller氏とSarah Guido氏による「Introduction to Machine Learning with Python」を参考にしています。
それでは、最後までお付き合いありがとうございました。それでは、さようなら。

コメント