【機械学習】scikit learnを用いた回帰分析

こんにちは。
林@[アイエンター](http://www.i-enter.co.jp)です。

前回は[ブログ](http://qiita.com/m-hayashi/items/955856b3e2d6b3c42755)では数学的なアプローチの回帰分析のお話をいたしました。

最近は統計分析や機械学習の分野では、Pythonが使われるケースが増えています。
Pythonには、数理演算やデータ可視化の強力なライブラリがそろっているのが
その一因かと思います。

今回は「[scikit-learn](http://scikit-learn.org/stable/)」という機械学習で良く用いられるpythonライブラリを紹介します。
非常にパワフルなライブラリーです。
実際、前回のブログのサンプルデータをライブラリーで回帰分析してみます。

#■環境セットアップ
「[Anaconda](https://www.continuum.io/downloads)」という、Pythonパッケージをインストールします。
これはPython本体と、科学技術、数学、データ分析関連で良く使われるライブラリを、一括でインストールできるパッケージです。
Windows/MacOS/Linuxのそれぞれのパッケージが用意されています。
Pythonのバージョンは3.5のものを今回はインストールします。

![スクリーンショット 2016-08-01 12.39.43.jpg](https://qiita-image-store.s3.amazonaws.com/0/134453/ef5fb01c-720f-9ffc-1957-4b475ad67a06.jpeg)

#■Jupyter Notebookの起動／編集準備
Anacondaをインストールすると「Jupyter Notebook」というライブラリも
インストールされます。今回はこのフレームワークを使って話を進めます。

ちなみに「Jupyter Notebook」は、pythonをコマンドライン環境で対話型実行できる「[IPython](https://ja.wikipedia.org/wiki/IPython)」を、ブラウザ環境へ拡張したフレームワークになります。

ひとまず、作業ディレクトリ「jupyter_work」を作成し、そこから「Jupyter Notebook」を起動します。

```
$ mkdir jupyter_work
$ cd jupyter_work
$ jupyter notebook
```

---
ブラウザが起動し、以下のような画面が表示されるかと思います。

![スクリーンショット 2016-08-01 13.12.04.png](https://qiita-image-store.s3.amazonaws.com/0/134453/1d7cb3d7-6ced-d212-d00a-f1c24c47b184.png)

---
新規のNotebookを作成するため、画面左の「New」のコンボボックスから「Python[Root]」という項目を選択します。
![スクリーンショット 2016-08-01 13.08.58.png](https://qiita-image-store.s3.amazonaws.com/0/134453/d61b2e1c-b0c6-e6f1-bd57-f3c5c6eb99e4.png)

そうすると、以下のような対話型の入力画面が表示されます。
これで、コーディング準備の完了です。
![スクリーンショット 2016-08-01 13.15.26.png](https://qiita-image-store.s3.amazonaws.com/0/134453/3e5c8aa7-02b9-d417-aac1-15156fd35b22.png)

---
#■Jupyter Notebookの基本操作
「In[ ]：」の入力フィールドは、pythonコードを入力していきます。
もちろん、リターンキーで複数行入力も可能です。
![スクリーンショット 2016-08-01 13.29.35.png](https://qiita-image-store.s3.amazonaws.com/0/134453/35b858f5-4671-d031-c09f-fa7249faf51d.png)

入力コードの実行は、ツールバーの「![スクリーンショット 2016-08-01 13.35.34.png](https://qiita-image-store.s3.amazonaws.com/0/134453/3f3fb05b-7f55-aa8a-3a12-25c3158f37e4.png)」ボタンを押すか、シフトキーを押しながらリターンキーを押すことで実行できます。
![スクリーンショット 2016-08-01 13.37.43.png](https://qiita-image-store.s3.amazonaws.com/0/134453/a207dd08-c168-2db1-69a8-4be072bcae77.png)

---
#■回帰分析を行ってみる
まずは、前回のブログのシンプルなデータで回帰分析を行ってみます。
データは以下の内容でした。
![xy012345.png](https://qiita-image-store.s3.amazonaws.com/0/134453/3d77f5bb-b864-7d9d-ea67-7976a904e0d6.png)
また、回帰直線の結果は以下の方程式でした。
![resolved_func.png](https://qiita-image-store.s3.amazonaws.com/0/134453/82ed1489-da04-d405-c529-96600cefd3f3.png)
今回は上記の解析結果を、scikit-learnでも確認します。

---
まずは必要なライブラリーをimportします。![スクリーンショット 2016-08-01 15.25.40.png](https://qiita-image-store.s3.amazonaws.com/0/134453/2e266a7b-6a3a-e3dd-c8ad-1b97fa45996a.png)

numpyは数値計算ライブラリです。
matplotlibはグラフ描画用のライブラリです。
pyplotはmatplotlibのオブジェクト志向ライブラリに対して、手続きインターフェースを提供します。
pandasは表計算などのデータ解析を支援するライブラリで、今回はその中のDataFrameという2次元配列（Excel表のような機能）を使います。
また、sklearnは機械学習ライブラリで、その中のlinear_modelという線形回帰モデルの機能を使います。
最後の行の「%matplotlib inline」は、ブラウザ内にグラフ描画を行わせるためのコマンドになります。

---
前回のX,YデータをDataFrame形式のデータで用意します。
統計学的な呼び方ではXは説明変数、Yは目的変数に相当します。
![スクリーンショット 2016-08-01 16.02.10.png](https://qiita-image-store.s3.amazonaws.com/0/134453/982aa598-1e28-2a12-618c-c3632a5854d9.png)

---
次に線形回帰モデルのインスタンスを作成し、fit関数でトレーニング処理を実行します。
![スクリーンショット 2016-08-01 16.06.15.png](https://qiita-image-store.s3.amazonaws.com/0/134453/c5c0fe29-f075-2a23-e268-c2fd5cb94557.png)

---
さらに、予測元データ（px）を用意します。
pxはXデータの最小値（0）から最大値(5)を0.01刻みでスプリットしたアレイになります。
![スクリーンショット 2016-08-01 16.27.03.png](https://qiita-image-store.s3.amazonaws.com/0/134453/b1a72807-81b0-de77-8d36-0db2ea58dfd4.png)

ただ今回、linear_modelの予測関数（predict）に渡すpxは、関数の仕様上以下のような2次元配列を渡してやる必要があります。
```
[[0.00],[0.01],[0.02],[0.03].....]
```
ここでは、[:,np.newaxis]で、1次元配列を2次元配列に変換しています。

---
予測関数（predict）に予測元データpxを代入し、予測結果をpyに格納します。
そのデータをグラフにプロットします。
plt.scatter()で、元データのXとYを赤点でプロットし、plt.plot()で予測した結果をpxとpyの青い直線で描画します。
![スクリーンショット 2016-08-01 16.40.53.png](https://qiita-image-store.s3.amazonaws.com/0/134453/c6414ac7-21dc-5c52-d19a-2cd10d8f770e.png)

---
この描画された直線の傾きaとY軸の切片bがそれぞれ、期待する値の1.4と2.0になっているかを確認します。
これらの値は、model.coef_とmodel.intercept_に格納されています。
![スクリーンショット 2016-08-01 16.47.53.png](https://qiita-image-store.s3.amazonaws.com/0/134453/d40d74af-7168-cd4a-8b75-4e097763b3da.png)

確かに期待する値が出力されていることが確認できます。

---
#■scikit learnのサンプルデータで回帰分析を行う

scikit learnには機械学習用のサンプルデータも用意されています。
サンプルの一つにBostonの住宅価格のデータが用意されています。
元データは[ここ](http://archive.ics.uci.edu/ml/datasets/Housing)のサイトが参照されているようです。
そのデータに含まれる、購入した住宅の部屋数と住宅価格の相関関係を回帰分析したコードを掲載しておきます。

当然ですが、部屋数が多くなると住宅価格が高くなる傾向が見て取れます。

![スクリーンショット 2016-08-01 18.30.03.png](https://qiita-image-store.s3.amazonaws.com/0/134453/a5225d4d-0a74-da7f-3c47-dfaf4e73a376.png)
![スクリーンショット 2016-08-01 18.30.28.png](https://qiita-image-store.s3.amazonaws.com/0/134453/cb6090e3-f68b-5bf1-9380-5168ee937948.png)

---
今回のお話はここまで！