近年、第三次人工知能ブームが巻き起こっています。特に、深層学習(ディープラーニング)と呼ばれる技術で目覚ましい成果を上げています。本稿では、難しいと思われている機械学習(深層学習)を、お手軽プログラミング言語JavaScriptで実践してみます。難しい数式や理論は後回しにして、まずは、気軽に機械学習に触れてみましょう。

 今回から二回に分けて、機械学習でワインの等級を判別してみたいと思います。前回同様、Node.jsとJavaScriptの機械学習ライブラリ「synaptic.js」を利用してみます。

ワインの成分と等級のデータを入手しよう

 ワインの成分を調べることで、ワインのおいしさを調べることができるのでしょうか。かつて、ワイン好きの経済学者が降水量や平均気温を元にして、ワインの質を計算する式を発表したところ、ワインの批評家たちに大いにバッシングされたそうです。確かに、ワインの味を数式で表すことができるなど、信じられないと思うことでしょう。しかし、最近では、ワインに含まれる成分の濃度を元にして、ワインの味を表すことができることが知られています。

 そうであれば、ワインの等級判定は、機械学習で判定するのにぴったりの題材ではないでしょうか。機械にワインの味が分かるのか、JavaScriptを用いて判定してみましょう。

ワインの等級と成分データのダウンロード

 まずは、ワインデータを取得しましょう。以下のWebサイトに、ワインの成分と等級の一覧データが公開されており、CSVファイルでダウンロードすることができます。

UCI > 機械学習リポジトリ > ワインデータセット(英語)
http://archive.ics.uci.edu/ml/datasets/Wine+Quality

※2017年5月31日現在、上記のサイトでワインデータ自体は配布しているものの、データ形式が異なるものとなってしまいました。そこで、こちらから代替ワインデータをダウンロードできるようにしました。 [2017/05/31 17:00]

 サイト自体は英語ですが、ロゴのすぐ下にある「Download: Data Folder」をクリックします。するとファイルの一覧が表示されるので、「wine.data」をクリックします。すると、ワインの等級と13種類の成分のCSVが表示されます。このデータをコピーして、テキストエディタなどに貼り付け「wine.csv」という名前で保存してください。もし、「wine.data」がそのままダウンロードされた場合は、「wine.csv」というファイル名に変更してください。

 このCSVファイルを開いて見ると、以下のようなデータとなっています。


1,14.23,1.71,2.43,15.6,127,2.8,3.06,.28,2.29,5.64,1.04,3.92,1065
1,13.2,1.78,2.14,11.2,100,2.65,2.76,.26,1.28,4.38,1.05,3.4,1050
1,13.16,2.36,2.67,18.6,101,2.8,3.24,.3,2.81,5.68,1.03,3.17,1185
...省略...
2,12.34,2.45,2.46,21,98,2.56,2.11,.34,1.31,2.8,.8,3.38,438
2,11.82,1.72,1.88,19.5,86,2.5,1.64,.37,1.42,2.06,.94,2.44,415
2,12.51,1.73,1.98,20.5,85,2.2,1.92,.32,1.48,2.94,1.04,3.57,672
...省略...
3,13.27,4.28,2.26,20,120,1.59,.69,.43,1.35,10.2,.59,1.56,835
3,13.17,2.59,2.37,20,120,1.65,.68,.53,1.46,9.3,.6,1.62,840
3,14.13,4.1,2.74,24.5,96,2.05,.76,.56,1.35,9.2,.61,1.6,560

 このCSVファイルには、14列のフィールドがあります。最初の1列がワインの等級で、残りの13列がワインの成分データとなっています。

 ワインの成分ですが、2列目から、アルコール、リンゴ酸、灰、灰のアルカリ性、マグネシウム、フェノール類全量、フラバノイド、非フラバノイドフェノール類、プロアントシアニン、色彩強度、色彩強度、色調、OD280/OD315、プロリンの値が載せられています。

 とは言え、ワインの成分については、専門的で難しいので、13列の成分データがあるという点だけ覚えておきましょう。そして、この成分を元にして、ワインの等級を判別できるのかどうかという点に注目してみましょう。ちなみに、ワインの等級は、1/2/3の三段階となっています。