今回も前回に引き続いてpythonをベースにしたAIプログラミングをご説明していきたいと思います。本記事は初学者にも優しい内容で構成されているために機械学習など門外漢という方にうってつけのコンテンツとなっています。是非一読ください。

どのようなシナリオで機械学習を行うのか?

機械学習を実践する上で、どのような手順を踏む必要があるでしょうか。ここでは、機械学習の実践に必要となる基本的な手順について紹介します。

機械学習のシナリオ

機械学習を業務に取り入れようという場合、どのような手順で行ったら良いのでしょうか。通常のプログラムを作るときも、目的の決定(仕様書の作成)、実装、テスト、リリースといった具合に基本的な手順があります。それと同じように、機械学習のプログラムを作成する上でも基本的な手順があります。ここでは、その手順を紹介します。

機械学習の基本的な手順

では、機械学習の基本的な手順を確認してみましょう。

図解:機械学習の流れ

箇条書きすると、次のような手順となります。

(1) ゴールの決定

(2) データの収集

(3) データの整形·加工

(4) データを学習

(4-1)機械学習の手法を選択
(4-2)パラメーターの調整
(4-3) データを学習してモデルを構築

(5) モデルを評価

(6) 十分な精度がでなければ(4)に戻る

(7) 業務で活用

詳しく見てみましょう。手順(1)では、機械学習のゴールを決めます。この作業が一番大切な作業になります。機械学習を利用して何がしたいのか(ゴール)が暖味なままでは、どんなデータを集め、どのようにデータを整形し、学習してモデルを生成するのかといった、この後の手順で行うことを決めることができません。目的や仕様書のないプロジェクトが容易に暗礁に乗り上げるのと同じで、ゴールのない機械学習プロジェクトが成功することは難しいと言えるでしょう。

手順(2) では、機械学習に与えるデータを収集します。このデータを集めるのがたいへんな作業です。ある一定量の学習データを準備しなくてはなりません。なぜなら、学習データが不足していると、未知のデータに対して正しく判定できないからです。では具体的にどのようにデータを収集するのでしょうか。まず、(1) で考えたゴールを達成するためにどんなデータが必要かを検討します。次に、そのデータを収集するための方法を検討します。既存の業務データ(DBに蓄積されているものなど)から流用できるか、新たに収集しなければならないかといった具合にです。そして最後に、検討した方法に従って実際にデータを収集します。

手順(3) では、収集したデータを整形します。どのように整形するかはモデルの評価に直結するところなので、慎重に検討する必要があります。もちろん、収集したデータがそのままデータとして利用できる場合もありますが、多くの場合は、データに含まれる特徴を抽出する作業が必要になります。この作業を「特徴抽出」と呼びます。また、どのように入力したら良いのか、つまり、どのように特徴抽出を行うのかを考えなくてはなりません。そして、データを学習器が求める形式(特定の実数の配列)に合わせる必要があります。

手順(4)では、実際にデータを学習させます。このとき、(4-1) にあるように、どのような手法(アルゴリズム)を利用して学習するのかを指定します。機械学習と一言で言っても、この手法で行うという決定打はなく、実際には複数の学習アルゴリズムから適切なものを選択するのが一般的です。(4-2)で、データに応じたパラメーターを指定します。そして(4-3) にあるように、データを学習器に与えてモデルを構築します。

手順(5)では、テストデータを用いてどれくらいの精度が出るのかを確認します。そして、手順(6)にあるように、満足のいく結果が出なければ (4) に戻って、手法やパラメーターを見直すなど、チューニングを行います。

ポイント

・機械学習を行う前に、どのように機械学習を業務に導入するのかシナリオを考えておく必要がある

・データの収集→整形·加工→学習→評価のように、機械学習で行う基本的な手順がある

過学習について

機械学習において『過学習(overfiting)』とは、学習のしすぎが原因で、未学習の問題に対して正しい答えを出せなくなってしまう現象を言います。学習しすぎると、正しい答えが出せないとはどういうことでしょうか。機械学習のシステムにデータを学習させてみたところ、非常に良い精度が出たとします。しかし、学習に利用していない新規のデータ(未学習のデータ)で試したところ、まったく役に立たず、がっかりしてしまうことがあります。それが『過学習』です。そもそも過学習が起きる原因は、学習用のデータに特化しすぎて、それ以外のデータに対して正しい判断ができなくなることです。学習をしすぎてしまうことによって判断の基準が厳しくなるため、少しでもパターンが異なると誤った答えを出カしてしまうのです。こうした過学習のことを「過剰適合」とも言います。これは機械学習の落とし穴とも言える状態です。テスト勉強に例えるなら、ヤマを張って特定の分野の問題ばかり解いた場合がこれに相当します。その分野の問題が出れば、良い点が取れるもののヤマが外れると、散々な結果になってしまうのです。過学習を防ぐには、偏った学習をやめることです。すなわち、ヤマをはらず、バランス良く学習すれば良いということです。ですから、精度が出ない場合には、学習に用いるデータが少なすぎたり、偏っていないかを確認する必要があります。また、データの量に対して問題が複雑過ぎるのかもしれません。その場合、学習データの件数を増やしたり、アルゴリズムを変更したり、機械学習の手法を考え直すなどの対策を講じる必要があります。

Memo

「次元の呪い」についてそもそも、使えそうなデータを何でも学習の対象に加えてしまうと、十分な性能を発揮できたくなります。扱う特徴量(次元)が多くなりすぎると、機械学習モデルが効率よく分類(キも回帰)できなくなるのです。これを「次元の呪い(curse of dimensionality)」と呼びます。これを簡単な例えで考えてみましょう。ラーメン屋で好みのラーメンを注文するとします。そのときに、スープの味という特徴量だけがあるなら、「味噌ラーメン」「醤油ラーメン」「豚骨ラーメン」の3種類から選ぶだけですみます。しかしこれに、麺の堅さ(柔らかい·普通·堅めの3種類)という特徴量が加わると、3×3で9通りから選ぶことになります。さらに、油の量(控えめ、普通·多めの3種類)という特徴量を加えると、3×3×3で27通り、そしてニンニクの量(なし少なめ·普通,多め)という特徴量を加えると、3×3×3×4で108通りとなります。さらに、卵やメンマという特徴量を加えていくなら、指数関数的に組み合わせが増えていきます。これらのオプションをすべて指定するなら、おおごとになってしまいます。機械学習においても同じ事が言えます。そのため、不要な特徴量を削ることで、より良い性能を引き出すことができます。

いかがでしたでしょうか?プログラミングを用いてどのように機械学習が実行されその結果としてどう実務反映させるのかフローを通して全体像が感覚的に掴めたかと思います。次からはAI機械学習を行う前の下準備についてお伝えして行こうと思います。