#はじめに
本記事は、私の苦難に基づくKaggle経験を共有させていただくものです。
Kaggle Competitionsの登録、及び予測値の提出(submit predictions)について説明しております。
ただし、恐らくはほとんどの人にとって説明されるまでもない内容です。(本当に)
お目汚しすることをお許しください。
※用語等を誤った意味で使用している可能性があります。ご指導・ご指摘いただけると幸いです。
※コード記述方法等も見るに耐えない可能性があります。ご指導・ご指摘いただけると幸いです。
#Kaggle挑戦と記事投稿に至るまで
データサイエンスの道を志して一念発起、今月12月7日から勉強を開始しました。
しかし前職を含め今までの人生でプログラミングを扱ったことはまったくありません。
資料作成目的でワードやエクセル、パワポを使用するくらいで、強いて言えばオンラインゲームにどハマりしていた経験からタイピングが少しだけ早いくらいです。
Qiitaの場をお借りして細々と学習記録をつけていたとおり、勉強を開始して最初の2週間は書籍やProgateを用いて基礎の理解・徹底を図っておりましたが、やはり習熟するためには実践的なアウトプットが必要不可欠と考え、Kaggleコンペへ投稿することを決意、半ば無理やりではありましたが、試行錯誤しつつ3週間目でなんとか成果物を投稿することができました。
ただ、Kaggleは英語onlyですし、機械学習についても理解が浅い私にとって、コンペ登録から提出に至るまでの一挙一動は全てが迷いから入り、どこをどうすればいいのかわからない日々が続きました。(調べるなかで色々と学ぶこともできたので決して無駄な日々ではありませんでしたが。)
しかし、私のレベルで理解できる資料があれば、もっと円滑に投稿することができたというのもまた事実です。
このような考えのもと、これからKaggleコンペを挑戦しようとしている方や、(もしいるなら)同じようなレベル感の方々の参考になればと思い、なるべくわかりやすくコンペの登録と予測値の提出について説明しました。
もし、わかりづらい点等があったら、ご指導ご指摘いただけると非常に嬉しいです。
#Kaggle Competitionsへの登録
1. Kaggle公式 へアクセス
2. "Competitions" をクリック。Sort byの"Recently Created"で最近始まった順にコンペがソートされます。
3. 今回は赤枠で囲ったコンペに参加します。(2クラス分類、自然言語処理)
4. "Rule"の内容を確認したうえで、"Join Competition"で参加。Rulesの内容はコンペにより異なりますが、チームの最大人数や提出期限に関する記載があります。
5. "Data"の"Download all"からコンペに使用するデータセットを入手。train.csvは学習用、test.csvは予測用、sample_submission.csvは提出様式です。
6. コンペ開始。Kaggleの"Notebooks"機能を利用して作成・提出することもできますが、私はJupyter Notebookを使用して実施しました。Anacondaをインストールすれば一緒に付いてくるのでおすすめです。
#分析・予測(機械学習)
大筋の流れは以下のとおりです。
1. 各種モジュールインポート
pandas, numpy, scipy etc...
2. データの読み込み
read_csv でデータセットを読み込む。
3. 前処理
欠損値の把握 : 代表値で置換するか、平均をとるか、それとも削除するか。)
データの分割 : train.csvとtest.csvを学習用と予測用でそれぞれ2つに分ける。(XとY)
4. モデル作成
線形、決定木、ニューラルネットワーク etc...
5. モデルによる学習
3項で分割した学習用データ(X_trainとy_train)を使用してモデルに学習(fit)させる。
6. 予測値の算出
5項のモデルを使用して予測用データの片方(X_test)を予測(predict)し、予測値を算出する。
7. 評価
6項で算出した予測値を使用し、y_testと答え合わせをする。(sklearnのaccuracy_scoreを使用)
8. モデルやパラメータ等のチューニング(必要に応じて)
最初に記載したとおり、機械学習部分については、私が参加したコンペの規約上の理由や、またコンペによっても分析方法が異なるといった理由から、本記事においては割愛します。
機械学習について参考となる記事等は タイタニック号の乗客生存予測 の解説をはじめ、多く存在しますので検索してみてください。
本コンペは既に終了しているため賞金等はありませんが、機械学習初心者のチュートリアルとしてよく推薦されるコンペの1つであり、解説記事を見ながら一度通して手を動かすだけでも非常に勉強になります。
#予測値の提出(Submit Predictions)
一連の機械学習を経て満足のいくモデルが作成できたならば、提出用ファイル(submission)を作成します。
どのコンペにおけるデータセットでも提出用サンプルがあるはずなので、それに基づいて形を整えます。
やり方は色々あると思いますが、私はtest.csvをpredictした結果(target列)とsample.csvのtarget列を置換する方法で実施しました。
コンペの性質によって処理は当然異なりますが、自然言語処理であれば以下のような形があります。
# "test.csv"の"text"列のみ抜き出す。
presub1 = test["text"]
# ベクトル化する。(自然言語処理課題の場合。)
tfidf_vect = TfidfVectorizer()
presub2 = tfidf_vect.transform(presub1)
# 作成したモデルで予測する。
presub3 = model.predict(presub2)
# "sample.csv"のtarget列と予測した結果(target列)を置換する。
sample["target"] = presub3
# 置換できていることを確認する。今回はprintを使用。
# 実行前のtarget列はすべて"0"だったので、変化していれば置換できているものとみなす。
print(sample)
# csvファイルに出力する。index(一連番号)は付いているので、今回はFalseとする。
# 第1引数は出力するファイル名。自分がわかればよいと思う。
sample.to_csv('submission.csv', index = False)
以上により、カレントディレクトリに"submission.csv"が出力される。
参加コンペのページに飛び、以下の要領で提出する。
1. 画面右上の"Submit Predictions"をクリック
2. 出力した提出用のCSVファイルを①にドラック&ドロップし、アップロードが完了したら②をクリックして提出。異状がなければ"Leaderboard"に登録されます。
以上でKaggleへの投稿は完了です。
投稿後はより高い精度を目指して試行錯誤し、他の参加者と競い合っていくことになります。
前処理を工夫する、モデルを変える、モデルを重ねる、パラメータをチューニングするなど、色々と工夫できる点は多いです。
自分のカーネルを公開している方もいますが、驚くような手法を使って精度を追求している方もいます。
ただ残念なことに、本コンペについては先日、結果のリークがあったようでLeaderboardはscore1.0(満点)で埋まっています・・・。こういうこともあるということで。
#おわりに
データセットを少し加工して既存モデルに学習させ、予測値を出し、csvファイルに出力し直して提出。
振り返ってみれば本当に大したことはしていないのですが、コードも書いた経験もない、ターミナルが何かもわからない、というレベルから勉強を始めた私にとって、ここまでの道は苦難の連続でした。
現時点でのscoreは良い数値ではありませんし、コードの書き方についても決してスマートではないはずです。
ですが、それでも試行錯誤して投稿することで非常に多くを身に着けることができました。当然、学ぶべきことはまだまだ限りがありませんので、引き続き自己研鑽に励んでいこうと思います。
稚拙な内容ではありましたが、本記事が同じような立場の方々にとって少しでも参考になるようであれば幸いです。
お目通し頂きありがとうございました。