検索
連載

「無料のKaggle公式講座×コンペ初参戦」で機械学習を始めよう僕たちのKaggle挑戦記

Kaggle公式講座の内容がなかなか良かったです。これに沿って、Titanicコンペを卒業して、住宅価格コンペに参戦することで、自分自身の機械学習実践スキルの成長が実感できました。その体験を共有します。

PC用表示 関連情報
Share
Tweet
LINE
Hatena
「僕たちのKaggle挑戦記」のインデックス

連載目次

 こんにちは、初心者Kagglerの一色です。また、この連載の記事を開いてくれてありがとうございます!

 前回は「Kaggle初心者のためのコンペガイド ― Titanicの先へ:僕たちのKaggle挑戦記」という記事を公開して、ブックマーク数は少なかったものの、そこそこのページ参照数が得られました。ドキドキしながらの記事公開でしたが少し安心しました。これを受けて、自分もそうだったのですが、「取りあえずTitanicコンペでSubmission(提出)まではやったけど、次のコンペティション(本稿ではコンペと表記)になかなか取り組めない」という人が少なくないということなのかなと思いました。

壁「Titanicの次」を突き破る! オススメの方法

 筆者はどうやって「Titanicの次」という壁を突き破れたのか。そのきっかけになったのが、前回の記事で「Kaggleを始めるのに役に立ったこと」章でも書いた「“30 Days of ML”公式プログラム」でした。このプログラムの前半は、下記3つの無料のKaggle公式講座を2週間かけて履修するというものでした。

図1 無料のKaggle公式講座(Python講座/機械学習入門講座/機械学習中級講座)
図1 無料のKaggle公式講座(Python講座/機械学習入門講座/機械学習中級講座)

 よって、上を素直に履修していけば誰もが2週間×毎日1時間程度の勉強時間で私の体験したことのまねができます。「いやいや、あなたのまねをしても意味ないでしょ」と思いますよね、分かります(苦笑)。本稿でまねをオススメするのは、自分でも驚くぐらいにきれいな成長曲線を描くことができたからです。本題に入る前に、説得材料として「どう成長したか」を示しておきます。


かわさき

 「30 Days of ML」ならダラケぐせがある自分でも何かやれそうな気が! と思ったら、[Registration is now closed]ってなってるじゃないですか……。ん? リンクがあるってことは、「30 Days of ML」に登録しなくても、同じ講座の内容で今から勉強を始められるってこと? なら、ちょっと手を出してみようかなぁ。(かわさき)



一色

 期間限定プログラムだったけど、今からでも同じ勉強はできると思うよ。プログラムの後半のコンペも参加はできないけど、同じ内容は試せると思う。

 同プログラムの第2回開催については何も情報がないけど、アンケート調査で改善点などを聞かれたから、計画があるのではないかと思うので、それを待つのもありかも。ただし1年後とかちょっと先かもしれないね。(一色)


Kaggle公式講座の入門〜中級で描ける成長曲線

 入門講座の最後(7回目)の演習問題は、下記の住宅価格コンペに取りあえず参戦すること。中級講座の1回目〜6回目の演習問題は、その住宅価格コンペで機械学習モデルを少しずつ改善していくことでした。

 なお、Kaggleコンペのための機械学習は、[Code]タブで作ることができるKaggleノートブックを使って「無料」で行えます(GPUやTPUも時間制限はあるものの使用可能です)。

 講座の各回を毎日1つずつ取り組むことで、次のように成績が変化しました。図と下記の箇条書きでは、トップ何%に入ったかを示しています。【数値】はモデルのスコアで、数値が小さいほど精度が高いことになります。

