scikit-learn ~ 必要なライブラリとツール ~

 scikit-learnとその使い方を理解することは重要ですが、ライブラリをたたいただけで、理解したつもりになるのはやめましょう。
 scikit-learnは科学技術計算向けのPytnonライブラリであるNumPyとSciPyによって構築されています。NumPy,SciPyの他にデータフレームデータ処理の基本ツールとしてのPandasやmatplotlibを用います。さらに、ブラウザベースのインタラクティブなプログラミング環境であるJupyter Notebookも紹介も機械学習を行う上では便利です。次回からは、scikit-learnを活用する上で、これらのツールに関して知っておくべきことを述べたいと思います。

機械学習記15日目 ~ 進捗ありません

タイトル通り、今日は進捗を生やせませんでした。
ここ最近ものすごいスピードでいろいろ詰め込んだので息切れしてしまい、一日中だらだらAmazonPrimeを見る生活。たまにはこんな日もあってもいいよ...ね?

機械学習記14日目 ~ 強化学習(Reinforcement learning)

強化学習とは
 強化学習(Reinforcement learning)とは機械学習の手法の1つです。囲碁人工知能である「alpha go zero」などに使われている手法でもあります。alpha go zeroは、たったの40日でこれまで開発されたalpha goのどのバージョンよりも強くなりました。囲碁や将棋といったゲームは、本質的に将来の価値(つまり今その手を打つことにより、最終的に勝つのか負けるのか)を最大化することが目的なので、強化学習とは相性が良い問題です。

 強化学習では、研究者は人工知能に過去の対局や正しい手筋を教えません。その代わりに、人工知能どうしで対局を行わせ、より多く勝てるように試行錯誤して、最適な打ち筋を学習していきます。過去のデータを用いることなく強くなったことから、もはや人工知能は人類の手を離れても強くなっていくことが示唆されています。

 テトリスでできるだけ高スコアを得るような問題も強化学習の枠組みで考えることができます。
その時点で一番スコアが高くなるのは、一列でもすぐに消すようなプレイ方法ですが、より長期的には、できるだけ溜めてから一度にたくさんの列を消したほうがスコアが高くなります。


強化学習の3要素とは
さて、強化学習についてもう少し詳しく説明します。
強化学習では、与えられた「環境」における価値(利益)を最大化するように「AI」を学習させます。
例えば、AIが「テトリス」という環境を観測し、そのうえで行動を起こします。環境(テトリス)はその行動に応じて、AIに報酬を与えます。
f:id:hackU0001:20190305180302p:plain
 今回は、アルゴリズムのために必要な強化学習の用語について、状態(situation) ・行動(action) ・報酬(remuneration) の3要素を紹介します。

 状態(situation)とは、環境が今どうなっているのかをあらわすものです。テトリスの例では、積まれているテトリミノや、操作するテトリミノが状態にあたります。

 行動(action)とは、AIが環境に対してどのような行動を起こすことができるのかをあらわします。テトリスの例では、ブロックの操作にあたります。

 報酬(remuneration)とは、ある状態においてエージェントが行動を起こした結果、どれくらいの報酬が得られるのかをあらわします。テトリスの例では、ブロックを積み上げた結果の消した数にあたります。

 ここで、報酬に関しては一点注意が必要です。
先ほど言った通り、強化学習ではその時点で貰える即時報酬ではなく、(将来に渡る)価値を最大化します。
よって、単に即時報酬が多くもらえる近視眼的な行動ではなく、より未来を考えた価値を最大化する行動を取らなければなりません。


▶どうやって価値を最大化させるようにAIを学習させるのか?
 典型的には、「ある状態においてある行動を取った時の価値」がわかれば、その価値の一番高い行動を選択すればよいはずです。この価値のことを Q値 あるいは状態行動価値と呼び、 Q(s,a) と書きます 。Q値は「報酬」ではなく「価値」であることに注意してください。つまり、Q値とは短期的な報酬ではなく、長期的な意味での価値を値として持っている関数です。

 さて、「その行動によって、価値の高い状態に遷移できるような行動」は、遷移先と同じくらいの価値を持っているとみなすのが自然です。
