LogoMark.png

データサイエンス/2021/1217

第14回 機械学習・序説

データサイエンス/20212021.12.17

AGENDA


以下、LIVE動画をご覧下さい。記事に沿って解説します。
記録動画は、学科サイトの特設ページ(要ログイン)に移動しました。



CONTENTS




はじめに

単位認定について

授業アンケートの結果

33名の方からご回答いただきました。以下に結果をCSVで公開しています。
https://github.com/koichi-inoue/DataScience/blob/main/questionnaire_results.csv

日本人の ICT・AI に関する意識が危機的状況である件

https://robotstart.info/2018/06/04/accenture-ai-report.html



機械学習とは

機械学習(Machine Learning:ML) とは、データサイエンス、あるいは人工知能研究における手法の一つで、大量のデータを利用した反復的な学習(人間が行っている学習と同様のプロセス)によって、コンピュータ上にパターン認知や推論のためのモデルを構築する技術です。

コンピュータに与えるのは、学習ルールと、学習素材のデータセットで、コンピュータ自身が大量のデータから推論のルールを自動的に学習します。例えば、ヒト、犬、猫の大量の画像と、その画像がヒトか、犬か、猫かの「答え」です。この画像はヒト、この画像は犬・・と大量に与えていくことで、識別する能力が学習され、その「経験」が豊富になることで、識別能力が上がっていくのです。小さな子供に「これは犬です」、「これは猫です」・・と教えていくのと同じ手順です。

このときコンピュータの中に自動的に出来上がる「入力と出力の関係づけ」のことを「モデル」というのですが、与えるデータが画像であれば、画像認識モデルができあがり、音声を与えつづければ、音声認識モデルができあがります。

従来、物事の判別は人手によるプログラミング( if 条件文)で実装していましたが、現在の AI 、例えば自動運転における画像解析、買い物行動の動作解析、オンラインショップのレコメンド機能、スパムメールの検知など、いわゆるパターン認知機能と呼ばれるものの大半は、この機械学習によって実装されています。

機械学習で可能になるのは大きく2つ、「予測」と「発見」です。


機械学習のイメージ

従来のAI(エキスパートシステム)と何が違うのか、そのイメージをざっくりと掴んでもらうための図解です。

ML.jpg


機械学習の応用先

機械学習のタイプ


教師あり学習|Supervised learning

教師あり学習とは、学習のときに正解のラベルを使う手法で、既知の情報を用いて未来を予測する予測器を作ることを目指します。一般に問題(説明変数)と答え(目的変数)のセットからなる大量のデータを必要とします。主にカテゴリを予測する「分類」と、実数値を予測する「回帰」があります。手法としては、ニューラルネットワーク、線形回帰などがあります。

今最も実用化が進んでいるのがこの分野です。要するに、大量の過去のデータから現象を記述するモデルを作成し、それを用いて未来に起こることを予測する・・。これは基本的には、私たちの脳が「経験を積むことで、未来予測ができるようになる」という話と同じですが、コンピュータの記憶容量と処理の高速化が進んだことで、それが人知を超えたレベルで実現できるようになったのです。

教師なし学習|Unsupervised Learning

教師なし学習とは、学習のときに正解のラベルを使わずに、機械学習モデルに自力でデータの法則性を見つけさせる手法で、サンプルをグループ分けする「クラスタリング」や、高次元の変数(多変数)を低次元に減らす「次元削減(次元圧縮)」などがあります。k-means法、PCA(主成分分析) などの手法があります。

強化学習|Reinforcement learning

強化学習とは、正解ラベルの代わりに「報酬」を使う手法です。とるべき「行動」に無数の選択肢があり、明確な「答え」をあらかじめ与えることが難しい場合、「報酬」の大きな行動に高いスコア、「報酬」の少ない行動に低いスコアを与えていくことで、どう振る舞えば最大の報酬が得られるかを学習する・・というタイプのもので、囲碁や将棋などの AI に利用されています。



