kaggleの最近の記事

NCAAコンペ概要

 全米大学体育協会バスケットボールトーナメントの試合の勝敗を予測するコンペでした。男女別にコンペが開かれました。リーグ戦の試合結果の詳細とトーナメントの試合結果のデータが年ごとに与えられ、今年のトーナメントの試合結果を予測します。評価指標はLoglossでした。


結果

 新型コロナウイルスの影響で、大会自体がキャンセルになってしまいました。リークなしのLBの最も良いスコアは0.52586です。


取り組み内容

コンペの内容を理解してから

 LBの順位が参考にならないということを一番意識しなければならないと感じました。
というのも、LBは2015~2019年の予測のスコアなのですが、その答えはすでに与えられたデータに入っているため簡単にスコアを0にすることができ、リークに気を付けないと簡単に誤ったスコアが出てしまいます。
どのコンペでもCV(Cross Validation)は重要ですが、今回は特に必要でした。公開されているノートブックにもリークをしたものが多かったため、もしコンペが中止にならなければかなりのshakeが起きていたと思います。しかし、リークを防ぐことに関するディスカッションもいくつかあり、そこに注意できている参加者もいました。
また、過去数年間は毎年NCAAコンペは開かれているため、それらの上位成績者の解法を読み参考にしました。しかし、一貫した特徴はなく様々な解法であった為、自分なりの方法を考える必要がありました。


前処理 • 特徴量エンジニアリング

 基本的には、リーグ戦の合計得点などの試合の詳細データをチームごとに集計し、それを特徴量としました。
また、与えられているデータにチームのランキングなどもあったため、欠損値を補完しながら特徴量に加えました。Kenpom.comという、リーグとトーナメントのデータを集計しているサイトがあり、その独自の集計方法が特徴量として使えそうであったためスクレイピングをしたのですが、トーナメントのデータをリークしているためそのまま使うことはできず、自分でコーディングして作り直しました。
このうちのピタゴラス勝率やポゼッション率は比較的重要な特徴量となりました。また、各チームのプレースタイルの特徴を掴む為、チームごとのリーグ戦の試合内容に対してPCA分析をしてその結果を加えるといったこともしました。特徴量選択はまだしていませんでした。


CV(Cross Validation)

 交差検証の仕方についてですが、2014年までのデータ12年分を用い12FoldのGroupKFoldで行いました。去年、一昨年などの戦績を反映した特徴量を作っていないため、リークは起きていないと思います。年によってValidationのスコアが全然違うことから、やはりスポーツの予測は難しいなということを感じました。ジャイアントキリングの多く起こった年のスコアはかなり悪くなってしまいます。


モデリング

 LightGBM、CatBoost、DNNのアンサンブルです。シングルモデルのスコアにそれほどの違いはなかったのですが、出力の分布は大きく違い、アンサンブルをすることでスコアを向上することができました。僕の場合は、LightGBM、CatBoost、DNNの配分を、3:2:5にした場合が最もスコアが良くなりました。
XGBoostは他のモデルに比べスコアが良くなかったため使いませんでした。ハイパーパラメータチューニングはまだしていなかったため、これをするとさらに良くなったかもしれません。


まとめ

 コンペ自体がキャンセルになってしまい非常に残念です。しかし、今までしっかりできていなかった、シングルモデル作成→複数モデル作ってアンサンブル の流れに慣れてきたという点や、LBの順位が全く信用できない中でCVだけを頼りに取り組むという点においては学びが多く、良かったと感じています。来年はコロナウイルスの影響も収まりコンペがまた開かれると思うので、その時に今回の取り組みの成果を出したいです。

 


Twitter・Facebookで定期的に情報発信しています!

はじめに

昨日まで開催されていたKaggleの2019 Data Science Bowlに参加しました。結果から言いますと、public scoreでは銅メダル圏内に位置していたにも関わらず、大きなshake downを起こし3947チーム中1193位でのフィニッシュとなりました。今回メダルを獲得できればCompetition Expertになれたので悔しい結果となりましたが、このshake downの経験を通して学ぶことは多くあったので反省点も踏まえて今回のコンペを振り返っていきたいと思います。


コンペ概要

幼児用教育アプリを使う子ども達の能力を予測するコンペです。具体的な予測は次のようになります。
アプリ内でプレイ可能なゲームがそれぞれAssessment、Game、Activity、Clipの4つの分野に分類されます。そのうちAssessmentに分類されるゲームをプレイした際の問題の正解率を過去のプレイ履歴を元に0、1、2、3の4段階で予測します。モデルの評価指標はQuadratic Weighted Kappa (QWK)が採用されており、これがこのコンペで大きなshakeを生む原因の1つだったと言えます。
実際に多くの人がshake upまたはshake downし、private leaderboardにおいて1000位以上順位が動いた人もたくさんいました。


取り組み

以下で私がこのコンペで行った取り組みを記述していきます。


EDA

コンペの序盤は公開してくれているNotebookを元にEDAを行いました。
中盤以降はゲームの細かいプレイ履歴を見るためにテーブルデータそのものを見て、データ中の項目が何を示しているか注意深く観察するようにしました。


特徴量作成

特徴量は公開Notebookをベースとしました。そこにEDAやDiscussionを元に特徴量を作成して、モデルの精度が向上するかどうかトライアンドエラーを繰り返しました。


データの前処理

testデータの各特徴量の平均値をtrainデータに合わせて変換しているNotebookを見つけ、自分のパイプラインに取り込んだところ精度が大きく向上したのでそれ以降ずっとこの手法を取り入れていました。
しかし、正直なところ過学習の原因になりかねない危ない処理だとも考えていました。


モデル

今回はLGBMとXGBoostを試しました。それぞれのモデル単体ではLGBMが良い性能を示し、アンサンブルで2つのモデルを用いても性能の向上が見られなかったため最終的にはLGBMのみ使いました。
LGBM1つの時に比べて、Local CVのスコアが高くなるランダムシードを5つ選びseed averagingを行ったモデルがpublic scoreで少し良い結果でした。今回のコンペでは評価指標のQWKが原因でpublic scoreが不安定であったので、アンサンブルをせず1つのモデルの結果を提出しているチームも多かったです。しかし、private scoreではやはりアンサンブルを用いた方が結果が良かったようです。


データの後処理

予測結果としては問題の正答率から0、1、2、3のラベルに分類するタスクでした。しかし、多くの参加者がregressionを使って連続値で予測した後に閾値を決めてそれぞれのラベルに分類する手法を取り入れていました。
この閾値を決定する方法が2つありました。1つはvalidationスコアからQWKが最適化されるように閾値を決定する方法。もう1つはラベルの割合がtrainデータと一致するように閾値を決定する方法です。
trainデータとtestデータの分布が似ていると仮定し私は後者を選びました。