図2 Kaggle機械学習入門〜中級講座で描ける成長曲線
図2 Kaggle機械学習入門〜中級講座で描ける成長曲線

  • 1日目(入門講座の7回目/全7回): Top 90%【21217.91639】(ベースライン)
  • 2日目(中級講座の1回目/全7回): Top 67%【20998.83780】
  • 3日目(中級講座の2回目/全7回): Top 49%【16766.44379】
  • 4日目(中級講座の3回目/全7回): ランクアップせず【17471.74584】
  • 5日目(中級講座の4回目/全7回): ランクアップせず【16721.95257】
  • 6日目(中級講座の5回目/全7回): Top 8%【16241.51793】
  • 7日目(中級講座の6回目/全7回): Top 3%【14964.89501】
  • 8日目(入門講座のボーナス回): Top 1%【14093.71916】

 どうでしょうか。きれいな成長曲線を描いていますよね。

図3 最終的にトップ3%やトップ1%にランクイン!
図3 最終的にトップ3%やトップ1%にランクイン!


一色

 とはいえ、この住宅価格コンペ自体が、入門/中級講座に付属のもので初心者Kagglerしかいないので、それほど参加者のレベルは高くないと考えられます。その点を差し引いて受け止めてください。



かわさき

 やー、差し引いてもここまではなかなかヤレないと思います! ぼくはそこまで目指しませんから(笑)。


 ちなみに30 Days of MLプログラムの後半では、別の回帰問題のコンペに取り組みましたが、中級講座までの内容だけで上位に食い込むのは不可能だと感じました。筆者の場合は、さまざまな前処理を試したり、ハイパーパラメーターの自動チューニングをしたり、モデルのブレンディングやスタッキングという手法(後述)を試したりしました。Kaggleのコンペで本気で参戦していくには、中級講座の後でこういったより高度な内容を習得していくことも必要だと思いました。

 これら後半でしたことについては次回以降の記事で書くとして、今回は、中級講座までに筆者が試して体験した内容を、読者の皆さんが追体験するイメージで書いていきます。ターゲットとなる読者は、Kaggle未経験者〜私と同じような初心者Kagglerを想定しています。

住宅価格コンペに参戦するまでにするべきこと

 30 Days of MLプログラムの初日は、Titanicコンペに初めてのSubmissionをすることでした。その内容は、次のリンク先で説明されています(英語ですが、前回の記事で日本語に翻訳する方法を紹介しています)。

 その後はPython講座(全7回)に取り組みますが、これはウォームアップの講座だと思います。演習問題は少し考えるものもありますが、扱う文法などの内容は易しいレベルです。Pythonに慣れている人は飛ばしてよいでしょう。プログラミング言語が全く初めてという人は、説明が少ないため完全な理解ができないかもしれないので、書籍やWeb上のコンテンツ(例えば「Python入門 - @IT」)などで事前に学んだ方がよいと思います。Python講座のボーナス回で「Titanicチュートリアル」に取り組み、初Submissionを行います(このノートブックは、上記の「Getting Started with Kaggle」で20分でやってみる作業と同じものです)。

 次の機械学習入門講座(全7回+ボーナス回)は次のように進みます。

  • 第1回: 決定木という手法を学ぶ
  • 第2回: データをロードして内容を確認する
  • 第3回: 特徴量を選択し、決定木のモデルを定義して、fit(訓練)し、予測する
  • 第4回: スコアとして平均絶対誤差を算出して検証、評価する
  • 第5回: Over-fitting(過剰適合、過学習)とUnder-fitting(過少適合、学習不足)を学ぶ
  • 第6回: ランダムフォレストを学び、使ってみる
  • 第7回: 住宅価格コンペに挑戦する
  • ボーナス回: AutoMLを試す

 それぞれ基本的な内容で難しくないと思います。中級講座でやることが一気に増えるので、Python講座から機械学習入門講座までは日程を前倒しで進めるぐらいのペースがちょうどよいです。

