機械学習メモ

機械学習

機械学習とは、その名のとおり機械(コンピュータ)に学習をさせることです。機械は学習によって、数値や画像などのデータが与えられた時に、その数値から未来の予測をしたり、画像に写っている物体を識別したりできるようになります。 機械学習は、入力(質問)→モデル→出力(回答)という構成になっています。 機械学習のプロセスは次のステップで進みます。

・機械に大量の学習データを入力する
・学習データから特徴量を抽出し、学習モデルを作成する
・学習したモデルの性能を評価し、精度を上げていく
・学習モデルに未知のデータを入力し、未来の予測や識別結果を出力として得る

ディープラーニング

ディープラーニングとは、機械学習の1分野であり、ニューラルネットワーク(後述)の中間層を多層化することで、学習データに含まれる潜在的な特徴をとらえ、正確かつ効率的な判断を実現する手法のことです。 ディープラーニングによって、局所的特徴から、大域的で抽象度の高い特徴に至る、階層構造をもった特徴表現(内部表現、潜在表現)をデータから学習することが可能になりました。 ディープラーニングでは、多層構造のニューラルネットワークに、学習データとして、大量の画像やテキスト、音声データなどを入力することで、コンピュータがデータに含まれる特徴を自動的に学習していきます。例えば、ネコが写った大量の画像を学習データとして与えることで、コンピュータが自動的にネコの特徴を学びます。 AI、機械学習、深層学習(ディープラーニング)で用語を混同しがちになりますが、「AI(人工知能)⊃機械学習⊃深層学習(ディープラニング)」という関係であると覚えておいてください。最も広義な範囲を持つのがAIであり、機械学習とディープラーニングを内包しています。また、機械学習はディープラーニングを内包しています。

機械学習の手法

教師あり学習

機械に学習のためにデータを入力する際に、学習に使用するデータ(学習データ)と同時に、学習データが何であるかを明示するラベル(教師データ)を与える学習方法です。 例えば、学習データとしてネコが写った画像を大量に与え、それと同時に「これはネコの画像である」とラベル情報を与えることによって、機械は画像からネコの特徴を学びます。そうしてネコを識別できるモデルが作成され、作成されたモデルにネコが写った画像を入力すると、「この画像にはネコが写っている」という出力を得られます。 大別すると、教師あり学習によって「回帰」と「分類」ができるようになります。

教師なし学習

教師データを使わずに、機械にデータの本質的な構造(特徴量)を発見させる学習方法です。 教師なし学習によって、入力をカテゴリにクラスタリングしたり、抽象化したりできるようになります。 有名な教師なし学習の手法として、クラスタリングがあります。

強化学習

ある環境内におけるエージェントに、試行錯誤を通じて価値(報酬)を最大化する行動を発見させる学習方法です。 エージェントは環境の状況に基づき行動を選択し、最終結果もしくは途中経過に対してどの程度良かったかを示す報酬を得て、これらの報酬をなるべく大きくするように探索します。強化学習は機械が自律的に学習します。

ラベル

現実世界では物の表面に貼り付けて名称などを記載するシールですが、機械学習の分野では、そのデータが何であるかを示す答えを表します。 データにラベルを付けることを、ラベル付けと言います。 ラベルは、誰が見ても同じ基準で分類できるラベル体系が理想です。人間が曖昧だと感じるラベルは機械でも上手に扱うことができません。 また、1人の偏った判断基準でラベル付けをするのは好ましくなく、複数人で同じデータに対してラベル付けをすることで、できる限り普遍的な判断基準でラベル付けをした方が良いです。

データの扱い

