【習うより慣れよ】Rapid MinerとExcelで分類問題を解いてみよう

# 0.対象
とりあえず人工知能の概要は何となく理解していて、
**習うより慣れよ**でとりあえず機械に「学習」させてみたい人

# 1. インストールしよう
[公式サイト](https://rapidminer.com/get-started/)からダウンロードしましょう。「RapidMiner Studio」は無料で永久に使えるはずです。

後は現在使っているパソコンのOSを選んでインストーラをダウンロードし、インストールを済ませます。

# 2. Excelで訓練データを作ってみよう
訓練データというのは、人工知能が学習するための「教科書」みたいなものです。具体的には **問題とその答えを大量に集めたもの**といえます。人工知能は、訓練データの中から「法則」を見つけます。

今回は一例として、直角三角形と鋭角三角形と鈍角三角形を分類するように学習させてみましょう。

鋭角三角形、直角三角形、鈍角三角形の定義は次の通りです。
三角形の最大の辺の長さを$a$、その他2辺を$b,c$とします。

このとき、
$a^2\<b^2+c^2$ なら鋭角三角形
$a^2=b^2+c^2$ なら直角三角形
$a^2>b^2+c^2$ なら鈍角三角形
です。

Excelで1つ、問題と答えを「ランダムで」作ってみましょう。
例えば、1~100の間の一様乱数を整数で取得したいときは
A2セルに`=RANDBETWEEN(1,100)`と入力します。
これをA2,B2,C2の3列に作れば、「3辺の長さを与えた」ことになりますね。
続いて
D2セルに「3辺のうち最大の辺」を入れましょう。`=max(A2:C2)`とすればよいです。
同様にE2セルは「3辺のうち最小の辺」を入れるため、`=min(A2:C2)`とします。F2セルは「二番目に長い辺」としましょう。これは辺の長さの総和から最大の辺と最小の辺の長さの和を引き算すればよいため、
`=SUM(A2:C2)-SUM(D2:E2)`とします。
G2セルで、三角形の種類を判定しています。
コードは次の通りです。
`=IF(ABS(D2^2-(E2^2+F2^2))/D2^2<0.1,"直角三角形",IF(D2^2<E2^2+F2^2,"鋭角三角形", "鈍角三角形"))`
(直角三角形の判定条件は、厳密な等号ではなく「$a^2$と$b^2+c^2$が**ほぼ**等しい(誤差率10%未満)」こととしました。これは、厳密な直角さを追求してしまうと、整数の範囲で偶然に直角三角形が生成される確率が著しく低く、「直角三角形」の学習機会が極端に少なくなってしまうからです。)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319477/b3189596-452b-7c46-39c4-1be4160d77f7.png)
図2-1. Excelへの入力

後はA2セルからG2セルを選び、オートフィルすれば、好きなだけデータを作ることができます。
今回は10000行のデータを作るものとし、10001行目までオートフィルします。

これをCSV形式で保存すれば、訓練データの完成です！

# 3.訓練データの取り込みとニューラルネットワークの設計、学習
本稿では、必要な演算子、設定等についてしか説明しません。
データマイニングの基礎を学ぶには、**ぶっちゃけ、頑張って英語を読んで、RapidMiner公式チュートリアルに取り組んだ方がいいです。**
その方が基本的な操作を一通り学べるからです。

さて、第2章で作った訓練データをRapidMinerに取り込んでいきましょう。

1. Repositoryパネルにある「Import Data」ボタンを押します。
2. My Computerをクリックします。
3. 第2章で作成したcsvファイルを選んで「→Next」を押します。
4. エラーが出ていなければ、「Where to store the data?」の画面になるまで「→Next」を押します。エラーがある場合でも、頑張って英語を読解すれば自力でなんとかできることがあります。
5. 「Where to store the data?」では、読み込んだcsvファイルをどこに保存するかを聞いています。「Local Repository」を選択しましょう。またNameの欄から、データに名前を付けることができます。「三角形」などとつけておきましょう。そしてFinishを押せば、データの取り込み完了です。

では次に、ニューラルネットワークを設計します。図3-1のように、RepositoryパネルおよびOperatorsパネルからProcessパネルへ
「取り込んだ訓練データ」、「Set Role演算子」、 「Select Attributes演算子」、「Neural Net演算子」の4つをドラッグしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319477/bce8bee2-6a27-158b-fb59-24e4af9c0f71.png)
図3-1. Processパネル

