ゼロから始める機械学習(2) どんなデータを使うのか？

今回は**機械学習で使われるデータはどんなものか？**をいくつかの例を使って具体的にみていきたいと思います。

機械学習が中でやっている処理を見る前に、扱われる**入力データ**、**出力データ**がどんなものか見ることで、機械学習に出来ることのざっくりしたイメージを説明できればと思います。

#**データは全て数字で表される**
機械学習への入力データ、出力データは全て数値情報に変換された数値データになります。

具体的にどのような数値データが使われているのか、下記３つを例に説明します。

1. 試験結果予測
1. 画像認識
1. 自然言語処理

##**試験結果予測**
模擬試験の結果を元に、本試験の結果を予測するシナリオを例に説明します。

###**入力データ**
模擬試験の科目が5科目（英語、国語、数学、物理、化学）でＡさんの結果が以下の点数だったとしましょう。

>英語：70点、国語：80点、数学：75点、物理：58点、化学：75点

点数は数値データなので、変換は行わずそのまま入力します。

5科目なので、5個数字を並べます。これを数学の言葉で**ベクトル**と言います。

```
(70,80,75,58,75) ← 順番に(英語得点、国語得点、数学得点、物理得点、化学得点)
```

*ベクトルというと難しそうに聞こえますが、単に数字を並べたものです、難しくないです*

次に、受験者の現在の所属情報（公立高校、私立高校、予備校）を追加することを考えましょう。

所属情報は数値ではないので、点数のようにそのまま機械学習への入力にすることは出来ませんから、数値データに変換する必要があります。

2次元のベクトルを用意して、それぞれが公立高校、私立高校を表すことにし、所属しているものだけ1にして他は０にすることで数字で所属を表現します。

```
(1,0)　公立高校 ←　第1要素が公立校
(0,1)　私立高校 ←　第2要素が私立校
(0,0)　予備校 　←　第1,第に共に0で予備校を表す
```
*候補は３つですが両方ゼロの場合は予備校とすることで1次元節約して2次元で表現しています*

前に出てきたＡさんが私立高校所属の場合、Ａさんの情報を表すために試験結果ベクトルと所属ベクトルを合わせた7次元のベクトルで表現します。
```
(70,80,75,58,75,0,1)
```
*簡単にいうと7個の数値データで表現しています*

###**出力データ・教師データ**

####**出力を合否判定にする場合**
合否判定の場合は合格、不合格の２つの選択なので、1次元のベクトルで表現します。

#####教師データ#####
合格、不合格を0,1で表します

```
(1) 合格
(0) 不合格
```

#####出力#####
1次元のベクトルで合格確率を表します。

```
(0.3) ←　合格確率　３０％
(0.9) ←　合格確率　９０％
```

####**出力を試験点数にする場合**
試験点数を予測する場合は出力データ、教師データとも、１次元のベクトルで試験の点数を表現します。

>合否判定、試験点数、どちらも学習の際には機械学習の出力データと教師データを比較して正しく予測できているかを確認し、パラメーターを修正していきます（具体的な修正の仕方は今後の連載にて説明します）

##**画像認識**
手書きの数字を識別するシナリオを例に説明します。

###**入力データ**
機械学習で画像を扱う場合は、画像情報を数値で表した**画素情報**が入力として使われます。

対象の画像の解像度が784ピクセル(縦28 x 横28)の白黒画像(輝度0～255)の場合、784個の画素それぞれのピクセルの輝度が入った**画素情報**を784次元のベクトルに入れて数値表現します。


```
(0,23,225,250,0,.......,9,89) ←784次元
```

*要するに256個の数字で画像を表します*

カラー画像の場合はそれぞれのピクセルを赤、緑、青の３つの輝度で表すので白黒より3倍のベクトル次元が必要になりますが基本的な考え方は変わりません。

###**出力データ・教師データ**
手書き文字の識別の場合、書かれた数字が０～９のどれかを数字で表すので10次元のベクトルを使います。

```
(1,0,0,0,0,0,0,0,0,0,0) <=0の場合
(0,1,0,0,0,0,0,0,0,0,0) <=1の場合
(0,0,1,0,0,0,0,0,0,0,0) <=2の場合
(0,0,0,1,0,0,0,0,0,0,0) <=3の場合
(0,0,0,0,1,0,0,0,0,0,0) <=4の場合
(0,0,0,0,0,1,0,0,0,0,0) <=5の場合
(0,0,0,0,0,0,1,0,0,0,0) <=6の場合
(0,0,0,0,0,0,0,1,0,0,0) <=7の場合
(0,0,0,0,0,0,0,0,1,0,0) <=8の場合
(0,0,0,0,0,0,0,0,0,1,0) <=9の場合
```

>機械学習での画像処理についてはこちらの記事もご参照ください
>[ディープラーニング超概要　なぜ黒魔術と言われるのか？](https://qiita.com/kenrohmiyoshi/items/b1ae1516394647f5f47e)

##**自然言語処理**
日本語を英語に翻訳するシナリオを例に説明します。

###**入力データ**
自然言語を機械学習で扱う場合は単語を入力の単位にするのが一般的です。

日本語英訳の場合は、入力は日本語の単語になります。

単語の場合、語彙数分のベクトルを準備して、その単語に割り当てられた要素だけ１にして他の要素は０にセットして単語を表します。

翻訳対象の日本語の語彙数を1万とすると、1万次元という高次元のベクトルの１要素だけが１でその他が０のベクトルで単語を表現します。

>ひとつだけ１で他は全部０なので**one-hotベクトル**と呼ばれています

###**出力データ・教師データ**
和文英訳の場合出力は英単語になります。
英単語の場合も語彙数と同じ次元のone-hotベクトルが使われます。

>**one-hotベクトル、どうしてこんな効率の悪い表現を使うのか？** 
10,000の語彙を表すために10,000次元のベクトルを使うのは非効率に見えます。

>1つの変数の要素を1~10,000にして単語に通し番号ふった方が効率的です。
なぜそうしないのでしょうか？

>単語はひとつの数字で表すことが出来るような単純な要素間の大小関係がありません。

>**お茶**という単語と**本棚**という単語どっちが大きいか？と言われても困りますよね。

>機械学習の処理の際も。どの単語も大小関係ないものとして処理をする必要がありますが、例えば**お茶**に1、**本棚**に10,000という値をつけてしまうと、機械学習の計算の際に**お茶**より**本棚**が10,000倍大きいものとして処理されてしまうのです。

>これを避けるために一見非常に効率の悪い表現にみえるone-hotベクトルという表現が使われています。

>**分散表現**
単語の意味を複数の数字で表現するアプローチも存在します。分散表現と呼ばれるものもその一つで、分散表現では単語間の類似度を複数のベクトルを使って表現します。

>one-hotベクトルが高次元だが1つの要素以外０なのに対して分散表現は低次元（例えば200次元）の要素（複数の要素が０以外の値を持つ）で単語間の類似度を表現（似た単語は似たベクトルになる）ようにするアプローチです

> *分散表現については今後の連載の中で詳細を記述する予定です*

#**まとめ**
今回は機械学習で扱われる入力データ、出力データがどんなものか説明しました。
次回は機械学習の内部処理について見ていきたいと思います。

バックナンバー
[ゼロから始める機械学習(1) そもそも機械学習とは何か？](https://qiita.com/kenrohmiyoshi/items/e2e01435b545df5c08b4)