機械学習でより良い成果を出すために最も重要なのは、十分な量かつ品質の良い学習データの集まりのデータセットを準備することです。 データセットの準備は機械学習のスタート地点にあたり、ここで良いデータセットが準備できなければ、以後のプロセスでも満足のいく結果を残せません。 良いデータセットとは、端的に言うと「高品質から低品質まで人間が認識できるデータが揃ったデータセット」です。 例えば画像データの学習でいうと、高画質かつ余計なもので隠れたりしていない高品質なリンゴの画像ばかりで学習した場合、ちょっとリンゴがぼやけていたり、何かでリンゴの一部が隠れていたりするだけでリンゴと認識できなくなる、融通の効かない識別モデルが作成されます。逆に、人間がリンゴだと認識できないほど低品質な画像で学習をすると、赤くて丸いものは全てリンゴだと認識する、実用性の無い識別モデルが作成されます。 一般に機械学習は、訓練データ、検証データ、テストデータの3種類のデータセットを使用します。 各種データセットの使用方法は下記のとおりです。最初に、訓練データを用いて学習モデルを作成する。次に、検証データを用いて、学習の結果を評価する。(学習で使用していないデータを使用すること)最後に、テストデータを使って作成したモデルの性能を評価する。(学習でも検証でも使用していないデータを使用すること) 過学習を避けるためにはこの3種類のデータセットに分ける必要があります。特に、テストデータは学習にも検証にも使用しないデータであることが必須となります。

■データセット
教師あり学習で使用する、入力データとその正解ラベルがセットのことです。

■訓練データ(学習データ、トレーニングデータ) 
モデルの最適なパラメータを探索するためのデータのことです。

■検証データ 
学習したモデルの汎化性能や、過学習を起こしていないかを検証するデータのことです。

学習率の最適化

学習率とは、機械学習の最適化においてどのくらい値を動かすかというパラメータのことです。 学習率には次の特徴があります。学習率の値を小さくしすぎると、収束までの時間が延びる。学習率の値を大きくしすぎると、収束しなくなる。学習率の値を適切な範囲で大きく設定することで、学習が早く進む。 ディープラーニングは大量のデータを機械に読み込ませることで実施しますが、その際に人間があらかじめ設定をしておかなければいけない、ハイパーパラメータというパラメータ(外から与える値)があります。このハイパーパラメータの値によってモデルの性能が変化するため、適切な値を設定する必要があります。■最適化 損失関数の値をできるだけ小さくする、つまり、つまり最も予測誤差が小さくなるパラメータを見つけることです。 ディープラーニングの学習の目的は、この最適化を実現するためとも言えます。<最適化手法の例>AdamSGDRMSprop

AI開発の進め方

1.構想フェーズ
ビジネス課題に対してAIが十分な解決策となるのかを検討し、その解決に向けてどのようなAIモデルを用いれば良いかを構想するフェーズです。

AIは万能な技術では決してないため、開発しようとしているAIが本当に課題解決につながるのか、課題のうちどの領域をAIによって解決するのか、導入によって自社にメリットをもたらすのか、その構想は実現可能なのかなど、ビジネスとAIの双方の観点からの検討を行います。

2.PoCフェーズ
構想フェーズでAI開発の内容が具体的に決まったら、次はPoCフェーズへ移行します。PoC(Proof of Concept)は「コンセプト(構想)の証明」という意味で、構想フェーズで想定したAIが技術的に実現可能かどうかを実際に検証します。

AIの仮モデルとなるモックアップを開発し、機械学習やディープラーニングに必要なデータの量と質が確保できているか、期待した精度は出せるか、処理スピードは費用対効果に合っているか、出力に誤りがあった場合のオペレーションは上手く回るかなどの要素を検証します。

3.実装フェーズ
PoCフェーズでその実現性が確認できたら、モックアップの開発内容をベースに最終的なシステムとして完成させる実装フェーズへ移行します。

本番環境に必要な要件を定義し、開発を進め、AIのモデルを最終化していきます。完成後にはテストを行い、問題なく動作するかどうかの検証はもちろんのこと、ビジネス上の実務オペレーションも踏まえた稼働につなげます。

4.運用フェーズ
実装フェーズの次には、そのAIを適切に運用していくための運用フェーズに移行します。システムが安定して稼働するための保守に加え、構想フェーズで設定した目標達成状況の確認を都度行い、PDCAサイクルを回していきます。

機械学習の手順

1.ライブラリを読み込む
2.学習データを読み込む
3.データの特徴・構造を理解する
4.データを整形する
5.データを分割する
6.学習する
7.精度を測る

具体的なコードの書き方は次以降のパートで解説するため、ここではおおまかな流れを理解することを意識しましょう。
それぞれの手順を詳しく説明していきます。

1.ライブラリを読み込む

まずは使用するライブラリをimportしましょう。
機械学習するときはデータを扱うためにNumPyとPandasも使われるのでそれもまとめてimportします。
NumPyやPandasについては詳しくは前のチャプターを参照してください。