1日目(Top 90%): ベースラインを作る

 機械学習モデルの精度/性能を上げていくには、比較対象となる基準、つまりベースラインが必要です。Kaggleでは、取りあえず必要最低限のベースラインとなるモデルを作って、いったんそれでSubmissionすることが一般的です。これについては、「脱・Kaggle初心者 〜 一歩先に行くためのノウハウ:Kaggle入門 - @IT」でも記載されています(自分の手でKaggleコンペを始めて取り組めば取り組むほど、この記事に納得できることが増えていきますね)。

 このベースラインは、機械学習入門講座の第7回の演習問題で作ったものそのものにしました。ここでコードを含むノートブックを公開しても何ら問題ないのですが、読者自身が入門講座を経て自らの手で考えながら作った方がよいと思うので、ここでは控えておきます。この時点で特徴量は全部使わずに(全81列から、先頭列のID、末尾列の予測ターゲットとなるラベル「販売価格」を除く)8個を選択しました。機械学習の手法としてはランダムフォレストを使用し、パラメーター(後述)は指定しませんでした。


一色

 「CatBoostを使おう」「最新のディープラーニング手法を使おう」などの今後試したい目標がこの時点であると思いますが、最初のベースラインはスタート地点となるものなので、複雑な処理はそぎ落とした最もシンプルでコアな処理のみで構成したノートブックを作った方がいいと個人的には思います。


 この後、新しい手法を学びながら新しい戦略を加えて毎日進化させていきますが、演習問題のノートブックは各回に1つずつ用意されているので、毎日1つずつ新しいノートブックができていきました(図4)。同様に、コンペ参戦では戦略ごとに新しいノートブックを作っていき、戦略ごとにバージョンを付けて(戦略内の修正はリビジョンを付けて)管理すると便利でした。これについては次回説明します。

図4 新しいノートブックが毎日できていき、それぞれSubmissionした
図4 新しいノートブックが毎日できていき、それぞれSubmissionした

2日目(Top 67%):ランダムフォレストのパラメーター調整(チューニング)

 回帰問題を解く最もシンプルな手法は、線形回帰(scikit-learnならLinearRegressionクラス)でしょう。次にシンプルなのが決定木DecisionTreeRegressorクラス)、その次がランダムフォレストRandomForestRegressorクラス)ではないでしょうか。これらの機械学習の手法は、「5分で分かる機械学習」という記事の「3分 ―― 機械学習の代表的な手法 パート1(教師あり学習)」で紹介しています。

 中級講座の1回目では、このランダムフォレストに指定できる各種パラメーター(詳細は割愛しますが、n_estimatorsmax_depthなどがあります)にさまざまな値を指定してモデルを作成し(リスト1)、各モデルのスコアを比較して最適なモデルを選択します。

from sklearn.ensemble import RandomForestRegressor

model_1 = RandomForestRegressor(n_estimators=50, random_state=0)
model_2 = RandomForestRegressor(n_estimators=100, random_state=0)
model_3 = RandomForestRegressor(n_estimators=100, criterion='mae', random_state=0)  # scikit-learn v1.0からは'absolute_error'
model_4 = RandomForestRegressor(n_estimators=200, min_samples_split=20, random_state=0)
model_5 = RandomForestRegressor(n_estimators=100, max_depth=7, random_state=0)

リスト1 各種パラメーターにさまざまな値を指定して作成した5つのランダムフォレストモデル

 筆者が試した例では、model_3がベストでした。

 なお、ここでrandom_state(乱数シード)に何らかの固定値を指定することは重要です。これを指定しない場合、実行ごとに結果が変わってしまい、スコアを比較しづらいからです。機械学習の各手法に対応する「各種ライブラリ内の各クラス」ではrandom_stateが指定できることが多いので、忘れずに指定しましょう。ここでは0を指定していますが、好きな数値で構いません。ただし42を指定する人が非常に多いです。これは『銀河ヒッチハイク・ガイド』(ダグラス・アダムス著)の中で、スーパーコンピュータが750万年かけて「生命/宇宙/万物についての究極の疑問に対する答え」を計算した結果が42だったから、といわれています。ちなみに前回も紹介した、

の中では「42が好きな数値」と言っていました。

 中級講座の1回目〜7回目まで、Abhishek Thakur氏によるYouTube動画でそれぞれ解説がありましたので、それらも演習問題を自分で解くと同時に視聴しました。講座とセットで視聴するのがオススメです。


