分析作業とそこでの考慮が必要なこと
いよいよ実際の分析に入っていきます。ただ単に分析処理にかければいい場合もあるかもしれませんが、その分析処理においてのパラメータ設定が必要な場合があります。また、学習データに過剰に最適化されて他のデータに対する適合度が極めて低くなる「過学習」の問題もあります。
ハイパーパラメータのチューニング
機械学習のアルゴリズムには、外部から与える必要がある設定値(ハイパーパラメータ)を持つものがあります。図3は、Pythonでscikit-learnという機械学習ライブラリを用いてサポートベクターマシンを利用する例を示したものです。
ここでは、Cやgammaがハイパーパラメータです(それぞれどのような意味を持つかの説明はここでは割愛します)。このハイパーパラメータを調整することで、予測モデルの性能が大きく変化します。
最適なハイパーパラメータを探す方法として、「グリッドサーチ」がよく用いられます。グリッドサーチは図4のように、ハイパーパラメータごとに複数の候補値を持ち(つまり、Cなら1、3、10、gammaなら0.01、0.03、0.1のような値を用意する)、全ての組み合わせで分析を行い、予測モデルの性能指標となる何らかのスコアを求めます(予測モデルの性能指標については後編で詳しく述べます)。そして、スコアが最大となるハイパーパラメータの組み合わせを採用する方法です。
ただし、この方法ではハイパーパラメータの数が多い場合や、候補値の数を増やしたときに、組み合わせの数が非常に大きくなり、計算に時間がかかるという問題があります。対策の一つとしては、最初は各ハイパーパラメータを大きく区切り、性能が良さそうなところに当たりをつけてから、その周りを細かく調べるという「多段グリッドサーチ」があります。
また、グリッドサーチよりも効率よく最適なハイパーパラメータの探索を行うために、これまで探索した結果から、次に試すべきハイパーパラメータを決定する「ベイズ最適化」という方法もあります。
学習データにだけ過度に適合してしまう過学習
前節で、ハイパーパラメータの調整により予測モデルの性能が大きく変化すると述べました。ここで一つ注意点があります。それは、学習データに最適化しすぎた結果、他の未知なデータに対しての予測結果が大きく外れてしまうようなモデルを導出してしまうという「過学習」です。
例を挙げて見ていきましょう。図5(a)は、xの値からyの値を予測するモデルを作成した例を示したものです。ここでのモデルは多項式として表現されるものです。図中のプロットが観測値を示しています。
線で示した図5(a)の予測モデルの式は、式(1)のような多項式になりました。

得られた予測式は全ての観測点を通っているので、誤差はゼロです。ここで問題になるのは、この予測モデルは未知のxからyの値を正確に予測することができるかどうかです。もちろん、yの値が本当に式(1)に基づいており、未知のxからyを正確に予測できる可能性もあります。
しかし、仮に観測値yの値が図5(b)の実線にノイズが乗って誤差が含まれたものだとすると、未知のx、つまり観測値にないxに対するyの予測値は実際のyとは大きくずれてしまいます。実際、図5(a)と(b)を比べると、一番左のプロットとその右のプロット中間のxが説明変数の値だとしたとき、(a)と(b)のそれぞれのモデルでは目的変数yの値が大きく違っています。
このように、予測モデルがすでに得られている手持ちのデータに過剰に適合してしまい、手持ちのデータに対する予測性能は高いが、未知のデータに対する予測性能(汎化性能)が低くなってしまう状態を「過学習(Overfitting)」と言います。
正則化により過学習を防ぐ
過学習を防ぐ方法の一つに「正則化」があります。これはモデルが複雑になることに対してペナルティを課すことで実現されます。先ほどの多項式の例ですと、過学習してしまうような複雑なモデルでは一般的に多項式の係数の値が非常に大きくなります。そこで、手持ちのデータに対する予測誤差を小さくすることだけを目指すのではなく、式(2)のように、手持ちのデータに対する予測誤差と係数の和を足したL(w)を求めます。このL(w)が小さくなるように係数の値を決定するといった手法があります。式(2)の右辺の第1項は予測誤差です。第2項は多項式の係数wjの和であり、この項を正則化項と言います。

正則化項にあるpの値は2や1が用いられることが多く、「p=2」のものを「Ridge回帰」、「p=1」のものを「Lasso回帰」と呼びます。λはペナルティの強さを決めるハイパーパラメータであり、分析者が設定する必要があります。
アルゴリズムによっては正則化項を持たないものもありますが、その他のハイパーパラメータを調整することで過学習を防ぐことが可能なアルゴリズムもあります。例えば、階層化されたIF-THEN形式のルールで予測を行う「決定木」では、木の深さの最大値を設けることでモデルの複雑さを制御することができます(図6参照)。
交差検証により未知のデータに対する予測性能を推定する
正則化などにより、モデルが複雑になりすぎることを防ぐことができますが、それにより過学習を防ぐことができているかを別途確認する必要があります。過学習とは、手持ちのデータに過剰に適合してしまい、「汎化性能(未知のデータに対する予測性能)」が低くなってしまう状態であると述べました。
そこで、手持ちのデータの一部をモデルの学習に使わずに取っておき、そのデータを未知のデータとして評価に利用するという方法が考えられます(図7(a)参照)。このように、手持ちのデータを学習用と評価用に分けることで、予測モデルが過学習していないかどうかを推定することが可能となります。
しかし、この方法は非常に多くのデータがある場合は良いのですが、そうでない場合は学習用データを多くすると、評価結果が少数のたまたま選ばれた評価用データに依存してしまい、評価用データを多くすると、学習に使えるデータが少なく、十分な学習が行えない、という欠点があります。
そこで、図7(b)のように、データをいくつかの集合に分割し、集合の一つを評価用データ、残りを学習用データとして評価を行うことを分割数分繰り返し、得られた評価結果の平均値を採用する、「交差検証(Cross-validation)」という手法が用いられます。この方法では、全てのデータを評価と学習に無駄なく利用することができます。
まとめ
本稿では、機械学習を用いたデータ分析プロセスについて、データの前処理、アルゴリズム選択、分析とそのときの注意点について述べました。機械学習を用いた分析自体はライブラリを利用して簡単に行うことができますが、正しい分析のプロセスを知らないと、適切な分析結果を得ることができないということをご理解いただけたと思います。次回は、分析結果の評価についてと、筆者が開発した、一連の分析プロセスの自動化と分析者の知識習得を支援するPythonのOSSライブラリMALSS(Machine Learning Support System)について説明します。
トップエスイーについて
「トップエスイー」は国立情報学研究所で提供している、社会人エンジニア向けのソフトウェア工学に関する教育プログラムです。トップエスイーでは講義や制作課題を通して、最先端の研究成果や現場で得られた知見が蓄積されてきました。その「アウトカム」、つまり成果やそこに至る過程を紹介し、現場のエンジニアの方々に活用していただけるような記事を連載することになりました。今回と次回は機械学習という難しい領域をより身近にできるツールであるMALSSを、トップエスイーの修了制作で取り組んだ結果を元に記事化しました。MALSSの使い方は次回に解説します。「修了制作」はトップエスイー受講者にとっての集大成となる課題で、3~6カ月かけて各自が特定のテーマに取り組むものです。2017年度からは、トップエスイーコースとアドバンス・トップエスイーコースの2つのコースとなり、修了制作は前者の「ソフトウェア開発実践演習」や後者のコース全体のカリキュラムに引き継がれています。