結果

冒頭でも述べましたが最終日に銅メダル圏内に突入したものの、モデルがpublic leaderboardに対してひどい過学習を起こしておりprivate leaderboardでは900位近く順位が下がり3947チーム中1193位となりました。


反省

自分なりに大きなshake downの原因が何だったかいくつか要因を考えてみました。

まず第一にデータの前処理でtestデータの各特徴量の平均値をtrainデータの平均値に合わせたことです。 この処理はtrainデータとtestデータの分布の差を少なくするためのものでした。しかし、testデータがtrainデータと同じ分布に由来していた場合に、平均値を調整することでpublic scoreが上がるのはpublic leaderboardに過学習していると考えられます。
上位陣がこの前処理を行っていないことから、実際にこの処理がpublic leaderboardに過学習する原因になっていると言えます。

次にshake downの原因として考え得るのは、予測ラベルの割合をtrainデータに合わせにいったことです。この処理ではtestデータの正解ラベルの割合がtrainデータの割合と似ていると仮定していますが、public testデータが少ない状況でこの処理は危険であったと思います。
上位陣の解法でもこの手法は使わずに、validationデータに対してQWKを最適化して閾値を決めていました。

コンペ終了後に最終のsubmissionとして選ばなかったものを見ると、過学習を起こしうる処理を使う前のものではメダル圏内のscoreのものもありました。
このコンペを通してpublic scoreを改善することよりもロジカルに考えてパイプラインを構築することが大切だと実感しました。特に今回はtestデータが非常に少なく大きなshakeが起きる可能性が高いと自覚しながら、また過学習になりかねない処理だとも自覚しながら、public scoreを追ってしまったことは反省しなければならないところです。


まとめ

銅メダル圏内から900位近くshake downするという悔しい経験ではありましたが、そこから学ぶこと多くありました。やはりモデル構築の際は論理的に筋の通った処理をする必要があるなと感じました。今回の反省を活かし上位陣の解法から学べることは吸収して精進していきたいと思います。


Twitter・Facebookで定期的に情報発信しています!

はじめに

KaggleのNFLコンペで2038チーム中118位となり、銅メダルをとることができました。以下に、参加してからの取り組みや、反省点を書いていきたいと思います。

コンペ参加前の状況

10ヶ月ほど前にTitanicコンペに参加してから、「Predicting Molecular Properties」と「IEEE-CIS Fraud Detection」というコンペに参加してみましたが、公開されているカーネルを少しいじってみた程度でメダルには到底届きませんでした。

コンペ概要

簡潔に書くと、アメフトのワンプレーごとに、ボール保持者がランプレーでいくらヤードを稼げるか?を予測するコンペです。しかしアメフトのルールを知らないため、はじめは全くわからなかったです。

アメリカンフットボールでは、野球のようにプレーごとにチームが攻撃と守備にきっちり分かれているようなのですが、今回の予測はこの攻撃側のランプレーに関係します。

攻撃側のチームはボールを保持し、相手陣地にできるだけ深く攻め込もうとするのですが、その方法が2パターンあります。パスプレーとランプレーです(パスプレーは省略します)。ランプレーは攻撃開始直後に、クォーターバックが走ってくる味方にすれ違いざまにパスを出し、そのボール保持者は相手を交わしながらできるだけ相手陣地の深いところまで、すなわちヤードを稼ごうとします。

今回予想するのは、このボール保持者が稼いだヤードが可能性のあるヤードそれぞれ以下である確率です。

例)3ヤード以下である確率:0.3、 4ヤード以下である確率:0.35、5ヤード以下である確率:0.38 .......

取り組み

以下では自分の取り組みを説明していきます。始めたのは、締め切りの約1ヶ月前からです。

コンペ概要理解とEDAなど

アメリカンフットボールの理解
アメフトのルールを知らなかったため、ここから始めました。サイトや動画を参考に進めました。

予測するものの理解
ランプレー時にオフェンスが得たヤードに関するもので、それぞれのヤード以下である確率を求めなければならないということをなんとか理解しました。ここからは、アメフトの動画はランプレーに絞って見ていました。

与えられたデータの内容
プレーごとのデータでした。まずそのプレーの情報で、日付と時刻、スタジアムの状態、天気と風速など。また、プレーに出場している22人それぞれの情報で、名前、身長体重、出身大学、ポジション、位置情報、進行方向や速度と加速度、背番号などが与えられていました。

モデル

多層ニューラルネットワーク(以下DNN)を使いました。今まではLGBMを使ってきたため、DNNを本格的に使うのは初めてでした。このカーネルと同じものです。

特徴量エンジニアリング

ベースのモデルができてからは、データ分析→そこから得られたアイデアを元に特徴量作る→スコア上がるかどうか?→データ分析 といったように仮説と検証の繰り返しでした。うまくいった特徴量を具体的に書いていきます。

攻撃チーム、守備チーム、ボール保持者(Rusher)、守備チームの前線選手などのそれぞれの戦績をランク付け
やはりアメフトにも強いチーム、弱いチームが存在し、同様にボール保持者の能力にも差があります。これを単純にターゲットエンコーディングしても良かったのですが、それは避けました。他の競技にも言えることですが、チームも選手も年によってかなり調子が上下します。そのままターゲットエンコーディングすると与えられたデータに過学習してしまうと思い、5つにランク分けし、エンコーディングしました。これは、リーダーボードのPublicからPrivateで、順位が約70位上がった要因にもなっていると思います。

ボロノイ図の面積を用いる
ボロノイ図というのは、平面上に配置された点に大して、その平面内の点を、どの点に最も近いかによって分割してできる図のことで、今回のコンペではこの記事でPythonで実装してくれています。僕はここから着想を得て、ボロノイ図によって分割された部分の面積を特徴量として加えてみることにしました。面積が無限大となってしまうのを防ぐため、うまくミラーリングを使う必要があるのですが、実装力不足のため数日を費やすこととなりました。しかし、この面積を標準化して特徴量として加えると期待以上にスコアがよくなったので達成感も十分にありました。ここで出した面積を元に、ある特定のポジションの選手の面積を利用するなど、さらに試行錯誤をしました。

選手同士の距離感
これは多くの方がされていると思います。ボール保持者と相手ディフェンスとの距離感を計算し、その平均や最小値、最大値などを利用しました。

上手くいかなかったこと