かわさき

 『銀河ヒッチハイク・ガイド』って懐かしい。紙の本で持っていたはずなんだけど、見当たらないから電子書籍を買っちゃいました!(反応するところが違うような気がしますね? 違いますが、反応しちゃうんです)



一色

 かわさきさんは雑談のとき、SF小説の話をよくするね。この業界ってSF小説好きの人が多いなぁ。


3日目(Top 49%): 欠損値(Missing Values)の前処理

 機械学習モデルの精度を改善するには、そのモデルにどのようなデータを与えるか、つまり特徴量の選択と加工(エンジニアリング)が重要です。いわゆる前処理ですが、その最も基本となるのが欠損値を補完することです。

 中級講座の2回目では、下記3つの欠損値の前処理方法が説明されています(詳細は講座をご確認ください)。

  1. 欠損値のある列(特徴量)そのものを削除(drop)する
  2. 補完(impute)する
  3. 補完した上で「補完の有無」を新たな列(特徴量)として追加することでデータセットを拡張する

 欠損値の前処理方法ごとに、スコアを出して比較しました。その結果、2の「補完する」方法でのスコアが一番良かったです。補完する方法(scikit-learnではSimpleImputerクラス)として平均値(mean)/中央値(median)/最頻値(most_frequent)/固定値(constant)といった戦略(strategy)を選択できますが、ここでは平均を選択しました(リスト2)。

import pandas as pd
from sklearn.impute import SimpleImputer

imp = SimpleImputer(strategy='mean') # シンプルな補完器

imp.fit(X_train) # 平均を取るためにまずは補完器にデータ内容を学習させる

imputed_X_train = pd.DataFrame(imp.transform(X_train)) # 次に補完器で変換する(=補完する)
# 値がNumPy配列になるので、pd.DataFrame()でpandasデータフレーム化する必要がある

リスト2 欠損値を補完(impute)するコード例

 欠損値を前処理したことで、スコアが大幅に改善してTop 49%に入りました。前処理の効果はやはり大きいですね。

4日目(ランクアップせず): カテゴリー変数(Categorical Variables)の前処理

 前処理の2つ目は、カテゴリー変数(例えば運動しない時々する毎日する)を機械学習モデルに入力できる数値(例えば、012)などにエンコードすることです。

 中級講座の3回目では、下記3つのカテゴリー変数のエンコーディング方法が説明されています(詳細は講座をご確認ください)。ちなみに、この他にもターゲットエンコーディング(Target Encoding)などがあり、次のコンペで使ったので次回で紹介します。

  1. カテゴリー変数の列(特徴量)そのものを削除(drop)する
  2. 序数エンコーディング(Ordinal Encoding): 上記のように012、……と付番する方法
  3. ワンホット・エンコーディング(One-Hot Encoding): 値として使われるカテゴリーの数だけ(なら3つ)列を増やして、対象となる1つの列(例えば[赤]列)だけを1(Hot)にしてそれ以外([黄]列と[青]列)を0にする方法

 scikit-learnでは、OrdinalEncoderクラスOneHotEncoderクラスなどが提供されており、例えばリスト3のようなコードでエンコーディングが簡単に行えます(詳細割愛)。

from sklearn.preprocessing import OrdinalEncoder

object_cols = [col for col in X_train.columns if X_train[col].dtype == 'object']
good_cols = [col for col in object_cols if set(X_valid[col]).issubset(set(X_train[col]))]

oenc = OrdinalEncoder()
label_X_train[good_cols] = oenc.fit_transform(X_train[good_cols])
label_X_valid[good_cols] = oenc.transform(X_valid[good_cols])

リスト3 カテゴリー変数を序数エンコーディングするコード例

 ここまではカテゴリー変数の列を削除することで使用していませんでしたが、ここでカテゴリー変数をエンコーディングして使ってみました。結果、残念ながらスコアは落ちてしまいました……。適切にエンコーディングして特徴量を適切に選択できれば精度は向上すると考えていますが、単純に全てのカテゴリー変数を同じ方法でエンコーディングして使うだけではダメなようです。