次に、各演算子を調節します。演算子の設定は、Parametersパネルで行います。
Set Role演算子を選択すると、Parametersパネルは図3-2のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319477/5c106044-af76-ab91-513c-7a0f19f3a2a3.png)
図3-2. Parametersパネル

今回予測したい「答え」は「種類」の列(G列)です。
そのことを宣言するため、attribute nameを「種類」、target roleを「label」にします。

次にSelect Attributes演算子を調整しましょう。
「最大の辺」、「最小の辺」、「2番目の長さの辺」って正直不要な情報ですよね。a～cがあるのだから、それで十分なわけです。
そこで、「最大の辺」、「最小の辺」、「2番目の長さの辺」以外を「select」します。こうすることで、不要な列が消せます。
ここまでの手順を図3-3に著しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319477/cbd86ebe-7d81-d8fa-1deb-f3ff8822b237.png)
図3-3. Select Attributes演算子

最後、Neural Net演算子では、training cyclesを10000にします。これは「学習回数を10000回とせよ」という意味です。

すると、しばらく時間がかかったのち、図3-4のような画面を得ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319477/44ebe81a-3646-9949-4e61-14db2592eb90.png)
図3-4. 学習を終えたニューラルネットワーク

inputは上から順にa, b, c, (定数項1)で、outputは上から順に鈍、直、鋭となっていました。

各ノード(パーセプトロン)をクリックするか、Descrtiptionをみることで、学習したパラメータを確認することができます。

# 4.ニューラルネットワークの評価

では、作成したニューラルネットワークに問題を解かせてみましょう。
もう一度第2章のようにExcelで三角形のデータを作ります。
ただし、乱数は更新してください。
データができたら、第3章と同様の手順でRapidMinerに取り込んでください。名前は「三角形評価」などでよいでしょう。

ここまで出来たら、図4-1のように演算子を追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319477/915ffe27-4c46-84ab-c2aa-11313619f516.png)
図4-1. Processパネル(評価)

Apply Model演算子は、作成したモデルを実際に利用するための演算子です。
Multiply演算子は、「枝分かれ」させるためだけの演算子であり、本質的な意味はありません。
Write CSV演算子は結果データをCSVに書き込むものです。Parametersパネルにて出力先ディレクトリや名前を設定できます。

しばらく待つと、図4-2のような結果を得ます。緑で塗られた列がニューラルネットワークの出力、一番右の「種類」が正しい答えです。比較してみると、直角三角形が絡んできさえしなければ、ニューラルネットワークは正しい答えを導くことが割と多いということがわかりました。(とはいえ、間違いもちらほら目立ちます)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319477/b3ad4f79-eba7-f0bc-5b66-90c095d129ae.png)
図4-2. 学習済みパーセプトロンによる出力および答え

CSVファイルを出力させたので、それをExcelで編集して、正解率を算出してみましょう。
G列が正しい答え、K列(一番右です)がニューラルネットワークの出力となっていました。
L2セルに`=IF(G2=K2,1,0)`と入力し、L10001セルまでオートフィルします。
そしてM2セルなどに`=SUM(L:L)`と入力します。
すると、今回は7817と表示されました！
10000問中、7817問において、ニューラルネットワークは正解を導くことができたのです！！

# 5.ハイパーパラメータを調整
ニューラルネットワークは機械学習を実現する一つの手段であり、内部のたくさんのパラメータを自動で更新し、入力と出力―すなわち問題と答えの関係を内部パラメータで表現します。
とはいえ、ニューラルネットワークにも「自動で学習できない」つまり「人間が設定する」パラメータがあります。それらの総称をハイパーパラメータといいます。

例えば隠れ層(入力でも出力でもない高さのノード集合)の個数だったり、各隠れ層におけるノードの個数だったり、学習率などがあります。