CNNを用いる
上記のことはコンペ終了1週間前には出来ており、銅メダル圏内にも入っていました。しかし、さらに順位をあげたいと思い、残り1週間は新しいことにチャレンジしました。そもそも僕が上記で作った特徴量は、主に選手の戦績と位置情報に関したものです。その位置情報を最もシンプルに用いることができるのはCNNではないか?と考えました。
つまり、選手の戦績やプレー時の状況、スタジアムなどプレー情報はシンプルなDNNにいれ、選手の位置情報と進行方向のベクトル、速度、加速度などはCNNに入れ、それをくっつけてしまい、最終的な出力を得ようというものです。題の通り、この試みは失敗しました。lossが全く下がらず、それまでのモデルより悪いスコアとなってしまいました。DNNの使用経験が少ないことによる安直な考えが原因ではないかと考えています。しかし、このコンペで1位であったチームはCNNを用いていたため、アイデア自体は悪くなかったのでは?とも思います。

数秒後の選手の位置を利用する
選手の進行方向のベクトル、速度、加速度が与えられているため、未来の選手の位置が求められると思い1秒後と0.5秒後の選手の位置を求め、それを用いて特徴量を作ったのですが、精度の向上には繋がりませんでした。他の参加者にはこの特徴量が効いたとコンペ後におしゃっていた方もいたので不思議です。

上位陣の解法

1st place solution
このチームは2位に大差をつけて1位となったのですが、とてもシンプルな解法で驚きました。選手の位置情報と速度、加速度をディフェンスとボール保持者、オフェンスとボール保持者、ディフェンスとオフェンスなどに分けた上で特徴量とし、モデルとしてCNNを使っていました。また、有用なCVを見つけたようで、CVのスコアをよくすることに注力することが出来たようです。

2nd place solution
Transformerという、主に自然言語処理で使われる手法があるのですがこの方はそれを使っています。上位の方の多くはこの手法を使っているようなので、僕もこの手法を理解したいと思います。

4th place solution
上記のTransformerは、Attentionという仕組みを用いているのですが、このチームはこのAttentionをDNNと組み合わせているようです。

ちなみにAttentionについてはこちらで解説しています。

まとめ

今回のコンペでは、データ分析→生まれたアイデアを元に特徴量作成→精度をあげる、という基本的な流れはうまくいきました。しかし、データ分析によって生まれたアイデアをモデルに反映させることはできず、それが上位陣との差であると感じました。もちろん、自力でメダル圏内に入れるようになったのは大きな成長であると思いますし、この経験と学びを生かして次回は銀メダルを狙いたいと思います。

その他Kaggle関連の記事

地震コンペをやってみた

インタビュー|Kaggle Expertまでの道のり

Adversarial Validationとは

Attentionモデルの解説

アクセルユニバース株式会社(以下当社)では、人が対応している業務を画像認識、音声認識、文字認識等を活用して効率化する機械学習ソリューション開発をおこなっています。


インターン生は業務の一環としてKaggleに取り組んでおり、先日のASHRAE - Great Energy Predictor IIIにて銅メダルを獲得しました。


メダルを獲得した田村くんのコメントです。

今回は、他の方が提出したもののブレンド(混ぜる)の仕方を工夫しました。
まずはなるべく違う解法を混ぜる対象として選定しました。その後は、混ぜ方が良い悪いの指標も評価できたので良かったです。

先日のアメフトのコンペ(NFL Big Data Bowl)も同様のことが言えますが、暫定順位(public leaderboard)を上げることだけを考えていると、private leaderboardの順位が下がる可能性が大きいので次のコンペでは十分に気をつけたいです。


その他当社インターンでは技術ブログを作成しています。

▼Kaggle

▼論文解説

▼新技術の実装


その他、随時紹介していくので是非ご覧ください!


Twitter・Facebookで定期的に情報発信しています!

アクセルユニバース株式会社(以下当社)では、人が対応している業務を画像認識、音声認識、文字認識等を活用して効率化する機械学習ソリューション開発をおこなっています。


インターン生は業務の一環としてkaggleに取り組んでおり、先日のNFL Big Data Bowlコンペにて銅メダルを獲得しました。
こちらのコンペは、アメリカンフットボールのランプレイにおいて、攻撃側が進むヤード数を予測するコンペです。


メダル獲得した小野くんのコメントです。
ーーー
主な勝因は特徴量エンジニアリングの部分だと考えています。
調子に波があるだろうと考えたので選手やチームの情報は極力使わず、選手の位置情報や進行方向のベクトルを用いて様々な切り口で特徴量を作ることに注力しました。

その他、今回はカーネルコンペであったため、以前よりコーディング力がつき、メモリやコードの実行時間に対する意識も増しました。
また過学習を防ぐことの重要性を再認識しました。
ーーー


現在、解法を詳しく解説したものを公開できるように準備を進めています。


その他当社インターンでは論文のまとめ記事論文 Attention Is All You Need から Attentionモデルの解説を書いたり、実際にTensorFlowでVGG19を使ったインスタ映え画像の生成実装をしています。 随時紹介していくので是非ご覧ください!


Twitter・Facebookで定期的に情報発信しています!

概要

Adversarial ValidationはTrainデータとTestデータの分布が異なる際に、Testデータに似たValidationデータを作成するのに使われる手法です。
Kaggleなどのデータ分析コンペではTrainデータとTestデータの一部が与えられ、コンペ終了まではこの一部のTestデータに対するスコアのみ知ることができます。一部のTestデータだけを見てモデルを評価していると、全体のテストデータに対しては良いスコアが出ずに最終的に低い順位に終わることがあります。ですのでCross Validationなどを用いて求めたValidationデータに対するのスコアと一部のTestデータに対するスコアに相関があることが望ましい状態です。そのために重要なことはTestデータに似た分布を持つValidationデータを作成することです。


手法

最終的な目標はTrainデータとTestデータを分類するモデルを作成することです。

まずどちらのデータセットからのデータかをラベル付けするために、TrainデータとTestデータにそれぞれ新しい目的変数を与えます。例えばTrainデータには "1"を、Testデータには"0"を与えます。そしてTrainデータとTestデータを結合して、データがどちら由来か予測するモデルを作成します。
もしTrainデータとTestデータが同じ分布を持つとするとどちら由来かを予測できないはずです。逆にTrainデータとTestデータの分布が異なる場合は予測は容易になります。
予測結果からTrainデータとTestデータの分布が異なるようであれば、Testデータの分布に似たValidationデータを作成する必要があります。これはTrainデータのうち、モデルがTestデータに由来する確率が高いと予測したデータを選ぶことで作成できます。


