実践型AIプログラミング特講 #7

実践型AIプログラミング特講 #7

今回は本格的な機械学習を学ぶにあたり下準備として分類問題に皆様にはサンプルプログラムを通してトライしていただこうと考えております。プログラミングは初学者には敷居が高く、気負うこともあるかもしれませんが誰でも感覚的に理解できるよう本記事を編集したのでそんなプログラミング初心者の方にも段階的に学べるコンテンツになっているかと思います。また中級者の方はサンプルプログラムを元に自身が実装しやすいよう改修していただいても構いません。上級者の方はサンプルを参考に新しいアルゴリズムの構築や分類したいものを実際に変数として入れてみても面白いかもしれませんね。

機械学習入門一番簡単な機械学習を実践しよう

機械学習を実践してみましょう。最初に、機械学習のフレームワークである「scikit-learn」について学び、その後、AND演算を機械学習させてみます。それにより、機械学習の基本的な流れを学ぶことができます。

scikit-learn KIについて

『scikit-learn(サイキット·ラーン)』は Python 向けの機械学習フレームワークの定番です。

scikit-learn のWeb サイト[URL] https://scikit-learn.org/scikit-learn

には以下のような特徴があります。・学習で使われるさまざまなアルゴリズムに対応している・すぐに機械学習を試すことができるようにサンプルデータが含まれている・機械学習の結果を検証する機能を持っている・機械学習でよく使われる他のライブラリー(「Pandas」「NumPy」「Scipy」「Matplotlib」など)との親和性が高い・BSD ライセンスのオープンソースのため無料で商用利用が可能

AND 演算を機械学習させてみよう

それでは、機械械学習のはじめの一歩として、論理演算の『AND演算』の動作を学習させてみましょう。それによって、scikit-learnの使い方もよくわかることでしょう。AND 演算とは『AND演算』とは、2つの入力(XとY)に対し、次のような結果となる論理演算のことです。・両方とも真(1)のときには結果が真(1)・上記以外のときには結果が偽(0)すべてのパターンを表で確認してみましょう。XとYが入力で「X and Y」が結果になります。

では、この AND演算を機械学習させてみましょう。

ゴールを決定しよう

まず、どのような機械学習プログラムを作成するのかというゴールを決定しましょう。今回は以下のような、教師あり学習の機械学習プログラムを作成します。

・入力(X,Y)と結果(X and Y)の全パターンを学習させる

・改めて、入力(X,Y)の全パターンを与えた場合に、正しい結果(X and Y)に分類してくれるかを評価する

このプログラムは機械学習を利用しなくても実装できますが、プログラムの基本的な流れを理解することを目的に、機械学習で実装してみましょう。

アルゴリズムの選択をしよう

ゴールを決定した後は、アルゴリズムを選択する必要があります。しかし、「機械学習をこれから始めたい」と考えている人は「どんなアルゴリズムが存在しているのか」「それぞれのアルゴリズムは、どのような場合に選択したら良いのか」がわからないために、難しさを覚えるかもしれません。そのような場合は「scikit-learn algorithm cheat-sheet」(以下、アルゴリズムチートシート)を参考にすることも可能です(このアルゴリズムチートシートは、scikit-learn のWeb サイトのチュートリアルに掲載されているものです)。

[URL]https://scikit-learn.org/stable/tutorial/machine learning_map/

どのような機械学習をしたいのか、どのようなデータを準備しているのかなどの条件をたどっていくと、アルゴリズムを選択できるようになっています。機械学習を始めたばかりの方は、このアルゴリズムチートシートを参考に選択し、選択したアルゴリズムを調べたり使ってみたりすることで、それぞれのアルゴリズムに対する理解を深めていくことができるでしょう。では、AND演算に関しても、アルゴリズムチートシートを参考にしてアルゴリズムを選択してみましょう。先ほど示した通り、AND 演算はサンプルデータが4件しかなく、 50件より少ないため

・[Start]→[>50 Sample] → NO →[get more data( もっとデータを用意しましょう)]

となってしまうのですが、今回は、機械学習プログラムの基本的な流れを理解することが目的なので、その部分を無視して先に進むと

・[predicting a category (カテゴリーを予測する) )→ YES → [do you have labeled data (ラベル, つまり結果付きのデータを持っている)]→ YES