5日目(ランクアップせず): パイプライン(Pipelines)の作成と利用

 効果的にデータを使って学習し、汎化性能を高めるためには交差検証(Cross-Validation)が不可欠です。汎化性能が低い、つまり検証データや一部のテストデータに対してバイアスがあると、SubmissionしたときのPublic Leaderboardでスコアが悪かったり、Public Leaderboardでのスコアがよくても未知のテストデータであるPrivate Leaderboardでのスコアが悪くなり、コンペ最後のランキングで順番が大きく落ちたりする可能性があります。

 中級講座の4回目では、その交差検証を行うための前座としてパイプラインの作成方法が説明されます。例えば「天然ガスのパイプライン」といえば天然ガスなどが流れる管を思い浮かべると思いますが、機械学習の場合は機械学習の処理要素(例えば、データの前処理 → モデルの定義 → 訓練 → 予測、といった一連の処理要素)が順番に並んで流れていく管のようなものを思い浮かべるとよいです。パイプラインを定義するコードは例えばリスト4のようになります(詳細は割愛)。

from sklearn.impute import SimpleImputer
from sklearn.preprocessing import OneHotEncoder
from sklearn.pipeline import Pipeline
from sklearn.compose import ColumnTransformer
from sklearn.ensemble import RandomForestRegressor

numerical_cols = [col for col in X_train_full.columns if X_train_full[col].dtype in ['int64', 'float64']]
categorical_cols = [col for col in X_train_full.columns if X_train_full[col].nunique() < 10 and X_train_full[col].dtype == 'object']

# 数値データの変換器
numerical_transformer = SimpleImputer(strategy='mean')
# カテゴリーデータの変換器
categorical_transformer = Pipeline(steps=[
    ('imputer', SimpleImputer(strategy='constant')),
    ('onehot', OneHotEncoder(handle_unknown='ignore'))
])

# 数値およびカテゴリーデータの変換器を束ねて前処理に
preprocessor = ColumnTransformer(
    transformers=[
        ('num', numerical_transformer, numerical_cols),
        ('cat', categorical_transformer, categorical_cols)
    ])

# 前処理とモデリングのコードをパイプラインで束ねる
my_pipeline = Pipeline(steps=[('preprocessor', preprocessor),
                              ('model', model_3)
                            ])

# あとはfit(訓練)する
my_pipeline.fit(X_train, y_train)

リスト4 パイプラインを定義するコード例

 ちなみに、このコードではint64float64型を数値変数の列と判断し、object型をカテゴリー変数の列と判断しています。ただし、カテゴリー列のユニーク数(例えば……といったバリエーションの数で、「カーディナリティcardinality」と呼ばれます)が10個未満のものに絞っています。高いカーディナリティの列(例:1000個のバリエーション数がある列)を省く理由は、例えばOne-Hotエンコーディングすると、その数だけ列(例:1000個の列)が追加されることになり、つまり特徴量が膨大に増えてしまうことになりますので、それを回避したいからです。

 このようなパイプラインを定義することで次のような効果があると説明されています。今回は特に4の「交差検証」が目的になります。

  1. よりクリーンなコード
  2. バグの減少
  3. プロダクト化が容易になる
  4. モデル検証のためのより多くのオプション(交差検証やパラメーター探索など)

 パイプライン化をしただけでモデル自体は改善されていないので、スコアもここでは上がりませんでした。


かわさき

 この辺、ちょうど興味があったところです。訓練ももちろん大事なんだけど、その手前の段階(前処理やパイプライン)もまた重要ってことなんですねぇ(へぇ)。