それでは必要なライブラリをインポートして実装に進みましょう。

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
warnings.filterwarnings('ignore')
from tqdm import tqdm_notebook as tqdm

from sklearn.preprocessing import LabelEncoder
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
import lightgbm as lgb


TrainデータとTestデータの分布が同じ場合

まずデータセットを作成し、プロットしてみます。

X, y = make_classification(
    n_samples=10000,
    n_features=2,
    n_informative=1,
    n_redundant=0, 
    n_classes=2,
    n_clusters_per_class=1,
    class_sep=2.0,
    random_state=42
)

plt.scatter(X[y == 0, 0], X[y == 0, 1], s=10, alpha=0.5, label='class A')
plt.scatter(X[y == 1, 0], X[y == 1, 1], s=10, alpha=0.5, label='class B')
plt.legend(loc='upper right')
plt.show()

plot of dataset


このデータセットをTrainデータとTestデータに分け、Trainデータには "1"を、Testデータには"0"をそれぞれ新しく目的変数として与えます。その後、TrainデータとTestデータを結合して1つのデータセットに戻します。

X_train, X_test = train_test_split(X, test_size=0.33, random_state=42)

y_train = np.zeros(len(X_train))
y_test = np.ones(len(X_test))

X_all = np.concatenate([X_train, X_test], axis=0)
y_all = np.concatenate([y_train, y_test], axis=0)


これでTrainデータとTestデータが混ざったデータセットが出来上がりました。ここから新たに与えた目的変数を元にTrainデータとTestデータを分類するモデルを作成していきます。

X_train_adv, X_valid_adv, y_train_adv, y_valid_adv = \
    train_test_split(X_all, y_all, test_size=0.33, random_state=42, shuffle=True)

model = lgb.LGBMClassifier(
    n_estimators=1000,
    random_state=42)

model.fit(
    X_train_adv,
    y_train_adv,
    eval_set=[(X_train_adv, y_train_adv), (X_valid_adv, y_valid_adv)],
    eval_names=['train', 'valid'],
    eval_metric='auc',
    verbose=100)


このときのValidationデータを作成しモデルの性能を評価します。 ではモデルのパフォーマンスを見てみましょう。

ax = lgb.plot_metric(model.evals_result_, metric='auc')
plt.show()

plot of learing curve


結果を見ると、Validationデータに対してAUCはほぼ0.5あたりを示しています。AUCが0.5を示すということはモデルのパフォーマンスがランダムに分類するのと変わらないことを意味しています。これはモデルがTrainデータとTestデータをうまく分類できてないということです。つまりTrainデータとTestデータの分布が同じであることがわかります。


TrainデータとTestデータにの分布が異なる場合

次にTrainデータとTestデータの分布が異なる場合を見ていきましょう。

データはKaggleの2019 Data Science Bowlのデータを引っ張ってきました。データの中身や特徴量作成に関して、ここではコードだけにして割愛させていただきます。

test = pd.read_csv("../input/data-science-bowl-2019/test.csv")
train = pd.read_csv("../input/data-science-bowl-2019/train.csv")


def get_data(user_sample, test_set=False):
    all_assessments = []
    type_count = {'Clip':0, 'Activity': 0, 'Assessment': 0, 'Game':0}

    for i, session in user_sample.groupby('game_session', sort=False):
        session_title = session['title'].iloc[0]
        session_type = session['type'].iloc[0]

        if (session_type == 'Assessment') and (test_set or len(session) > 1):
            event_code = 4110 if session_title == 'Bird Measurer (Assessment)' else 4100
            all_attempts = session.query(f'event_code == {event_code}')
            num_correct = all_attempts['event_data'].str.contains('true').sum()
            num_incorrect = all_attempts['event_data'].str.contains('false').sum()

            features = {}
            features['installation_id'] = session['installation_id'].iloc[-1]
            features['title'] = session_title
            features['num_correct_attempts'] = num_correct

            features.update(type_count.copy())

            if test_set:
                all_assessments.append(features)
            elif num_correct + num_incorrect > 0:
                all_assessments.append(features)

        type_count[session_type] += 1

    if test_set:
        return all_assessments[-1]

    return all_assessments


compiled_train = []
for ins_id, user_sample in tqdm(train.groupby('installation_id', sort=False), total=17000):
    compiled_train += get_data(user_sample)

compiled_test = []
for ins_id, user_sample in tqdm(test.groupby('installation_id', sort=False), total=1000):
    test_data = get_data(user_sample, test_set=True)
    compiled_test.append(test_data)

X_train = pd.DataFrame(compiled_train)
X_test = pd.DataFrame(compiled_test)


特徴量作成の後にできたTrainデータとTestデータは次のようになっています。

display(X_train.head())
display(X_test.head())

heading of training and test dataframes


余分なinstallatio_idカラムは削除して、titleカラムのエンコーディングを行っておきましょう。

X_train = X_train.drop(['installation_id'], axis=1)
X_test = X_test.drop(['installation_id'], axis=1)

le = LabelEncoder()
le.fit(list(X_train['title'].values) + list(X_test['title'].values))
X_train['title'] = le.transform(list(X_train['title'].values))
X_test['title'] = le.transform(list(X_test['title'].values))


ここから先は上記のプロセスと同じくTrainデータとTestデータに新たな目的変数を与えて結合した後、TrainデータとTestデータが混ざったデータからそれぞれを分類していきます。

X_train['adv_target'] = 0
X_test['adv_target'] = 1
train_test_adv = pd.concat([X_train, X_test], axis=0).reset_index(drop=True)

train_adv, valid_adv = train_test_split(train_test_adv, test_size=0.33, random_state=42)
X_train_adv = train_adv.drop(['adv_target'], axis=1)
y_train_adv = train_adv['adv_target']
X_valid_adv = valid_adv.drop(['adv_target'], axis=1)
y_valid_adv = valid_adv['adv_target']

model = lgb.LGBMClassifier(
    n_estimators=1000,
    random_state=42)

model.fit(
    X_train_adv,
    y_train_adv,
    eval_set=[(X_train_adv, y_train_adv), (X_valid_adv, y_valid_adv)],
    eval_names=['train', 'valid'],
    eval_metric='auc',
    verbose=100)


ではモデルのパフォーマンスを見てみましょう。

ax = lgb.plot_metric(model.evals_result_, metric='auc')
plt.show()

plot of learing curve


Validationデータに対するAUCはおよそ0.93あたりで、TrainデータとTestデータの分布が同じ場合に比べモデルのパフォーマンスが良いことがわかります。これは今回用いたTrainデータとTestデータの分布が異なるため、モデルが容易に分類できるからです。