「価値の低い状態に移り変わるような行動の価値は低い」ことも言えそうです。
つまり、現時点 t におけるQ値は一つ先の時点 t+1 のQ値によって書くことができます
f:id:hackU0001:20190305203945p:plain
下付きの t は時点 t における状態や行動であることを表しています。
rt+1 は得られた即時報酬で、外側の期待値が st+1 に関するもの、内側の期待値が at+1 に関するものです。
γ は割引率と呼ばれ、将来の価値をどれだけ割り引いて考えるかのパラメータです。

ここまで準備ができれば、あとはどうやってこの Q値を学習するかを考えることができます。

~参考サイト~

blog.brainpad.co.jp

機械学習記13日目続き ~ k-平均法アルゴリズム

 ここまで、scikit-learnで試してきた機械学習の手法は、正解ラベルが学習データに付いている「教師あり学習」と呼ばれるものです。もう1つの機械学習である「教師なし学習」です。

 教師なし学習とは、回帰や分類による「予想」とは異なり、ラベルなし学習データから「特徴を分析」するための手法です。「クラスター分析」「主成分分析」といった分析手法があるようですが、今回は「クラスタリング」(クラスター分析)を調べます。

 

クラスタリングアルゴリズム

 クラスタリングには、大きく分けて「階層的」アルゴリズムと「非階層的」アルゴリズムに分けられ、それぞれに複数のアルゴリズムが存在します。今回は、数あるクラスタリングアルゴリズムの中で、scikit-learnが実装していて、かつ、わかりやすかった(というか、私でも理解できた)アルゴリズムの「k平均法」(k-means clustering)を試します。

 

▶k平均法

 k平均法は、非階層的クラスタリングです。非階層的クラスタリングは、あらかじめ観測データをいくつかに分割するのか、その数(クラスタ数)を指定します。例えば、クラスタ数3でクラスタリングを行うと、似た特徴を持ったグループ(クラスタ)に3分割されます。

 

①k平均法のアルゴリズムでは、特徴ベクトルを最も近い重心のクラスタに割り振るこ

 とで分割を行います。

 

②k平均法では、次の手順で観測データを3つのクラスタに分離します。まず、各データ

 に3つのランダムなクラスタを割り当てます。そして、クラスタごとに重心(座標の

 平均)を求めます。

 

③求まった重心を仮のクラスタの重心として、一番近いデータを重心のクラスタに変更

 します。再び重心を計算します。

 

④重心に変更があった場合は、仮のクラスタの重心として一番近いデータを重心のクラ

 スタに変更し、再び重心を求めるという作業を繰り返します。

 

⑤重心に変化がなくなるとクラスタリングが完了します。

 

 これが、k平均法のアルゴリズムです。私は理解するのに少し時間がかかりました。初期値納品ランダムな割り振りによる幅が大きいので、何度も実行して結果の平均をとるのが良いそうです。

 

 k-平均法のアルゴリズムを可視化したものが以下のサイトにありました。とても分かりやすいので、ぜひ参考にしてみてください。

tech.nitoyon.com

 

 

機械学習記13日目 ~ k平均法

 それでは、k平均法をscikit-learnで試したいと思います。scikit-learnには、cluster.KMeansクラスがあり、k平均法によるクラスタリングを実行できます。書式は、図1のようになります。

f:id:hackU0001:20190304122330p:plain

f:id:hackU0001:20190304121451p:plain

図1.KMeansの書式

 

クラスタリングの実施

 今回は、irisデータセットを3つのクラスに分割します。最初にirisデータセットをロードして、正解の分類を確認しておきます。

f:id:hackU0001:20190304122833p:plain

 このように、irisデータセットには3種類のアヤメデータ(ラベル0×50個、ラベル1×50個、ラベル2×50個)が入っています。それでは、KMeansの学習モデルにirisの計測データだけを渡して、うまく3つのクラスタに分離できるか試してみたいと思います。

f:id:hackU0001:20190304123705p:plain

 これで、irisデータセットをk平均法によって、3つのクラスに分けました。クラスタリングの結果のラベルを表示してみます。

f:id:hackU0001:20190304123943p:plain

 ラベル番号は、最初に割り当てたランダムな番号なので正解とは異なりますが、だいたい最初の50個がクラスタ1、次の50個がクラスタ0に分割できるみたいです。