6日目(Top 8%): 交差検証(Cross-Validation)の採用

 中級講座の5回目では、いよいよ交差検証を採用します。交差検証では、データを分割して訓練と検証を行います。データ分割といえば、scikit-learnのtrain_test_split()関数などを使って訓練セット(テストセットは事前に別に取ってある)を訓練データと検証データに固定的に分割するホールドアウト法という方法があります。データが大規模な場合はこれで十分ですが、小規模な場合は(前述の通り)汎化性能に不安が残ります。Kaggleのコンペでは、交差検証をした方が結果が良くなる可能性が高いのではないかと思います。

 交差検証のやり方は、いろいろとありますが、Kaggle公式講座ではscikit-learnでパイプラインを作成した上で、cross_val_score()関数を使うのがオススメのようです。次回で別の方法を紹介します。リスト5では訓練セットを5分割して交差検証を行っています(交差検証の内容は講座で説明されるので割愛します)。my_pipelineは前掲のリスト4で作成したパイプラインです。

from sklearn.model_selection import cross_val_score

# scikit-learnでは、他の評価指標と比較可能にするために、負のMAE(平均絶対誤差)スコアで計算されます。負の符号を逆転させるために、-1を掛ける必要があります
scores = -1 * cross_val_score(my_pipeline, X, y, cv=5, scoring='neg_mean_absolute_error')

print('MAEスコア:', scores.mean())

リスト5 パイプラインを定義するコード例

 5分割したので、スコアが5個出力されます。回帰では、このスコアの平均を取ります。ちなみに分類では、スコアの分類結果で多数決を取ります。

 ここでは交差検証したスコアを使って、ランダムフォレストのパラメーターn_estimatorsの最適な値をforループで変えながら探しました(=手動でのパラメーターチューニング)。その結果、350という値が求まり、それを使った結果、今回の住宅価格コンペでは効果がてきめんでした。精度は少し高まり、この付近の精度で混戦状態になっているようで、ランクがTop 49%→8%に急上昇しました。交差検証とパラメーターチューニングは不可欠な作業だと感じますね。

7日目(Top 3%): XGBoostの利用

 ここまでランダムフォレストを頑張って使ってきましたが、構造化データの回帰問題においてKaggleでよく使われている印象なのは、XGBoostLightGBMといった勾配ブースティングです。この勾配ブースティングも、「5分で分かる機械学習」という記事の「3分 ―― 機械学習の代表的な手法 パート1(教師あり学習)」でランダムフォレストの次に紹介しています。最後に勾配ブースティングのXGBoostを使うと、どれぐらい有利になるかを体験してみます。

 中級講座の6回目では、回帰用のXGBoostであるXGBRegressorクラスを使って、モデルを改善していきます。筆者の場合は、リスト6のようなコードになりました。

from sklearn.metrics import mean_absolute_error
from xgboost import XGBRegressor

# モデルを定義する
my_model_xgb = XGBRegressor(
    random_state=0,
    n_estimators=1000, # 実行するサイクルの回数=アンサンブルに含めるモデルの数
    learning_rate=0.04997, # 学習率。デフォルトは0.1
    n_jobs=4) # 並列処理の数(CPUコアスレッド数に合わせる。-1にすると全部使う)

# モデルをfit(訓練)する
my_model_xgb.fit(
    X_train, y_train,
    early_stopping_rounds=5,
    eval_set=[(X_valid, y_valid)],
    verbose=False)

# 訓練済みモデルに検証データを入力して予測結果を出力
predictions_xgb = my_model_xgb.predict(X_valid)

# MAE(平均絶対誤差)を計算する
mae_xgb = mean_absolute_error(predictions_xgb, y_valid)
print('MAEスコア:' , mae_xgb)

リスト6 XGBoostで回帰問題を解くコード例

 チュートリアルではここまでの説明ですが、筆者の場合はさらに、XGBoostモデルの最良スコアにおける予測結果と、これまでに作成したランダムフォレストのモデルの最良スコアにおける予測結果を足して2で割る、つまり両予測結果の平均を取りました。これは、平均Averaging)法による最も簡単なアンサンブル学習Ensemble Learning)の一種です。ちなみに分類であれば、多数決を取るため投票Voting)法と呼ばれます。

 より高度なアンサンブル学習の手法には、スタッキングStacking)法や、それに類似のブレンディングBlending)法がありますが、残念ながら中級講座では学べないので次々々回で紹介します。さらに、これら以外のアンサンブル学習の手法としては、バギングBagging)やブースティングBoosting、勾配ブースティングはこれ)もあり有名です。いずれのアンサンブル学習の手法もコンペでは強力な武器になると思いました。

 少し脱線しましたが、平均法で算出したスコアでsubmission.csvファイルを作成してSubmissionしたところ、精度も大きく高まり、ランクがTop 8%→3%になりました。