このようにして得られた結果から、TrainデータのうちTestデータである確率が高いと予測されたデータを取り出すことでTestデータに似たValidationデータを作成することが可能になります。またTrainデータとTestデータの分布が異なるかどうか見分ける指標としてAdversarial Validationを使うこともできます。


特徴量選択への応用

最後にAdversarial Validationを応用して特徴量選択を行う方法を紹介します。

まず先程のTrainデータとTestデータの分布が異なる場合に、予測に寄与した特徴量の重要度を見てみましょう。

plot of feature importance


これを見ると num correct attempts の重要度が高くなっています。これは num correct attempts がTrainデータかTestデータかの分類に大きく寄与していることを示しています。つまりTrainデータとTestデータの間でこの特徴量に乖離があることを意味しています。

これを受けて num correct attempts のカラムを削除してTrainデータとTestデータの分類を行ってみると、

new_X_train_adv = train_adv.drop(['num_correct_attempts'], axis=1)
new_X_valid_adv = valid_adv.drop(['num_correct_attempts'], axis=1)

model = lgb.LGBMClassifier(
    n_estimators=2000,
    random_state=42)

model.fit(
    X_train_adv,
    y_train_adv,
    eval_set=[(new_X_train_adv, y_train_adv), (new_X_valid_adv, y_valid_adv)],
    eval_names=['train', 'valid'],
    eval_metric='auc',
    verbose=100)

ax = lgb.plot_metric(model.evals_result_, metric='auc')
plt.show()

plot of learing curve


たしかにAUCスコアが低くなりTrainデータとTestデータの分類がしづらくなっていることがわかります。

このようにしてAdversarial Validationを応用することによって、TrainデータとTestデータで乖離している特徴量を見つけることができます。


まとめ

今回はKaggleなどの機械学習コンペで注目されているAdversarial Validationを紹介しました。Kaggleにおいて手元のバリデーションスコアとLeader Boardのスコアに乖離がある際に、適切なValidation setの作成や特徴量選択に役立ちます。実際に私もコンペで利用しており、今後ますます注目を浴びるのではないかと思われます。


Twitter・Facebookで定期的に情報発信しています!

LightgbmやXgboostを利用する際に知っておくべき基本的なアルゴリズム「GBDT」を直感的に理解できるように数式を控えた説明をしています。

対象者

  • GBDTを理解してLightgbmやXgboostを活用したい人
  • GBDTやXgboostの解説記事の数式が難しく感じる人

※GBDTを直感的に理解してもらうために、簡略化された説明をしています。

GBDTのメリット・良さ

  • 精度が比較的高い
  • 欠損値を扱える
  • 不要な特徴量を追加しても精度が落ちにくい
  • 汎用性が高い(下図を参照)
  • LightgbmやXgboostの理解に役立つ

GBDT説明図
引用元:門脇大輔、阪田隆司、保坂佳祐、平松雄司(2019)『Kaggleで勝つデータ分析の技術』技術評論社(230)

GBDTとは

G... Gradient(勾配)
B... Boosting(ブースティング) = アンサンブル手法の1つ
D... Decision(決定)
T... Tree(木)

つまり、GBDTとは「勾配降下法(Gradient)」と「Boosting(アンサンブル)」、「決定木(Decision Tree)」を組み合わせた手法です。
まずは、GBDTの基本となる上3つの概念について直感的に理解していきましょう。

勾配降下法

機械学習アルゴリズムの主な目的は、正確な予測を行うことです。予測が正確かどうかは「誤差の大きさ」で判断することができます。

「誤差が小さい = 予測が正確」

と言うことができますよね。


その誤差を小さくする方法の1つが、「勾配降下法」です。

勾配降下法は、名前の通り「勾配」(傾斜)を降下する最適化の手法で、精度の誤差を最適化する役割をもっているわけです。

誤差関数グラフ

これは誤差関数のグラフで、「誤差の大きさ」を表しています。

このグラフの場合、真ん中に近づくに連れて誤差が小さくなっていますね。

誤差関数の勾配(傾斜)を下れば下るほど、「誤差が小さくなる=予測が正確になる」わけです。

Boosting(アンサンブルの1種)

アンサンブルとは、精度の低い学習器を複数組み合わせて、精度を高くする手法です。アンサンブルを表現することわざで、

「三人寄れば文殊の知恵」

というものがあります。

凡人でも三人で集まって相談すれば文殊に劣らぬほどよい知恵が出るものだ。」

つまり、弱学習器(予測の精度があまり高くないもの)を複数組み合わせることで強学習機(精度の高いもの)を作ることができるのです。

アンサンブルの手法には、さまざまな手法がありますが、その中でもGBDTに利用されているのが「Boosting」です。

決定木(Decision Tree)

決定木は、データから決定木を作る機械学習の手法のことです。

例えば、ECサイトで「商品Xを購入するかどうか」を予測したいとしましょう。

ECサイトに訪れた人が商品Xを購入するかどうかは、そのページに訪れた回数や、関連する商品Yを調べた回数などさまざまな要因から予測することができるかもしれません。このときに、

「商品Xのページに訪れた回数が5回以上」 → 商品Xを購入するだろう

「商品Xのページに訪れた回数が5回未満」 → 商品Xを購入しないだろう

このように条件を用意し予測を行う手法が決定木です。

GBDTの手順

  1. 目的変数の平均を計算する
  2. 誤差を計算する
  3. 決定木を構築する
  4. アンサンブルを用いて新たな予測値を求める
  5. 再び誤差を計算する
  6. 3~5を繰り返す
  7. 最終予測を行う

具体的に解説

こちらのデータを使って解説していきます。

スクリーンショット 2019-11-28 11.11.36.png

労働時間、好きな果物、性別のデータを用いて給料を求めます。

ステップ1.給料の平均を求める

スクリーンショット 2019-11-28 11.17.00.png
計算結果を予測1とします。
これをベースにして予測を行います。

ステップ2.誤差を計算する

「誤差1」=「給料の値」ー「予測1」で誤差を求めています。

例えば・・・

誤差1 = 900 - 650 = 250

カラム名は「誤差1」とします。
スクリーンショット 2019-11-28 13.48.38.png

ステップ3.誤差を予測する目的で決定木を構築する


スクリーンショット 2020-02-18 17.22.45.png
茶色の部分にはデータを分ける条件が入り、緑色の部分(葉)には各データごとの誤差の値が入ります。
葉の数よりも多く誤差の値がある場合は、1つの葉に複数の誤差の値が入り、平均します。