Pythonによる分類(教師あり)プログラムの事例

Python の機械学習ライブラリ Scikit-learnを使って手書数字を認識するプログラムを概説します。

配信後の付記

解説動画では、話の流れからニューラルネットワークを利用したものと
誤解を与えているかもしれませんが、このサンプルで利用しているのは
ニューラルネットワークではなく、SVM(サポートベクターマシン)
というアルゴリズムです。


サンプルコード

https://github.com/koichi-inoue/DataScience/blob/main/DigitRecognition.ipynb

データ読み込み > 訓練データとテストデータに分割 > 学習(fit)> 予測(predict)> 評価(score)という流れが開発の定番スタイルです。

1. ライブラリとデータセットの読み込み

from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn import svm
from sklearn import metrics

digits = datasets.load_digits()


2. 学習用データとテストデータの用意

X = digits.data
y = digits.target
X_train, X_test, y_train, y_test = train_test_split( X, y, test_size = 0.2 )

一般に、train は訓練データ、test は評価用のテストデータの意味です。
関数モデルを y = f(X) と書いた場合の、X が説明変数で、y が目的変数です
一般に ベクトルである X は大文字、値である y は小文字で書くのが慣例です。

3. アルゴリズムの指定と学習

clf = svm.SVC( gamma=0.001 )
clf.fit( X_train, y_train )

clf は一般に classifier(分類器)の略です。

4. モデルの評価

accuracy = clf.score( X_test, y_test )
print( "正解率 {accuracy} ")
predicted = clf.predict( X_test )
print( metrics.classification_report( y_test, predicted ) )

predict は「予測」の意味です



用語解説

説明変数と目的変数

関数モデルを y = f(X) と書いた場合の、X が説明変数で、y が目的変数です*1
説明変数と目的従変数という用語は、統計ソフトやライブラリーによって、異なる用語が使われる場合があります。以下いずれも同様の用語セットです。

\( x \) \( y \)
独立変数(independent variable)従属変数(dependent variable)
説明変数(explanatory variable)目的変数(target variable)
特徴量(feature / attribute)ラベル(label)
データ(data)ターゲット(target)
予測変数(predictor variable)応答変数(response variable)
入力(input)出力(output)


学習用データとテストデータ

機械学習(教師あり)では、手持ちのデータを「学習用データ(訓練データ)」と「テストデータ」で分けるのが一般的です。

手持ちのデータを全て学習用データとして使うと、そのデータに過度に適合したモデルができてしまい(これを過学習といいます)、現実の予測に使おうとした場合に逆に精度が低くなってしまいます。そこで、一般には学習用データとテストデータに分割して、学習状況をテストデータでチェックしながら、テストデータに対して最も良い性能が出るように調整を繰り返します。



機械学習体験

Teachable Machine

https://teachablemachine.withgoogle.com/

TensorFlow Playground

https://playground.tensorflow.org


JavaScriptライブラリ ml5.js

https://ml5js.org/

ml5.jsは TensorFlow.js をベースにしたJavaScriptの機械学習ライブラリーで、学習済みモデルを簡単に利用することができます。p5.js(Processing) との親和性もよく、アーティストやクリエイターにとって、気軽に楽しいコンテンツ制作が体験できる環境を提供してくれます。

APPENDIX|関数と線形回帰


関数の式

関数とは「入力と出力(ああすればこうなる)」の関係を表したモデルです。

y = f ( x )

教科書に出てくる関数の式ですね。ここで嫌になる方もいるかもしれませんが、もう少しお付き合いください。関数 f を一次の関係式と仮定すると、

y = ax +b

と書くことができます。この「a, b によって特徴づけられた、入力x と 出力y の関係」というものが、物事の背景にある原理、未来を予測するためのモデル・・ということになります。

数学の教科書であれば・・

2つの点 (2,5) , (4,9) を通る直線の式を y = ax + b として、 a ,b の値を求めよ・・みたいな問題で、