一色

 講座資料に書かれていないこと(前述のAbhishek Thakur氏によるYouTube動画で学んだこと)をしている段階で「ちょっとチートかな」とは思わなくもないですが、上位にランクされているものは、何かしら講座内容よりも高度なことをしているのではないかと思いますので(汗)。



かわさき

 講座で紹介されている内容をただ与えられた通りにこなしているだけじゃランキング上位を目指せないってことですね。決意が足りない自分は、身が引き締まる思いでこの原稿を読んでいます。でも、スコア上げにアレしてコレしてってのが楽しくなってくるとハマっちゃうのかも。


 中級講座の7回目は、リークData Leakageデータ漏えい)の解説でした。今回のコンペには生かせそうになかったので、これを受けてのSubmissionはしていません。

8日目(Top 1%): AutoMLの利用

 ここでコンペを終えてもよかったのですが、入門講座のボーナス回でAutoMLがあったので、試しにAutoMLもしてみました。

 ただし、ボーナス回ではAutoMLはGoogle CloudのAutoML Tablesを使うものになっていました。無料枠で6ノード時間まで無料で使えるので、無料で試せると思います。が、AzureとAWSでは使えるクレジットがある程度あるのと、最近、「Microsoft Certified: Azure AI Fundamentals」を取得してAzure Machine Learnigの自動機械学習(AutoML)に詳しくなっていたため、学習時間を省くために、Azureを使って行いました(図5)。

図5 Azure Machine Learnigの自動機械学習(AutoML)した結果
図5 Azure Machine Learnigの自動機械学習(AutoML)した結果

 先ほどちょっと紹介したVoting/Averaging法のEnsembleが1位、Stacking法のEnsembleが2位になっています。やっぱりアンサンブル学習は強いですね。


一色

 確かにデータを何も前処理せずにAutoMLを実行すると、平均よりは良いそこそこのモデルを作ってくれます。しかしそこそこなのですよね。本末転倒な気もしますが、ある程度の前処理をしてからAutoMLをするともっと良い結果が出るようでした……。

 でも手動でこの作業を全部やるよりは圧倒的に速いですね。モデルは50個ほど作られました。

 私の場合、開発環境用のコンピューティングインスタンスに1台を固定的に、機械学習用のコンピューティングクラスターに0〜3台を動的に割り当てた状況で、数時間かかり、費用は1000円ぐらいでした。


 最終的には、AutoMLの1位と2位、中級講座の最終結果を平均法でアンサンブルしたところ、さらに精度は改善し、Top 1%にまで上り詰めることができました。

 ここまで本稿で紹介した内容は、筆者自身の日記にも書いていますので、必要に応じてご参照ください。


 さて、いかがだったでしょうか。できるだけ公式講座に沿って進めることを意識しましたが、ランク的にここまでうまくいくのは想定外でした。それだけ公式講座やAbhishek Thakur氏によるYouTube動画は間違いのない良い学習コンテンツなのではないかと思います。本稿が、Titanicの先へ踏み出すきっかけとなり、より実力を付けることにつながればうれしいです。

 次回の私からの記事は、「30 Days of MLコンペ」を題材にした今回の続編です。前述したように、さまざまな前処理を試したり、ハイパーパラメーターの自動チューニングをしたり、モデルのブレンディングやスタッキングという手法を試したりした体験を記事にする予定です。お楽しみに。

「僕たちのKaggle挑戦記」のインデックス

僕たちのKaggle挑戦記

Copyright© Digital Advantage Corp. All Rights Reserved.

[an error occurred while processing this directive]
ページトップに戻る