ステップ4.アンサンブルを用いて新たな予測値を求める

ここでは、決定木の構築で求めた誤差を用いて、給料の予測値を計算します。

スクリーンショット 2020-02-18 11.18.40.png

予測2 = 予測1(ステップ1) + 学習率 * 誤差

これを各データに対して計算を行います。

例えば・・・

予測2 = 650 + 0.1 * 200 = 670

このような計算を行って予測値を求めます。

ここで、予測2と予測1の値を比べてみてください。

スクリーンショット 2019-11-28 16.48.20.png

若干ではありますが、実際の値に予測2の方が近づいていて、誤差が少しだけ修正されています。
この「誤差を求めて学習率を掛けて足す」という作業を何度も繰り返し行うことで、精度が少しずつ改善されていきます。

※学習率を乗算する意味

学習率を挟むことで、予測を行うときに各誤差に対して学習率が乗算され、
何度もアンサンブルをしなければ予測値が実際の値に近づくことができなくなります。その結果過学習が起こりづらくなります。

学習率を挟まなかった場合と比べてみてください!

ステップ5.再び誤差を計算する

ここでは、予測2と給料の値の誤差を計算します。ステップ3と同じように、誤差の値を決定木の葉に使用します。

「誤差」=「給料の値」ー「予測2」

例えば・・・

誤差 = 900 - 670 = 230

このような計算をすべてのデータに対して行います。

ステップ6.ステップ3~5を繰り返す

つまり、

・誤差を用いた決定木を構築

・アンサンブルを用いて新たな予測値を求める

・誤差を計算する

これらを繰り返します。

ステップ7.最終予測を行う

アンサンブル内のすべての決定木を使用して、給料の最終的な予測を行います。
最終的な予測は、最初に計算した平均に、学習率を掛けた決定木をすべて足した値になります。

スクリーンショット 2020-02-14 18.15.33.png

スクリーンショット 2020-02-14 18.15.33.png

GBDTのまとめ

GBDTは、

-予測値と実際の値の誤差を計算

-求めた誤差を利用して決定木を構築

-造った決定木をそれ以前の予測結果とアンサンブルして誤差を小さくする→精度があがる

これらを繰り返すことで精度を改善する機械学習アルゴリズムです。この記事を理解した上で、GBDTの派生であるLightgbmやXgboostの解説記事を見てみてみると、なんとなくでも理解しやすくなっていると思いますし、Kaggleでパラメータチューニングを行うのにも役に立つと思いますので、ぜひ挑戦してみてください。


Twitter・Facebookで定期的に情報発信しています!

目次

  1. このブログの対象者
  2. 地震コンペの概要
  3. 私が地震コンペを始めた理由
  4. Kaggle初心者が地震コンペをやるまで
  5. 地震コンペの情報収集
  6. 参考にするNotebookの解読
  7. 特徴量の作成
  8. モデルの作成
  9. 結果
  10. 考察
  11. 今後


1. このブログの対象者

  • Kaggle初心者
  • Kaggle入門者用のTitanicや住宅価格コンペの次に挑戦したいが進め方に悩んでいる人
  • 地震コンペ(LANL Earthquake Prediction)のような時系列の信号データの分析に興味を持っている人


2. 地震コンペの概要

 このコンペは、地震の研究でよく使用される実験装置から得られる「音響データ(acousticdata)」のみを使って、実験室で発生する「地震までの時間(timeto_failure)」を予測するコンペである。訓練データは一つのセグメント(一つの実験データの一部分)で、図1のように「音響データ」と「地震までの時間」から成る。

訓練データ

 テストデータは2,624個のセグメント(それぞれseg_idが与えられている)で、各セグメント毎に1つのcsvファイルから成るため、2,624 個のcsvファイルから成り、図2のように「音響データ」のみで構成されている。また2,624 個のcsvファイルは1つのフォルダに入っている。

テストデータ

 この2,624個の各セグメント(各segid)に対して、図3から4のように「地震までの時間」を予測し提出することが目的である。ここで注意すべきなのはsumplesubmission.csvのsegidの順番と2,624個のテストデータが入っているフォルダのsegidの順番が異なっていることである。しかし順番は異なっているが、共に2,624個のseg_idが正しくあるので心配する必要はない。

samplesubmission

提出ファイル


3. 私が地震コンペを始めた理由

  • わたしは以前から「海洋波の波高予測」といった時系列の信号データの分析を行っている。その分析方法はその信号データのみを特徴量として分析する方法である。この方法をここでは「直接法」と呼ぶことにする。私は時系列の信号データの分析方法としてこの「直接法」以外を知らないため、今回地震コンペにチャレンジすることで、新しい手法を知ることができ、今後の分析に活かせるのではないかと思ったからである。

  • また地震コンペで扱う「音響データ」は時系列の信号データであるが、世の中の多くのデータは時系列であり、時系列データの分析をできるようになると、ありとあらゆる現象の分析が行えるようになる。なのでその練習の一環として、地震コンペを行うことにした。


4. Kaggle初心者が地震コンペをやるまで

▼必要なスキル

  • Pythonの基本構文が書ける能力
  • 機械学習の学習モデルの種類を知っており、実装できる能力


▼地震コンペをやる前にやった方が良いKaggle

 Kaggleの基礎や提出方法などを分かっておくために、深堀りはせずとも以下をやっておいた方が良い。

  • Titanic

 私はネットで「Kaggle Titanic 入門」などと検索し、コードを理解して参考にした。

 スコアが0.8を超えると、Kaggleの力がある程度付いたとよく評価されている。

  • 住宅価格コンペ

 私はネットで「Kaggle 住宅価格 前処理」などと検索し、コードを理解して参考にした。


5. 地震コンペの情報収集

  • まずは何かを参考に

 本来ならば、自力で提出できるのがベストであるが、私は地震コンペをやると言っても何から始めていいのか、特徴量をどうするか悩んだので、まずは既存のものを参考にすることにした。

  • ネット検索は使えない

 地震コンペはTitanicや住宅価格とは異なりマイナーなコンペなので、ネット検索では地震コンペについてしっかりと解説していたり、コードが書いてあるサイトがない。地震コンペに限ったことではないが、Titanicや住宅価格以外のコンペはネット検索をしても良い解説サイトは多分ないだろう。

  • Notebooksを参考に

 そこで参考にすべきなのがKaggleのNotebooksだが、当然英語で、読み進めていくには時間がかかる。また問題は英語で書かれていることだけではない。Notebooksは人によっては全く文字を書いて解説せず、ただコードを貼っている人もいる。人が書いたコードは、自分の書き方とは当然異なるので、本当に読めない。

  • 良いNotebookを見つけるには

 では、読みやすいNotebooksはどうやって探せばよいのか。まずはNotebooksの右上にあるSort byの所を、Most Votesにすると良い。良いNotebooksと投票されたものが上から順に並んで表示される。しかし、必ずしも一番上に表示されたNotebookが良いとも限らない。なので上から順にNotebookを見ていく。上から順に見て行き、英語ではあるができるだけ解説文が多いNotebookを探すとよい。コードだけのNotebookは上級者にしか読めないだろう。また、パッと見でコードの構文の形がなんとなく分かるものを選ぶとよい。この段階ですぐにコードの内容がすぐに理解できる必要はない。ただ構文の形がなんとなく分かるだけで、自分の書くコードと似ている可能性が高いのでよい。