となります。そして、やはりデータ数は4件なので100K(10万)よりは少ないことから

・[<100K samples] YES [LinearSVC]

となり、LinearSVC というアルゴリズムに到着しました。そこで、今回はLinearSVC アルゴリズムを選択してみましょう。

実装しよう

では、LinearSVC アルゴリズムによって、AND演算を機械学習するプログラムを見てみましょう。Jupyter Notebook で新規ノートブックを作ります。画面右上の[New> Python 3] で新規ノートブックが作成できます。そして、以下のプログラムを記述しましょう。

 

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

from sklearn.svm import LinearSVC

from sklearn.metrics import accuracy_score

# 学習用のデータと結果の準備# X , Y

learn_data =[[0,0], [1,0], [0,1], [1,1]]

# X and Y

learn_label=[0, 0, 0, 1

]# アルゴリズムの指定(LinearSvC)

clf = LinearSVC ()

# 学習用データと結果の学習

clf.fit(learn_data, learn_label)

# テストデータによる予測

test_data=[[0,0], [1,0], [0,1], [1,1]]

test_label­= clf.predict(test_data)

# 予測結果の評価

print (test_data,”の予測結果:”, test label)

print(” 正解率 =, accuracy_score([0, 0, 0, 1], test_label))

では、Jupyter Notebook からプロコグラムを実行してみましょう。Run ボタンを押すと以下のような結果が表示されます。

[[0, 0], [1, 0], [0, 1], [1, 1]] の予測結果:[0 0 0 1]

正解率 =1.0

「正解率 =1.0」は正解率が 100%であることを意味しています。つまり、AND演算の機械学習をLinearSVC アルゴリズムによって行えることが評価できました。非常にシンプルなプログラムで、AND 演算を機械学習させることができました。それでは、プログラムを確認しながら、基本的な流れを確認してみましょう。今回は、以下のパッケージをインポートしています。

・LinearSVC アルゴリズムを利用するためのパッケージ (sklearn.svm.LinearSVC)

・テスト結果を評価するためのパッケージ (sklearn.metrics.accuracy_score)

(※ 2)の部分では、学習用のデータを準備しています。LinearSVC は、教師あり学習のアルゴリズム(※3)の部分では、機械学習用のオプジェクトを生成しています。LinearSVCを利用したいので、なので、学習用データに加えて結果デタも準備しています。LinearSVC コンストラクターを呼び出して、オプジェクトを生成しています。このコンストラクターには、各種バラメーターを指定することもできますが、ここではパラメーターは未指定としています。(※4)の部分では、学習用データと結果を使って学習させます。学習には、fit) メソッドを利用しま9。 hto メソッドでは、学習データの配列と結果データの配列を指定します。(※ 5)の部分では、テストデータから結果を予測しています。予測には、predict() メソッドを利用しまり。predict) メソッドは、テストデータの配列を指定すると、予測結果を返します。(※6)の部分では、予測結果を評価するために正解率を計算しています。正解率の計算には、accuracy_score)メソッドを利用します。accuracy_score0メソッドは、正しい結果と予測結果を指定すると、正解率を返します。

改良のヒント

テスト結果の評価が優れない場合について、XOR 演算を例に考えてみましょう。XOR 演算とは、2つの入力(XとY)に対し、以下のような結果となる論理演算です。

どんなアルゴリズムを利用するかをアルゴリズムチートシートでたどっていくと、AND 演算のときと同じ LinearSVC アルゴリズムに到着します。そこで、AND 演算のプログラムを利用して、プログラムを記述してみましょう。Jupyter Notebook で新規ノートブックを作ります。画面右上の [New > Python 3]で新規ノートブックが作成できます。そして、以下のプログラムを記述しましょう。

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

from sklearn.svm import LinearSVc

from sklearn.metrics import accuracy_score

# 学習用のデータと結果の準備

# X , Y

learn_data =[[0,0], [1,0], [0,1], [1,1]]

# X хоr Y

learn_label =[0, 1, 1, 0]

#(※)xor 用のラベルに変更

# アルゴリズムの指定(LinearSVC)

clf =LinearSVC ()

# 学習用データと結果の学習

clf.fit(learn_data, learn_label)

# テストデータによる予測

test_data =[[0,0], [1,0], [0,1], [1,1]]

test_label = clf.predict (test_data)

# テスト結果の評価