2.学習データを読み込む

学習に使用するデータを読み込みます。
Pythonでは前のチャプターで扱ったPandasを使ってデータを読み込みます。 Pandasについては詳しくは前のチャプターを参照してください。

3.データの特徴・構造を理解する

データを予測するに当たって、用いるデータについて理解することは大切です。
次の手順4のデータ整形に向けてデータの特徴を掴み、構造を理解しましょう。
具体的には、どんなcolumnがあるのか、どんな型のデータが入っているのかなどを調べます。
欠損値の有無や数値データの分布などもここで把握しておきましょう。

4.データを整形する

手順6に向けて、読み込んだデータを機械学習モデルが学習できるようにデータを整形します。
機械学習の文脈ではデータの 前処理 と呼ばれる工程です。
具体的には、機械学習モデルが扱えるようにデータを数値に変換し、データ全体が行列になるように変換します。ここで行列を扱うために、前のチャプターで扱ったNumPyが必要になってきます。
代表的な操作としては、

  • データが複数のファイルにまたがっていればPandasを使ってデータ同士を結合する

  • 欠損値に対処する

  • データの型を変換する

  • 特徴量を工夫する

などが挙げられます。
特徴量 とは「学習の入力に使う測定可能な特性」と定義されています。
つまり、最初に読み込んだデータではなく、実際に学習器の入力として使うデータのことです。
特徴量を工夫するということは、前述したデータを行列に変換する際に、最終的にどういう行列にするのかを工夫するということになります。
これは 特徴量エンジニアリング と呼ばれる作業になります。
例えば、string型のカテゴリーデータ(例えばmaleとfemaleなど)があれば、各カテゴリーを数字に置き換える(maleを0, femaleを1とする)操作をすることで、学習器の入力に使えるようになります。
カテゴリーデータを数字に置き換えるだけなら単純ですが、日付データや自然言語(日本語や英語)のデータがあれば、それも何らかの形で数値に変換する必要があります。
数値への変換には様々な手法があり、状況によって手法を適切に選んでいく必要があります。
特徴量エンジニアリングについては次のチャプターでより詳しく扱います。

5.データを分割する

データの行列ができたら、データを分割する工程があります。
機械学習では読み込んだデータの全てを使って学習するわけではありません。
読み込んだデータを学習用データテスト用データに分けます。
データを学習用とテスト用に分割する理由は、学習用データで学習したモデルの精度をテスト用のデータで測定するためです。

また、データを予測したい値の列と、予測するために使いたい値の列にも分けます。
予測したい値は 目的変数 、予測するために使いたい値は 説明変数 とそれぞれ呼ばれます。
例えば、犬猫の判定なら、犬か猫かを示す値が目的変数になり、身長や体重や寿命などが説明変数になります。 目的変数にしたい1列を取り出し(PandasのSeries型になる)、NumPy型の配列に変換します。このとき、作成したNumPy型の配列の変数名をyとするのが慣例になっています。
説明変数にしたい列、ほとんどの場合は複数の列を取り出し(PandasのDataFrame型)、これもNumPy型の多次元配列に変換します。このとき、作成したNumPy型の多次元配列の変数名をXとするのが慣例になっています。

ここまでの操作をまとめると、

  • 学習用の目的変数(y_train)

  • 学習用の説明変数(X_train)

  • テスト用の目的変数(y_test)

  • テスト用の説明変数(X_test)

の4つができたことになります。

6.学習する

使用する機械学習アルゴリズムを選択し、そのアルゴリズムのモジュールをimportします。
学習器のインスタンスを生成し、手順5で作成した学習用のデータを学習器に入力として与えます。
学習する工程を fittingする と言うこともあります。fittingという言葉を使う由来は最適化を学ぶとわかるでしょう。
また、使用する機械学習アルゴリズムの選択方法については次のチャプターで詳しく扱います。

7.精度を測る

最後に、テスト用データを使ってfittingされたモデルの精度を測定します。
分類問題なら何%正解するのか、回帰問題なら予測した値と実際の値にどれくらいの差があるのかなどを測定します。

これで機械学習、特に教師あり学習の手順を一通り追うことができました。


この記事が気に入ったらサポートをしてみませんか?