6. 参考にするNotebookの解読

  • 参考にするNotebookの決定

 こちらのNotebookを最初に選んだ。後半部分は解説文はないし、コードもよく分からない。だが、前半部分は解説文があり、コードもなんとなく構文の形が分かるので、これを選んだ。

  • 全部コピペして提出

 そしてまず上記URLのコードをコピペして提出してみた。これは念の為、エラーが出ずに正常に実装でき、採点されるかを確認するために行った。 コピペしてもエラーが出て実装できないNotebookもあるのでこの作業はしたほうが良い。今回は正常に実装でき採点されたので特に問題はなかった。

  • 解説文の解読

 ここからが私の勉強である。Notebookの解説文をgoogle翻訳を使いながら読んだ。

  • コードの解読

 その後Notebookのコードを上から解読していった。この作業が最も気合がいる作業であるが、読みにくくないNotebookを選んだため、なんとか読むことができた。ただ全ては理解できていない。特に後半の学習モデルの作成部分はよく分からない。そこでこれは私の工夫だが、特徴量を作り上げ、訓練データとテストデータの作成する部分だけNotebookを参考にすれば、後はなんらかの学習モデルを使用して学習すればよいのであって、学習モデルまで参考にする必要はないので、後半部分を解読することはしていない。つまり私は前半の特徴量を作り上げ、訓練データとテストデータの作成する部分だけNotebookを解読した。


7. 特徴量の作成

 まず、モジュールや関数を読み込み、次にtrain.csv(図5ではearthquake_train.csvと改名している)を読み込む。

スクリーンショット 2019-11-05 14.10.09.png

 次に訓練データの特徴量を図6のように作成する。「音響データ」の特徴を保持して加工する必要があるため、当然、平均や標準偏差といった統計量を用いるのだが、時系列データであるので、「音響データ」150,000個毎の各セグメントの統計量を特徴量としていく。例えば、「音響データ」の0から149,999個目の統計量を一行目、150,000から299,999個目の統計量を二行目としていく。そしてその統計量を24種類扱う。このように信号データの特徴を保持して新しい特徴量を作る方法をここでは「間接法」と呼ぶことにする。

trainデータ trainデータ特徴量作成コード

 訓練データの特徴量の作成と同様に、テストデータも図7のように特徴量を作成する。但し、samplesubmission.csvとtest.csvはearthquakesamplesubmission.csv、earthquaketest.csvに改名している。

testデータ特徴量作成コード


8. モデルの作成

 まず図8のように、訓練データとテストデータの正規化を行う。ここで理由は分からないが、In [6]において、 scaler.fit(X_test) というコードを加えてしまうと精度が落ちることが分かったので、図8では加えていない。

データ正規化コード

 その後、学習モデルはNotebookを参考にせず、図9のようにLightGBMを採用した。但し、LightGBMのパラメータだけはNotebookでLigghtGBMを行っているであろう箇所の値と同じにした。

モデル作成コード モデル作成コード


9. 結果

 上記のコードを実装することで、図10のようにスコアが1.65885となった。

結果画像


10. 考察

 今回は上記のURLのNotebookを参考に地震コンペを行ってきたが、このNotebookには同じ人が作成した第二弾 があり、ここでは今回作成した特徴量に加え、更に多くの特徴量を追加して、精度を上げている。つまり、特徴量を増やし、「音響データ」の特徴をより正確に統計量として抽出することによって精度が上がるのではないかと私は考えている。


11. 今後

 この地震コンペは、使用できるデータとして、一つの時系列の信号データしか与えられていない。このような場合、その信号データを唯一の特徴量と見なす「直接法」(LSTMなどの時系列データに特化したモデルを使用するなど)は当然あるが、実際にやってみるとデータ数が非常に多いため処理しきれなかった。つまり「音響データ」をそのまま使うというのはなかなか厳しい事が分かる。そこで、今回参考にしたNotebookのように、その信号の特徴を抽出して統計量にし、それを特徴量にするという「間接法」が有効であった。

 今後も私は時系列データの分析を主に行って行くが、このような状況に出会った場合、「直接法」だけでなく、「間接法」というアプローチもあるということを念頭に入れて分析にあたりたいと思う。また逆に、今のところLSTMによる「直接法」で地震コンペの処理はデータ量が多すぎるためできていないが、なんとかできる方法がないのか今後も探ってみたいと思う。


当社では定期的にメルマガでも情報配信をしています。
ご希望の方は問い合わせページに「メルマガ登録希望」とご連絡ください。


Twitter・Facebookで定期的に情報発信しています!

アクセルユニバース株式会社(以下当社)では、人が対応している業務を画像認識、音声認識、文字認識等を活用して効率化する機械学習ソリューション開発をおこなっています。

インターン生はその一環としてkaggleコンペに挑戦しており、本日はkaggle Expertになった山口くんに取り組みをインタビューしました。 kaggleコンペに挑戦している方、これから機械学習の勉強を始める方は是非参考にしてください!


目次

  • 山口くんの紹介
  • kaggleコンペ挑戦
    • kaggleメダル獲得のテクニック
    • 実案件との違い
  • おわりに


山口くんの紹介

kaggle Expert メダル


10ヶ月前から機械学習の勉強を開始した文系大学生。

過去kaggle参加コンペ数:3 メダル獲得数:2 (銀1:IEEE-CIS Fraud Detection、銅1:Severstal: Steel Defect Detection)

signateもちょこちょこ参加。


kaggleコンペ挑戦

―――今日は宜しくお願いします。

お願いします。

―――まず初めに、kaggleに参加し始めたきっかけを教えて下さい。

