Googleの機械学習プラットフォームVertex AIには自動で機械学習のモデルを選択し、チューニングを行うAutoMLが導入されています。特に構造化データに対してはAutoMLテーブルというサービスがあり、誰でも簡単に機械学習モデルを構築、データ分析することが可能になりました。データによっては非常に高精度なモデルを生成することが可能で、kaggleのコンペで二位を獲得したこともあるようです。
しかし、ここで幾つかの疑問が生じます。実際のビジネスのデータを用いて分析する場合、AutoMLテーブルが生成するモデルは我々人間の生成したモデルと比べて良いものなのでしょうか?それとも、人間の直感と専門知識がまだまだ必要なのでしょうか?AutoMLがあればデータサイエンティストは必要ないのでしょうか?このブログではこれら疑問を解決するために、AutoMLについて解説した後、実際のビジネスで使用されるデータでモデルを作成、AutoMLの作成したモデルと比較させてみます。
最後には、Google AutoMLテーブルを使用して分かった利点、欠点、使用方法についてもまとめています。
Google AutoMLテーブルは、構造化データを利用した機械学習モデルの生成を自動化するGoogle Cloudのサービスです。データの前処理、特徴量エンジニアリング、モデル選択、学習、そして評価までのプロセスを一貫して自動で行なってくれます。これにより、ユーザーは機械学習の知識がなくても予測モデルを作成し、効率的にデータ分析を行うことが可能になると言われています。大規模なデータセットに対しても分析を行うことができ、BigQueryMLにも導入されています。
株式会社CyberOwlはテラコヤプラス(現:Ameba塾探し)という塾掲載サイトを運営しています。また、それぞれの塾のページを訪れた人の数やユーザーの行動履歴を取得し、BigQueryに保存することで、データの分析も可能としています。今回は機械学習を行えるサービス、BigQueryMLを使用し、一定期間に塾掲載ページを訪れる人数(IMP)の将来予測モデルを作成します。このBigQueryMLではAutoMLテーブルも使用できるので、それを使用してモデルを作り、私の作成したモデルとの精度を比べます。
今回の分析では現在までで取得しているデータを用いて将来の予測を行うため、時系列分析になります。機械学習のモデル生成を行うにあたって、データセットをトレーニング用、クロスバリデーション用、テスト用に分割させることが必要ですが、この時に時系列分析であることを考慮に入れなければなりません。特にBigQueryMLではデフォルトでデータセット分割方法がランダムスプリットとなっている場合が多いため、本来使用できないはずのデータを学習時に使用してしまうデータリーケージに注意する必要があります。
BigQueryMLのデータ分割方法には指定した時系列情報を使用して分割するSEQがあるため、これを使用してデータセットを分割しました。
特定のサイトのIMP(訪れる人数)を予想するためにはXGboostやDNNなどの複雑なモデルが必要であると考えられます。そこで有用であると考えられる特徴量をCyberOwlで収集、保存しているデータの中から、目的変数のIMPとの相関係数などを参考にしながら選定しました。
XGBoost(Extreme Gradient Boosting)は、勾配ブースティングアルゴリズムを最適化したもので、高速かつ効率的な実行が特徴です。特徴量と目的変数との複雑な関係性を掴むことができ、Kaggleなどのコンペでも良い結果を残すことが多いようです。予測精度の高いXGboostのモデルを作成するためには、MAX_TREE_DEPTH(決定木の深度)、MIN_TREE_CHILD_WEIGHT(子ノードの最低サンプル数)、LEARN_RATE(学習率)、MAX_TREE_DEPTH(トレーニングに必要なサンプルデータの割合)などをチューニングする必要があります。このハイパーパラメータチューニングを行いながら、特徴量エンジニアリングも行い、XGboostで作成できるモデルとして、ベストに近いモデルを作成しました。
以下にBigQueryMLでXGboost回帰を行う場合のサンプルコードを示しておきます。BigQueryMLの使用方法については別ブログで解説していますので、BigQueryMLを使用してモデルを作成する場合は参考にしてみてください。
CREATE OR REPLACE MODEL `project_id.dataset_name.XGboost_model_name`
TRANSFORM(
imp,
#-------各特徴量エンジニアリングと特徴量の選定-------
ML.POLYNOMIAL_EXPAND(feature1, 2) AS poly_feature1,
ML.QUANTILE_BUCKETIZE(feature2, 10) AS bucketized_feature2,
ML.FEATURE_CROSS(STRUCT(feature3, feature4)) AS feature_cross,
feature5,
...
event_date
#-------------------------------------------
)
OPTIONS(
model_type='BOOSTED_TREE_REGRESSOR',
#----------各種ハイパーパラメータを指定-----------
NUM_PARALLEL_TREE=1,
MAX_TREE_DEPTH=5,
SUBSAMPLE =0.60,
MAX_ITERATIONS=50,
LEARN_RATE=0.20,
#-------------------------------------------
#--------------データ分割方法を指定-------------
DATA_SPLIT_METHOD = 'SEQ',
DATA_SPLIT_EVAL_FRACTION = 0.2,
DATA_SPLIT_COL = 'event_date',
#-------------------------------------------
input_label_cols=['imp'] #目的変数を指定
) AS
SELECT
imp,
feature1,
feature2,
feature3,
feature4,
...
event_date
FROM
`project_id.dataset.training_data`
上で、XGboostを利用して特徴エンジニアリング、ハイパーパラメータチューニングを行ってモデルを作成しました。そこでこのモデルの予測の精度がどの程度であったのかを確認します。
以下の図は横軸に予測値、縦軸に観測値をとった散布図です。赤の線が傾き1の直線で予測値と観測値が一致している場合となります。よって、平均的に散布した青い点が赤の線に近ければ近いほど予測の精度が高いと言えます。
上の図に示すXGboostの回帰モデルの精度は以下のようになりました。
平均絶対パーセント誤差: 23.63
平均二乗誤差: 2526.05
平均すると予測から24%程度の予測誤差になっています。しかしながら、平均二乗誤差が大きく出ていることから、予測から大きく外れる可能性が高いとも言えます。
次に、AutoMLテーブルを使ってモデルを作成していきます。XGboostとは対照的にハイパーパラメータチューニングを行う必要が全くありませんし、できません。データ分割に使用するコラム、目的変数、トレーニング時間、損失関数を指定するだけで数時間後にはモデルが完成します。以下にBigQueryMLでAutoMLを使用し回帰モデルを作成する場合のサンプルコードを示しておきます。
CREATE OR REPLACE MODEL project_id.dataset_name.AutoML_model_name
OPTIONS(
model_type='AUTOML_REGRESSOR',
DATA_SPLIT_COL = 'event_date',
input_label_cols=['imp'],
OPTIMIZATION_OBJECTIVE = 'MINIMIZE_RMSE'
budget_hours=1.0
) AS
SELECT
imp,
feature1,
feature2,
feature3,
feature4,
...
event_date
FROM `project_id.dataset.training_data`
AutoMLの回帰モデル作成にあたっては全く機械学習の知識を必要としませんでしたが、果たしてこれで良い精度のモデルが生成されるのでしょうか。以下がXGboostモデルの時と同じように作成した散布図になります。
XGboostモデルと比較して明らかにばらつきが小さくなっています。私は図を見た瞬間、キャリアパスを真剣に考え直そうと思いました(笑)
それでは、AutoMLテーブルの作成したモデルの精度を見てみます。
平均絶対パーセント誤差: 24.67
平均二乗誤差: 1713.97
平均絶対パーセント誤差については若干XGboostモデルに劣りますが、それほど大きな差ではありません(XGboost 23.6% 対 AutoML 24.6%)。それに対して、平均二乗誤差がXgboostモデルと比べて大きく減少しています(XGboost 2526 対 AutoML 1713)。
平均絶対パーセント誤差に違いがほとんどなく、平均二乗誤差で大きな差があることから、AutoMLのモデルの方がXGboostモデルよりも予測を大きく外す可能性が少ない、優れたモデルと言えます。
XGboostモデルのハイパーパラメータチューニングに時間をかけたこともあり、正直がっかりさせられる結果でした。
AutoMLテーブルは私のチューニングしたXGboostと比べて、優れたモデルを生成しました。しかし、実際の業務で回帰モデルを使用することを考えるとAutoMLテーブルのモデルでもまだ精度が十分でないと言えます。そこで、さらに精度の高いモデルを作るべくDNN(ディープニューラルネットワーク)の回帰モデルも生成します。DNNは一般にXGboostと比べて学習に多くのリソースを必要としますが、XGboostよりも良い精度のモデルを作成できる場合もあります。DNN回帰では活性化関数(ACTIVATION_FN)、バッチサイズ(BATCH_SIZE)、学習率(LEARN_RATE)、隠れ層、隠れユニット(HIDDEN_UNITS)などのハイパーパラメータをチューニングしました。以下にBigQueryMLでDNN回帰モデルを作成する場合のサンプルコードを示しておきます。BigQueryMLでのDNN回帰モデル生成についてもこちらのブログで説明しています。
CREATE OR REPLACE MODEL `project_id.dataset_name.DNN_model_name`
TRANSFORM(
imp,
#----------------特徴量の正規化---------------
ML.STANDARD_SCALER(feature1) AS scaled_feature1,
ML.STANDARD_SCALER(feature2) AS scaled_feature2,
#-------------------------------------------
feature4,
・・・
event_date
)
OPTIONS(
model_type='DNN_REGRESSOR',
ACTIVATION_FN = 'RELU',
BATCH_SIZE = 25,
HIDDEN_UNITS = [16, 8],
LEARN_RATE = 0.02,
OPTIMIZER = 'ADAGRAD',
DATA_SPLIT_METHOD = 'SEQ',
DATA_SPLIT_EVAL_FRACTION = 0.2,
DATA_SPLIT_COL = 'event_date',
input_label_cols=['imp']
) AS
SELECT
imp,
feature1,
feature2,
feature3,
feature4,
・・・
event_date
FROM
`project_id.dataset_name.table_name`
DNNモデルもハイパーパラメータチューニングし、上の二つの図と同じように、予測精度を示す散布図を作成しました。
この図を見て、小さくガッツポーズしました(笑)
AutoMLと比べても明らかにばらつきが少なく、予測値と観測値が近くなっていることが見て取れます。
上の図に示すDNN回帰モデルの精度は以下のようになりました。
平均絶対パーセント誤差: 17.97
平均二乗誤差: 953.96
平均絶対パーセント誤差(AutoML 24.6% 対 DNN 17.9%)、平均二乗誤差(AutoML 1713 対 DNN 953)共に大きく減少しました。よって、ここまで作成した3パターンのモデルで一番優れていると言えます。
また、一定以上のIMPを集めるサイトについての平均絶対パーセント誤差は13%程度になり、実際に使えるものに近づきました。(AutoMLは同じ条件で17%程度)
AutoMLテーブルの利点は下の二点になると思います。
・精度の高いモデルを数時間で出してくれる
・機械学習の知識が本当に何もいらない
数は少ないように見えますが、この二つとも非常に大きな利点だと言えると思います。GoogleはAutoMLはAIの民主化と言っていますが、機械学習の知識なしで使用できるため、それを実現できているのではないでしょうか。
反対に以下が欠点になります。
・モデルに定期学習をさせなければならない場合、多くのお金がかかる
モデルの学習のために多数の仮想マシンを使用するため、モデルトレーニング1回にかかるお金はもうすでにチューニングを終えたモデルよりも大きくなります。
・モデルの説明が必要な時は使用不可
どのようなモデルを使用しているかを直接確認できないため、モデルの説明や分析は難しくなります。
・予測に時間がかかる場合がある
モデルのアンサンブルを行っていたり、必要以上に複雑なモデルを使用している場合があるため、予測にかかる時間が長くなることがあります。今回のプロジェクトの場合、AutoMLテーブルの生成したモデルは私の生成したモデルと比べて約20倍の時間がかかっていました。レスポンスタイムを短く抑えたい場合などは問題になるかもしれません。
・機械学習の知識があっても、それを活かして改善を図れない
AutoMLはアルゴリズムがブラックボックスのため、たとえ機械学習の知識があっても、モデルを改善することができません。一方、ニューラルネットワークをチューニングする場合などでは、トレーニングセットとクロスバリデーションセットでの結果から得られるバイアス、バリアンスなどの情報を使用し、モデルの精度を改善するための戦略を考えることができます。(過小適合の場合は特徴量を増やす、過学習の場合はトレーニングセットサイズを大きくするなど)
上で述べたように、AutoMLにも欠点はありますが、機械学習の知識を必要とせず、短時間でモデルのチューニングを行えるため、非常に有用なサービスだと思います。
使用方法としては、大まかに以下の二つのパターンが考えられます。
・モデル作成時にベースラインとして使用できる
人間が時間をかけてチューニングしたモデルの方が精度が高くなる可能性が高いですが、数時間で最低限達成できるベースラインを知ることができます。そのため、Kaggleコンペでもこの使い方をされる場合が多いようです。
・データサイエンスチームが小さい場合や、チューニングに時間がかけれない場合
時間をかけずに高精度なモデルを作成できることから、プロダクションでも使用される場合もあります。
データサイエンティストの知見、特に機械学習についての知見はまだ必要だと思います。
確かにAutoMLは機械学習の多くの側面を自動化し、誰でも短時間で良好なモデルを作成することを可能にしました。とはいえ、モデルが十分な精度を出さなかった場合に手が打てなくなることや、問題に応じた特徴量やモデルのチューニングが行えないことから、まだ、データサイエンティストは必要であると言えるのではないでしょうか。
しかし、将来的にAutoMLの精度が向上すれば、中途半端な知識を持ったデータサイエンティストや機械学習エンジニアよりも遥かに良いモデルを作成するようになると予想できます。ですので、私としてはどんな状態でも精度の高いモデルを生成できるよう、機械学習、データエンジニアリングの学習に励みたいと思います。
※2023年7月3日時点