隠れ層数や各層のノード数の決め方は、[このサイト](https://webbigdata.jp/ai/post-1491)がとても視覚的かつ直感的でわかりやすく説明してくれています。
とはいえ、「実際」の問題にはとても活かしにくいですね。
そこで、他の<sub><sub>(いや、本質的には同じことですが)</sub></sub>考え方もあります。ニューラルネットワークが1層ずつ法則を発見し、論理的に答えを導き出しているというものです。[このサイト](https://products.sint.co.jp/aisia/blog/vol1-5)で述べられています。
今回の例(三辺の情報から三角形の種類を分類)では、例えば図5-1のようなモデルが考えられるかと思います
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319477/2fc9f314-17c6-ccdd-ba09-c76f74266bcb.png)

図5-1. 推論を行うよう設計したニューラルネットワークのモデル

入力層→第1隠れ層(find_max層と名付けました)にて、各辺が最大であるか否かの真偽値を計算します。
また、各辺の値を入力層からそのまま持ってくるパーセプトロンもあります。
このようなfind_max層からは「最大の辺の長さ」や「最大以外の辺の長さ」を知ることができます。それがfind_max→sortedです。
sorted→compareでは公式に当てはめて三角形の種類を判定します
このようなモデルを学習させるには、Neural Net演算子を図5-2のように設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319477/aae5438c-21c7-bda3-83e4-3ee98eaef8ed.png)
図5-2. Neural Net演算子における隠れ層の設定

これで、図5-1と同じ形状のニューラルネットワークを作ることができました。**ただし、必ずしも設計したモデルの通り学習するとは限りません**。どのようなモデルになるかは、学習の過程で自然に決定します。**設計通りに学習するのではなく、学習によって設計の正当性が検証される**といってもよいでしょう。

実際に学習してできたモデルは図5-3の通りでした。図5-1と比べて明らかなとおり、想定していたものと全然違いました(笑)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319477/1cc34e90-0105-b25f-8957-683d0f7142d0.png)

図5-3. 学習で実際に生成されたモデル

ちなみにこのモデルにおける正解率は10000問中9608問, すなわち96.08%でした！
多層化することで正解率が向上する傾向があるのかもしれません。

しかし、各隠れ層のノード数を5、層数を10として再実験すると、学習に数十分かかったのち、正解率は69.75%まで落ちてしまいました。これは過学習によるものなのでしょうか。もしくは「誤差の消失」が起きた可能性があります。
図5-4に10層で学習したモデルを示します。入力に近い手前の層の重みにはほとんど偏りがありません。これは「何ら発見できていない」ことを意味します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319477/efb4dc53-8ca1-0f63-29e4-aca343a83f55.png)
図5-4. 隠れ層が10層ニューラルネットワーク

また、[このサイト](https://nnadl-ja.github.io/nnadl_site_ja/chap4.html)で詳しく述べられている通り、ニューラルネットワークは(ノード数、学習に必要な時間をケチらなければ)隠れ層がたった1層だとしても、任意の関数を学習することができます。

実際、隠れ層1層、ノード数100で学習したところ、図5-5のようなモデルを25分ほどかけて得ました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319477/8f5dd517-25c9-fcca-555b-1a2684c080df.png)
図5-5. 隠れ層1層、ノード数100のニューラルネットワーク(横向きに回転)

10000問中正解が9795問で、正解率は97.95%です。
今までのモデルの中で一番高いですね。

# 6. autoMLP
実は、隠れ層の総数、ノード数、および学習率などのハイパーパラメータを自動で調整する方法もなくはないようです。
ハイパーパラメータを自動で調整してくれるアルゴリズムの一例に**autoMLP**というものがあります。
RapidMiner公式ドキュメントの解説によると、遺伝的アルゴリズムや確率的最適化などの方法を利用しているそうです。
またautoMLPの論文も示されていました。
AutoMLP: Simple, Effective, Fully Automated Learning Rate and Size Adjustment by Thomas Breuel, Faisal Shafait. The Learning Workshop, Cliff Lodge, Snowbird, Utah, United States, Online, 4/2010.

(今から実験して加筆します)

# 7.まとめ

- RapidMinerを使えばニューラルネットワークによる機械学習は簡単に行える
- 訓練データや試験データはエクセルで簡単に作れる
- 単に隠れ層を増やせばよいというわけではない。増やしすぎると誤差逆伝播で誤差が伝わらなくなり、逆効果
- 隠れ層1層、ノード数多数における学習は、時間がかかるものの正解率が高くなることがある。
- モデルを考えたうえで隠れ層やノード数を調整すると、短時間で高い正解率を得ることができる