kaggleはデータサイエンスや機械学習をおこなうにあたり、気軽に挑戦でき実力を表現しやすかったんです。なのでまずはやってみようかな、と。 僕のkaggle開始時はなかなかkagglerと出会えませんでしたが、最近コミュニティにも参加するようになり、情報交換をしやすくなりました。そのコミュニティでは、分析系をメインに議論しています。最近はビッククエリが話題になりました。 kaggleコンペについての話題も上がることもあり、ちょうど先日、僕の成果報告を話してきました。

―――成果報告!すごい。kaggleはどこでも話題なんですね。改めて今までのkaggeコンペの成績を教えて下さい。

IEEE-CIS Fraud Detectionで銀メダルをSeverstal: Steel Defect Detectionで銅メダルを獲得しました。

IEEE-CIS Fraud Detectionはnotebookやディスカッションを読み、そこに新しい特徴量を追加して...と試行錯誤を繰り返しました。だいたい200時間くらい費やしたと思います。 次に参加したSeverstal: Steel Defect Detectionは自力で行った部分が増えたことに加えて、採用するディスカッションやnotebook選びが的確になりました。そのため短い時間で提出までおこなえました。

―――ディスカッションやnotebookから取り入れるものを選ぶのは勉強が必要ですね。 どういった勉強や練習をしたんですか。

僕、機械学習を初めたのが今年(2019年)の1月からなんですよ。そこから4月までの4ヶ月はひたすら理論を勉強しました。機械学習の範囲は参考書等網羅し、統計検定2級も取得しました。 反省点は、理論だけやっていた期間が長すぎたことです。理論は広く浅く勉強して、早めに実装に入りメダルを狙いにいった方が良いと思います。

分からないことがあったら、その都度理論に立ち返り勉強する方が効率良かったです。 教材はPyQ、AI Academy、Udemy、Courseraがおすすめです。

kaggle Expert メダル ―――なるほど、ここからはkaggleでメダルを獲得するためのテクニックをいくつか質問させてください。参加コンペを選ぶ基準はありますか?

参加人数が多く、取り掛かりやすいテーブルコンペを選んでいます。皆にとってやりやすいコンペは僕にとってもやりやすいはずなので。 Severstal: Steel Defect Detectionは画像認識系のコンペですが、時期的にちょうど参加しやすいコンペが無かったので挑戦してみました。

―――「挑戦してみました。」でメダルが獲れるって凄いですね...。最終提出までのスケジュールを教えて下さい。

僕の場合は

  • 最後の1週間はブレンドとかスタッキングを行う
  • それまではEDAを丁寧に行う、テストデータを分布を見る
  • 並行してnotebookやディスカッションを追い続ける

よく言われている手法ですが、これに尽きると思います。 焦って早くにブレンドやスタッキングをおこなっても、また最後には再度おこなう必要があり、効率が悪いので耐えます。

―――今回銀メダルを獲得したコンペ、IEEE-CIS Fraud Detectionを振り返ってください。

このコンペは、世界有数の決済サービス会社であるVesta Corporationのデータを用いて開催された、カードの不正利用検出をおこなうコンペです。

kaggleで差がつくポイントは主にこの3つだと思っていて、

  • 特徴量作り
  • モデル作り
  • バリデーション

今回、僕はモデル作りが上手くいったと思います。 過学習を抑えるためにビギングしたモデルを入れ、バリデーションも工夫しました。 notebookやディスカッションを読んでいくと、多くの人がLightGBMを使っていたので、あまり使われていないモデルとブースティングしたことで、スコアの差をつけることができました。

また、リーダーボードで最終提出の2、3日前にでスコアが高いモデルが投入されましたが、 それはいわゆる悪魔の実で、パブリックスコアは上がるがプライベートスコアは下がるものでした。 僕も一瞬飛びつきたくなりましたが、他の予測と相関をみて、安易に使うのは危険だと採用を回避しました。経験で危険を察知することも大事ですが、ディスカッションを読むとちゃんと書いてあるので、見逃さずに丁寧に読んでいくことも大事です。

―――全てのnotebook、ディスカッションを読んでいるんですか?

金〜銅がついているnotebookは読んでいます。なにもついていないものは読んでいないです。

notebookとディスカッションを読んで試すことで到達できるのは銀までかと思っています。金を獲るにはオリジナルでないと厳しいです。 IEEE-CIS Fraud Detectionで金を獲っているカーネルはユーザーまでも特定していました。1回不正を行ったユーザーは2回目も不正である、とかまで必要なようです。

―――山口くんが辛かったことやつまづいたことってありますか?

ありますよ。笑 スコアが上がらないときはモチベーション下がり気味で、お腹痛いことも多々あります。 特に、Severstal: Steel Defect Detectionは上位6%から落ちて、なんとか上位10%に踏みとどまったので精神的に辛かったですね。 ただ、チームで参加したことが精神安定剤になりました。最後は個人プレイですが、仲間がいるっていいですね。

―――それはうちのインターン有利かも!今度、インターン生でsigenate賃料予測解説ディスカッションを行うんです。良さそうですか?

え、良さそう。答え合わせはためになるし、新たな気付きがたくさん得られそうですね。 kaggleやsignateのイベントに参加して解説を聞くのも良いですよ。僕はkaggle Daysに参加予定です。

―――当社で実案件にも入ってくれている山口くん。そこで感じたkaggleと実案件との違いを教えて下さい。

実案件では、お客様とのやり取りの中で目標(ゴール)が決まるので、目標がわかりにくい場面がありました。 あとはデータ収集と整形です。データ収集も僕たちで行い、画像認識の案件なので実際に写真を撮影しました。

そして最大の違いは、モデルを1から構築することです。当たり前ですが...。 コンペは最初に他人の考えやモデルを参考にできますが、実案件は1から試行錯誤する根気のいる作業です。 でも、インターンでこういう経験ができることはとても良かったです。 今はWEBアプリ開発案件に携わっていて、その次はインフラにも挑戦したいです。広く経験を積めることは良いですね。

―――今日は貴重なお話をありがとうざいました!

ありがとうございました〜。

おわりに

今回話してくれた内容はどのコンペでも転用できる内容でした。 今後も社内外で情報共有をし、さらなる成果を出せるようにしていきたいです。(週1ペースで勉強会をしています。)

その他当社インターンでは論文のまとめ記事を書いたり、実際に実装したりしています。 随時紹介していくので是非ご覧ください!

定期的にメルマガでも情報配信予定なので、問い合わせページに「メルマガ登録希望」とご連絡ください。


Twitter・Facebookで定期的に情報発信しています!

このアーカイブについて

このページには、過去に書かれた記事のうちkaggleカテゴリに属しているものが含まれています。

前のカテゴリは統計学です。

次のカテゴリはコラムです。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。