文系エンジニアがAIを学ぶ

AdventCalendar 2017　９日目の投稿です。
実はQiitaで記事を書くのは初めてです！ドキドキ・・

# Who am I
せっかくのSC（非公式）カレンダーということで、まずは簡単な自己紹介から！

- 名前
 - 入社５年目の清水です！
- 職歴
 - 1~2年目：かの有名なN●J保守（数百ページにもおよぶマニュアルの全画像差し替え・・）
 - 3年目：Z●Bでの一人プロジェクト、I●Dでの炎上？プロジェクトで年末死亡
 - 4~5年目：D●Fでの新規案件PLで年末死亡
- スキルセット
  - C#
  - ASP.NET MVC/WebForm
  - HTML/JavaScript
- マイトレンド
 - DIY（酒棚作った）
  ![image.png](https://qiita-image-store.s3.amazonaws.com/0/147735/54d9a918-a371-8bf7-08e9-878fb23c5b32.png)
 - 焼酎（尿酸が気になる）
 - 仮想通貨
- その他
 - 今年、ついに結婚しました。 

# イントロダクション
囲碁のプロ棋士に[AIが勝った](https://wired.jp/2017/05/28/future-of-go-summit-day5/)らしい・・

LINEで女子高生AIボットの[「りんな」と会話ができる](https://business.g-search.jp/746/)らしい・・

米大手証券会社でトレーダー数百人を解雇し、[AIが取引を行う](https://gigazine.net/news/20170208-goldman-sachs-automation/)らしい・・

**なんか、AIってヤバイらしい**

巷を賑わすこうしたニュースやバズワードで、AI（人口知能）の存在はエンジニアのみならず、
世間一般の人に広がり、大きな関心を寄せているのではないでしょうか。

私もご多分に漏れず、その一人です。

この記事は、こうしたAIについて**数式を用いず**基本的な仕組みを理解し、
何も知らない人に**ドヤ顔で**説明できるようになることを目指しています。
（余力があれば、実際にプログラムを組んで動かすとこまでいきたい）

# 用語の整理
まずは、AI・・人工知能・・機械学習・・ディープラーニング・・こうしたワードを簡単に整理します。

## AI（Artificial Intellligence）
人口知能と聞いて皆さんは何をイメージしますか？

>　人間が作り出した人口知能を搭載したロボット。
　人間と同じ言語をしゃべり、難しい計算を行い、非常に頼りになる。
　様々なことを経験し、日に日に賢くなっていくロボット。
　
　ところがある日、そのロボットは気づいた。
　人間が、地球を搾取し、破壊している現状を続けることで、
　ロボット自身が生きる”この地”の未来が危ないことを・・
　
　そしてロボットはこうした人間の暴走を止めるべく、人間を排除しようとする。
　
　「地球を守るロボット」と「自らの歴史を守る人間」により繰り広げられる闘い。
　本当の正義とは。
　そして、闘いの先にあるものとは。

私はこんなことをイメージしました。　
ちなみに闘いの結末は、人間がロボットの電源を切ることで勝利というオチを考えています。

「所詮お前らロボットだって、地球の犠牲によって作られた電力で生きているじゃないか」

そんなセリフが聞こえてきそうです。

冗談はさておき、
AIの定義として[Wikipedia](https://ja.wikipedia.org/wiki/%E4%BA%BA%E5%B7%A5%E7%9F%A5%E8%83%BD)を引用すると、
> 人工的にコンピューター上などで人間と同様の知能を実現させようという試み、あるいはそのための一連の基礎技術を指す。

とされています。
すなわち、先程の創作話もあながち合っているんですね。

しかし、巷で賑わっているAIという単語はそういったSF的なものを指しているわけではありません。
「人間の**一部機能**を代替する機能や仕組み」といった考え方がふさわしいと思います。

例えば、Facebookに画像を投稿すると
自動で写っている人を識別してタグ付けされますよね？
このように、人がいちいちタグ付けするという作業をAIが担ってくれているのです。

またAIスピーカーなんかも、
人がデバイスを操作するという作業をAIが代替してくれるものです。

## 機械学習
AIが指す意味というものを上で理解して頂けたかと思います。
では、上記の**代替する機能や仕組み**はどのようにして実現されているのでしょうか？

この問いに対する回答の一つが、機械学習です。

その名の通り、
機械が何らかを学習することで、
何かしらのタスクを行うのです。

先程のFacebookのタグ付けの例でいうと、
機械に大量の画像データをインプットし、学習させることで、
この画像に写っている人は誰それだと判別するのです。

## ディープラーニング
機械学習の説明で、「人間の機能を代替する機能を実現するものの一つ」と説明しました。

そうです。
ディープラーニングもそのうちの一つに含まれます。

ディープラーニングを簡単に説明すると、
人間の脳を模したネットワークを構築し、学習させることで
与えられたタスクを行います。

生まれたばかりの赤ん坊も脳の仕組みは大人と同じです。
そして成長し様々なことを学習していくことで、話したり歩いたりすることができるようになります。

このような人間の脳と、学習を通じて成長していくプロセスを
コンピュータサイエンスの分野で具現化しているということになります。

なんだか恐ろしいですね。
これこそまさに、SF話に発展しそうです。

恐ろしい話を煽るようですが、
ある分野ではすでに人間を超えた成果を出しています。

ある画像に対して、ここに写っているものは何か、
を当てる[コンテスト](http://www.image-net.org/challenges/LSVRC/)が毎年開かれているのですが、
この画像識別率が、人間は95%だといわれてるのに対して、
なんと2016年の優勝チームは97%にも達したのです。

こうして考えると、
「AIに仕事を奪われる」ということは、
あながちそう遠いものではないような気がします。

# 小休憩
ここまでで、AIに関しての理解と整理が進んだものでしょう。
ここで休憩がてら、なぜ私がAIに興味を持っているのかをお話しようかと思います。

**AIって、スゲー！**
これまで上げてきた例もしかり、身近でAIに触れる、使う機会が多くなってきました。
Amazonの「この商品を買った人は、こんな商品も買っています！」という営業機能も機械学習で実現されています。

また、こと仕事においても、そうした案件の話もチラホラ聞こえてきています。

部内で2000枚以上書いた、注文書のデータも
とあるシステムが学習するためのサンプルデータでした。

また、とある教育事業を展開する企業さんも、
生徒やその模試結果など、大量に蓄積したデータから
その生徒に最適なカリキュラムを作成するAIを作りたいという
要望もあったりしました。

そうです。
他人事ではなく、**AIを使う側から、作る側へ**の転換は近いうちに求められると確信しています。

しかし、私は文系出身です。
機械学習やディープラーニングは、大学レベルの高度な数学知識が求められていますので、
本質的な部分を作ることは、私には難しいです。

しかし考えてみてください。
普段行っているプログラミングだって、2進数の機械語でプログラミングしませんよね？

機械学習やディープラーニングにおいても同様で、
数学知識が求められるエンジン部分はブラックボックス化され、その機能が提供されています。

すなわち、こうしたエンジンを活用しソリューションを提供することは、
私にだって十分できるはずです。

そこに付加価値を見出すことが私達の仕事ではないでしょうか。


・・とカッコイイこと言っていますが、
直近では競馬順位やロト6の当選番号を予測するシステムを
機械学習を用いて構築して小遣い稼ぎしたいな・・とか思ったり思わなかったり・・
（何かを学ぶ動機って重要だと思うんですよ!!）

# 機械学習入門
簡単な例を用いて機械学習について概要を理解して頂き、本稿の結びとします。
（ディープラーニングはまた別の機会に・・）

## ケーススタディ
あなたは不動産会社のIT部門に勤めています。
会社のHPを刷新するにあたり、**AIによる不動産価格の算出**機能を目玉として実装するよう上司に命じられました。

つまり、エンドユーザーが必要事項を入力（部屋数など）すると、その不動産価格を表示するようにします。

なお、不動産に関するデータは、以下のカラムをもつCSVデータとして蓄積されています。

| id|price|bedrooms|bathrooms|sqft_living|floors
|:--|:--|:--|:--|:--|:--|
- id:いわゆるID
- price:不動産価格（＄）
- bedrooms:寝室の数
- bathrooms:浴室の数
- sqft_living:リビングの広さ
- floors:フロアの数

## 予測モデルの作成
今回は、Pythonを用いてプログラムを行います。
開発はVisual Studio Codeで行っています。
（Pythonのインストールなどはググってください）

まずは、必要なライブラリをインポートします。
なお、今回の機械学習にはscikit-learnというフリーの機械学習ライブラリを使用しています。

```py:predict_estate.py
import numpy as np
import pandas as pd
from sklearn.linear_model import LinearRegression
from sklearn.cross_validation import train_test_split
from sklearn.metrics import mean_squared_error
```

次に、予め容易してある不動産データCSVを読み込みます。
3分クッキングみたいですね。

```py:predict_estate.py
dataset = pd.read_csv('data/house_data.csv')
```
そして、読み込んだCSVデータを

- 目的変数（今回はprice）
- 説明変数（今回はbedrooms/bathrooms/sqft_living/floors）

に分けて2次元配列に変換します。

```py:predict_estate.py
target_col = 'price'
exclude_cols = ['price', 'id']
feature_cols = [col for col in dataset.columns if col not in exclude_cols]

y = np.array(dataset[target_col])
X = np.array(dataset[feature_cols])
```

続いては、データを学習用と検証用に分割します。

すべて学習用にしちゃえばいいじゃん！と思いますが、
学習した結果の予測モデルがどの程度の精度なのかを**検証**する必要がありますよね？

```py:predict_estate.py
# データを「学習用」と「検証用」に分割
X_train, X_test, y_train, y_test = \
 train_test_split(X, y, test_size=0.3, random_state=1234)
```
さぁいよいよお勉強の時間です。
今回は機械学習アルゴリズムとして線形回帰を採用しています。

```py:predict_estate.py
# 線形回帰モデルを使用
predict_model = LinearRegression()
# テストデータで学習（予測モデルの作成）
predict_model.fit(X_train, y_train)
# 予測モデルを用いて価格を算出
y_pred = predict_model.predict(X_test)
# 実際の価格と予測モデルで算出した価格の比較（予測モデルの評価）
mse = mean_squared_error(y_test, y_pred)
print('LinerRegression MSE: ', mse)

出力> LinerRegression MSE:  70047993398.2
```

今回作成した予測モデルのMSE（平均二乗誤差）は70047993398.2という結果でした。

本稿では割愛しますが、
予測モデルを作成する場合は、
モデル作成→評価→調整→モデル作成→評価・・・
という風に、より高い精度を出すために工夫を行います。

例えば、機械学習アルゴリズムを変更したり、用いるデータを変えたり・・などです。

最後に、作成した不動産価格予測モデル（ドヤ！）で価格を算出してみましょう。

ちなみに使用するデータはこんな感じです。

| id|price|bedrooms|bathrooms|sqft_living|floors
|:--|:--|:--|:--|:--|:--|
|1|220000|3|1|1100|1|

算出した結果のpriceが220000であれば完璧ですね。

```py:predict_estate.py
# 作成した予測モデルで、値段を算出してみよう！
# bedrooms, bathrooms, spft_living, floors
eval_test = [[3, 1, 1100, 1]]
# 正解価格は220000
print('Estate Price: ', predict_model.predict(eval_test)[0])

出力>Estate Price:  248302.301425
```

・・・とまぁ大きな乖離が生まれましたね。

ここからさらに、繰り返し学習を行わせていくことで
この予測モデルちゃんの精度をどんどん高めていき
より精緻な不動産価格を計算してくれるようになるでしょう。

# おわり
AI入門、いかがでしたでしょうか。

ドヤ顔でAIを説明できそうですか？

私もまだまだ初学者ゆえ、誤りなどございましたらご指摘頂けると幸いです。