第14回 機械学習・序説
データサイエンス/2021|2021.12.17
AGENDA
- 以下名簿が表示されます。出欠確認・座席記録をお願いします。
出欠確認・座席記録 - 講義はこのページの内容を解説するかたちで遠隔 LIVE 配信します。
- 質問等は YouTubeLive のチャットまたは LINEの 20ASグループからどうぞ。
学科サイト|受講生一覧
以下、LIVE動画をご覧下さい。記事に沿って解説します。
記録動画は、学科サイトの特設ページ(要ログイン)に移動しました。
CONTENTS
はじめに
単位認定について
- 当科目の評価は、釜堀教授と井上(貢) 50:50 で合算して行います。
- 井上(貢)担当分は、学科サイトにおける各回の事例演習への取り組み、および、自主的な学習のためのリンク共有等をもって評価します。以下を参考に、2022年1月7日までにページを整理しておいて下さい。
https://design.kyusan-u.ac.jp/socialdesign/?JohnSmith/DataScience
リンクを知っている全員が「閲覧可」にしてください。 - 釜堀教授から提示された課題は、釜堀教授あてに提出して下さい。
授業アンケートの結果
33名の方からご回答いただきました。以下に結果をCSVで公開しています。
https://github.com/koichi-inoue/DataScience/blob/main/questionnaire_results.csv
- 学籍番号から、専攻名と性別を抽出してカテゴリー項目を作成しています。
- 時間を数値で回答いただく部分に「3時間半」「10分」などと文字で回答いただいたものは「 3.5 」「0.17」などの数値に置き換えています。
- データの順番はランダムにシャッフルしています(学籍番号順でもなく、回答いただいた順番でもありません)。
日本人の ICT・AI に関する意識が危機的状況である件
https://robotstart.info/2018/06/04/accenture-ai-report.html
機械学習とは
機械学習(Machine Learning:ML) とは、データサイエンス、あるいは人工知能研究における手法の一つで、大量のデータを利用した反復的な学習(人間が行っている学習と同様のプロセス)によって、コンピュータ上にパターン認知や推論のためのモデルを構築する技術です。
コンピュータに与えるのは、学習ルールと、学習素材のデータセットで、コンピュータ自身が大量のデータから推論のルールを自動的に学習します。例えば、ヒト、犬、猫の大量の画像と、その画像がヒトか、犬か、猫かの「答え」です。この画像はヒト、この画像は犬・・と大量に与えていくことで、識別する能力が学習され、その「経験」が豊富になることで、識別能力が上がっていくのです。小さな子供に「これは犬です」、「これは猫です」・・と教えていくのと同じ手順です。
このときコンピュータの中に自動的に出来上がる「入力と出力の関係づけ」のことを「モデル」というのですが、与えるデータが画像であれば、画像認識モデルができあがり、音声を与えつづければ、音声認識モデルができあがります。
従来、物事の判別は人手によるプログラミング( if 条件文)で実装していましたが、現在の AI 、例えば自動運転における画像解析、買い物行動の動作解析、オンラインショップのレコメンド機能、スパムメールの検知など、いわゆるパターン認知機能と呼ばれるものの大半は、この機械学習によって実装されています。
機械学習で可能になるのは大きく2つ、「予測」と「発見」です。
- 予測:過去のデータから未知のデータに対する予測を行う(教師あり)
- 発見:過去のデータから未知のパターンを発見する(教師なし)
機械学習のイメージ
従来のAI(エキスパートシステム)と何が違うのか、そのイメージをざっくりと掴んでもらうための図解です。
機械学習の応用先
- 予測:数値予測、ニーズ・意図予測、マッチングなど
- 識別:情報の判断・仕分け・検索、音声・画像の認識、異常検知ど
- 実行:作業の自動化、表現生成、行動の最適化など
機械学習のタイプ
教師あり学習|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/
- サイト、アプリなどに使う機械学習モデルを簡単に作成できるウェブベースのツールで、独自の画像、音声、ポーズを認識するようコンピュータをトレーニングします。専門知識やコーディングは必要ありません。
- アカウント等の作成なしにその場で利用できます。
- プロジェクトは GoogleDrive に保存することが前提となっています。
TensorFlow Playground
https://playground.tensorflow.org
- ニューラルネットワークの仕組みを可視化してブラウザで直感的に理解できるようにしたサイトです。
- Google:TensorFlow Playground 使い方
JavaScriptライブラリ ml5.js
ml5.jsは TensorFlow.js をベースにしたJavaScriptの機械学習ライブラリーで、学習済みモデルを簡単に利用することができます。p5.js(Processing) との親和性もよく、アーティストやクリエイターにとって、気軽に楽しいコンテンツ制作が体験できる環境を提供してくれます。
- ImageClassifier
お手元の画像をDrag&Drop してお試し下さい。
- FaceApi WebCam
Webカメラの起動が求められます。カメラ画像はローカルで処理されています。転送はされていませんのでご安心下さい。
- PoseNet WebCam with p5.js
カメラに映った体の部位の座標を取得する poseNet のサンプルです。p5.jsを使うことで、コードは想像以上にシンプルなものになります。
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 )、これがいわば「未来予測」で、少しは役に立ちそうな話になってきます。
しかし、現実的ではありません。
実際の問題になると・・
数学の問題というのは、与えられるデータの数も値も、手計算で綺麗な解が導けるように与えられますが、実際の問題では、与えられるデータは必ずしも綺麗に直線上には並びません。例えば (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 は大文字で書いたりします。
- y が値だとすれば、X はベクトル
- y がベクトルだとすれば、X は行列