それでは早速、Pythonとscikit-learnを使ってK近傍法を実装していきます。また、前提状況として、Pythonとそのライブラリーそしてユリのデータがインストールされているものとしています。まだ、実装・インストールを行われていない方は、以下の2つの関連記事を参照して、行ってください。
データをトレーニングデータとテストデータの分離する
機械学習を構築するためには、得られたデータを2つ(場合によっては3つに)に分離して、1つ目のデータで学習を行い、2つの目のデータでその検証を行うのが一般的です。また、学習に使ったデータを検証の目的で再度使用することはできません(検証のために使うデータは新しいデータでなければならない。)ので2つのデータ間での重複は許されません。
それでは、scikit-learnの「train_test_split」を使ってユリのデータを分離しよう。

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

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

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

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

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

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

実行後、上記の結果が出力されるはずです。この出力は、新たに作ったX_newのデータの花を持っているユリは「setosa」という品種であるとK近傍法のアルゴリズムが推測していることを意味しています。
K近傍法によって得られた結果の確からしさを検証する
それでは最後にトレーニングデータで学習したK近傍法のアルゴリズムが、テストデータを使った時、どれだけ正しい確率で推測できるかを検証します。

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

問題なければ、上記のような出力があります。ここで、Test set predictionsはここのテストデータをもとにK近傍法のアルゴリズムが推測したユリの品種を示し、Test set scoreがその正確さを示しています。つまり我々のアルゴリズムは97%の確率で正しい回答を出したことを示しています。
まとめ
いかがでしたでしょうか。かなり駆け足で実装してきたので、内容を理解されていない方もおられるかと思います。詳しい解説については後ほど、オイオイしていく予定にしております。この時点で認識していただきたいことは、ごく初歩的ではありますが、みなさんのコンキュータの中に機械学習のアルゴリズムが1つ実装されて、正常に作動しているといった事実です。本来であれば、かなりの量の作業を行わなければ、初歩的といえども実装することはできません。ひとえにPythonとScikit-Learnのおかげ、こんなに簡単に実装できました。
また、本記事はAndreas C. Muller氏とSarah Guido氏による「Introduction to Machine Learning with Python」を参考にしています。
それでは、最後までお付き合いありがとうございました。それでは、さようなら。
コメント