2021年12月13日月曜日

機械学習でのFeature Engineering(特徴量設定)体験

【what is this】ディープラーニングでは、「必要な特徴量は自動的に見つけてくれる」とも言われますが、多くの場合、人間による慎重な特徴量設計が必要([1], [2])となるでしょう。この分野の定番MNIST(手書き数字認識)と同様に有名なものとして、「タイタニック号の乗客の生死」に関するデータセット([3], [4])があります。今回はこれに関する機械学習を行うえで、どのように特徴量を設定すべきかを、参考資料[3]に従って体験しました。

■ タイタニック号の乗客のデータの機械学習 
 本稿は、Gant Laborde氏による書籍[3]第9章の解説の追体験記になります。乗客のデータは、図1「(1)原データ」にあるとおり、全部で12種の特徴量(12カラム)からなります。氏名、年齢、性別などの他に、Survived(生/死)が含まれています。整数値、実数値、文字列などの値が含まれています。

 総計1,309名分ありますが、機械学習の観点から、train用891名分、test用418名分に分けられています。そして、目的は、Survived(生/死)をラベル(教師信号)として、train用データを学習させ、その学習結果を使って、test用データ(validation用データとも呼ぶ)の乗客のSurvived(生/死)を予測させ、正解率を計算することです。

■ 機械学習のために、適切に特徴量を設定(Feature Engineering)
 図1(1)原データにおいて、上記の機械学習にとって、寄与度が低いと考えらるものは除外した方がよいです。ここでは、「(2)不要カラム削除」にあるとおり、4要素を除外しました。これを元に、以下の2つのデータセットを作りました。

NaiveDataset
 一つでも空白の(値の無い)セルを含む行を削除します。さらに、SexEmbarkedの値が文字となっているので、これをカテゴライズして、整数値(0,1,2など)に変換します。

FeaturedDataset
 NaiveDatasetに対して、Sexを削除して、新たに2つの特徴量としてmalefeamaleを追加します。さらに、年齢層(10歳未満、40歳未満、40歳以上)を表すAgeBucketを追加します。そして、各特徴量の値を、MinMaxScalerで、0〜1の間の実数値(両端値を含む)にスケーリングします。
 この3つの特徴量を追加した理由は、図2にあります。実は、この悲劇の事故は映画化されたのですが、その中で、多くの乗客が、"Women and children first!"と叫んでいるそうです。図2をみると、それが事実だったことが分かると思います。すなわち、男に比べて女の生存率が圧倒的に高い!また、子供の生存率も大人よりもかなり高いのです。


 この事実は、機械学習に大きな影響を与えるはずです。上で、3つの特徴量を新設したのは、この事実をより強く反映させるためです。maleとfemaleはそれぞれone-hot型にしました。AgeBucketは、3段階に区分けしました。

■ 特徴量の設定の機械学習への効果
 上記のとおり、不要のカラムを削除しただけの「NaiveDataset」と、特徴量を新たに設定した「FeaturedDataset」を用意しました。これらを、図3に示すNeural Network(TensorFlow.js使用)で学習させた結果を示します。


 図3の上段にあるとおり、Validation Accuracyの比較では、FeaturedDatasetに対する正解率0.89は、NaiveDatasetに対する正解率0.83に対して、意味のある向上が得られていると言えます。また、Train AccuracyよりもValidation Accuracyが高くなっていることは、over fittingになっておらず、好ましい学習が行われたことを意味します。つまり、原データにある特徴量をそのまま使うのではなく、データの特性を考慮して特徴量を設計する必要があることを体験できたと思います。

■ Tensorflow.jsについて
 ここで参考にした書籍[3]は、TensorFlow.jsプログラムをNode.jsサーバで動かす例題を示しています。しかし、小生のMac環境では、Nodeを正常に動作させることができなかったので、独自に、通常のWebサーバで実行できるように改変しました。その過程で、TensorFlow.jsの詳細を学ぶことができました。
 また、入力データの様々な加工には、Python環境でのPandasに相当するDanfo.jsを使うことができました。このDanfo.jsの利用によって、上記で述べたFeaturedDatasetの作成を効率的に行うことができました。

参考資料
[1] 
ディープラーニングは自動で特徴を抽出してくれる?
https://www.hellocybernetics.tech/entry/2019/06/23/010201
[2] 機械学習に欠かせない、特徴量とその選択手法とは
https://ainow.ai/2020/07/14/225092/
[3] Gant Laborde:"Learning TensorFlow.js - Powerful Machine Learning in JavaScript", O'Reilly, 2021-05-07.
[4] codexa増田秀人,ウイリアム・スタイメル:"機械学習のプロセス徹底解説-タイタニック号から生還できるのは誰?", 日経ソフトウェア, 2019年1月号, pp.6-27.

0 件のコメント:

コメントを投稿