5 = 2a + b
9 = 4a + b

これを解いて、a = 2, b =1 ( 直線の式は y = 2x + 1)が答えです。

ここまでだと全然面白くないのですが、では「 x = 10 のときに y はいくつ?」という問いになると( 2 x 10 + 1 = 21 )、これがいわば「未来予測」で、少しは役に立ちそうな話になってきます。

しかし、現実的ではありません。

LeastSquaresMethod.png

実際の問題になると・・

数学の問題というのは、与えられるデータの数も値も、手計算で綺麗な解が導けるように与えられますが、実際の問題では、与えられるデータは必ずしも綺麗に直線上には並びません。例えば (2,5) , (3,6) , (4,9) だったりします。

y = ax + b という直線的な関係を前提とした場合、データが2件であれば連立方程式を解いて a,b の解が求まりますが、3つ以上になると「解なし」つまり、普通の数学の問題としては回答不能になります。

しかし、実際に複数のデータをグラフにプロットすると、明らかに比例関係が見てとれます(右上グラフ)。であれば、その関係を表現するための aとb を見出すことには意味があると言えるでしょう。

現実世界から得られるデータには様々な誤差が含まれていたり、他の要因が影響していたりして、その値はブレるのが普通です。手計算で綺麗に解けるものなどありません。

そこで実際には、最小二乗法という回帰分析の手法を使ってパラメータ a,bを推定するのですが*2、結果からいうと、上記の3つのデータから推定されるのは、a=2.0, b=0.67 となります。もし、入力(x)が 16 であると想定すると、予測値(y)は、32.67 となります。

データサイエンスがやろうとしていることは、基本的にこの応用です。関数モデルをつくって「前提(x)がこうなら、結果(y)はこうなる」といったようなことを予測できるようにしたいわけです。

実際の現象は非常に複雑で、要因(変数)が多数ある(x0, x1, x2, x3, ・・・)だけでなく、それらが重層的に絡みあいます。この関数は非常に複雑なものになるので、関数の形を現実の予測に役立つようにするには過去の経験データも大量に必要になります。

プログラム例

上記の計算を実際に行うプログラムの例を以下に掲載しています。
https://github.com/koichi-inoue/JupyterNotebook/blob/master/LeastSquaresMethod.ipynb


線形回帰とは

線形回帰(Linear Regression)とは、説明変数 X と目的変数 y との関係、つまり \( y = f ( X ) \) となる関数 \( f \) を求める代表的な手法です(教師あり学習|回帰)。

線形とは、文字通り説明変数と目的変数の関係を表すグラフが直線(2変数の場合は平面・・)になるもので、関係式は以下のような一次式の結合(線形結合)で表現されるます。複数のデータセットから、最適なパラメータ wi を求めることで、あらゆる状況下での y を予測できるようになります。

 y = w0 + w1・x1 + w2・x2・・・ + wn・xn

計算は、上記の式が表す多次元の「直線」と実際のデータとの二乗誤差(距離)が最小になるように wi を求めます。最小二乗法といいます。


付記:X(大文字)と y(小文字)について
一般に目的変数(出力)に対して説明変数(入力)の方が数(次元)が多いので、プログラムでは y は小文字、X は大文字で書いたりします。

PAGES

GUIDE

TOOL

DATA


*1 一般に入力の方が数(次元)が多いので y は小文字、X は大文字で書いたりします。y が値とすれば、X(大文字のエックス)はベクトル、 y がベクトルとすれば、Xは行列・・というイメージです。
*2 単回帰の問題で、2次元的に散布図が描き出せるのであれば、グラフ上に定規で直線を引いて「傾き」と「切片」を見出すかたちでも実用上はほとんど問題ありません。コンピュータに頼らなくても答えは出せる・・という柔軟な感覚も必要です。
Last-modified: 2021-12-17 (金) 08:46:38