print (test_data, の予測結果:, test_label)

print(“正解率=”, accuracy_score([0, 1, 1, 0], test_label))

「#(※)xor 用のラベルに変更」コメント (2箇所)の部分が修正箇所になります。では、Jupyter Notebook からプログラムを実行してみましょう。Run ボタンを押すと、以下のような結果が表示されます。

[[0, 0],[1, 0], [0, 1], [1, 1]] の予測結果:[1 1 0 1]

正解率 =0.25

予測結果や正解率は実行ごとに変化しますが、ここでは 25% となっています。25% の正解率では、実運用に値するプログラムとは呼べません。つまり、現在のプログラムでは XOR演算を機械学習できないことが評価できました。では、このような場合、次にどのようなアプローチを取る必要があるのでしょうか。以下のどちらかのアプローチを取ります。

・アルゴリズムを変更する

・アルゴリズムはそのままで、アルゴリズムに指定するパラメーターを調整する

ここでは「アルゴリズムを変更する」方法から、アプローチしてみましょう。どのアルゴリズムに変更したら良いのでしょうか。再びアルゴリズムチートシートを見てみると、LinearSVC では機械学習できない(NOT WORKING)の場合、別のアルゴリズムがいくつか候補として挙げられています。今回はそのなかから、KNeighborsClassifier アルゴリズムを試してみましょう。アルゴリズムはそのままで、アルゴリズムに指定するパラメーターを調整する

・[LínearSVC] → NOT WORKING → [Text Data] → NO → [KNeighbors Classifier]

先ほどのプログラムを以下のように変更します。

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

from sklearn.neighbors import KNeighborsClassifier

from sklearn.metrics import accuracy_score

# 学習用のデータと結果の準備

# X , Y

learn_data =[[0,0], [1,0], [0,1], [1,1]]

# X xor Y

learn_label =[0, 1, 1, 0]

# アルゴリズムの指定(KNeighborsClassifier)

clf =KNeighborsClassifier (n_neighbors=1)

# 学習用データと結果の学習

clf.fit(learn_data, learn_label)

# テストデータによる予測

test_data =[[0,0], [1,0], [0,1], [1,1]]

test_label = clf.predict(test_data)

# テスト結果の評価

print (test_data, “の予測結果:”, test_label)

print (“正解率”, accuracy_score(0, 1, 1, 0, test_label))

では、Jupyter Notebook からプログラムを実行してみましょう。Run ボタンを押すと、以下のような結果が表示されます。

[[0, 0],[1, 0], [0,1], [1, 1]] の予測結果:[0 1 1 0]

正解率=1.0

今度は、高い正解率を得ることができました。つまり、XOR 演算の機械学習を KNeighborsClassiherアルゴリズムによって行えることか評価できました。それでは、プログラムを確認してみましょう。※ 1)の部分では、KNeighborsClassifier ア ルゴリズムを利用するためのパッケージ(sklearn.neighbors) をインポートしています。(※ 2)の部分では、KNeighborsClassifier を利用したいので、KNeighborsClassifier コンストラクターを呼び出してオブジェクトを生成しています。今回は、n_neighbors というパラメーターを指定しています。このように、テスト結果の評価が優れない場合は、アルゴリズムやアルゴリズムに指定するパラメーターを変更することで調整していきます。また、インポートするパッケージや機械学習用のオブジェクト生成部分を変更するだけで、手軽にアルゴリズムの変更を行うことができます。

この節のまとめ

・Python で機械学習をする場合「scikit-learn」が定番である

・どのアルゴリズムを選択したらよいかわからない場合は、アルゴリズムチートシートを参考にできる

・学習や評価のための便利なメソッドが用意されている

・評価結果が優れない場合、アルゴリズムやアルゴリズムに指定するパラメーターを変更する

いかがでしたでしょうか。実際に人工知能やAIなど大そうな言葉に聞こええるかもしれませんが本記事に記述されたプログラムの発展形でしかなくそれらを集積したものが実社会において有益なプログラムとして稼働しています。そして今回皆様にはその一端に触れていただき、おおよその機械学習の本質を理解していただけたかと思います。次回以降は実際に画像を使った分類分けの問題に取り組んでいただこうと思いますので是非次回の記事も期待に胸を膨らませていただけると幸いです。

プログラミングカテゴリの最新記事