Lesson 17

コンペに挑戦しよう

Lesson 17 Chapter 1
Kaggleに登録する

Kaggle(https://www.kaggle.com/)とは、Kaggle社(2017年に Google に買収されました)によって設立された、 世界中のデータサイエンティストや機械学習エンジニアが集まるオンラインプラットフォームです。 さまざまなコンテスト(コンペティション)が開催されており、それらに参加することで、自分のスキルを磨いたり、賞金を獲得したりすることができます。

コンテストの種類としては、機械学習の分野から金融、医療、自然言語処理などの幅広い分野に関するものが開催されています。 コンテストに参加し、良い成績をとるには、データの分析や前処理、特徴量エンジニアリング、モデルの設計や評価など、機械学習に関する幅広いスキルが必要となります。 また Kaggle の参加者は、企業や研究者が公開したデータを利用することができるため、実世界の問題を解決するためのアプリケーションの開発につながる成果を生み出すこともあります。 以上のようなことから、Kaggle は、データサイエンスや機械学習の分野で活躍する人々にとって貴重なコミュニティあるいはスキルアップの場となっています。

この教材を通して機械学習や深層学習について学んできたみなさんには、既に Kaggle のコンテストに参加するための基礎的な知識が身に着いています。 そこで、ぜひ学んできたことを活かす場として Kaggle のコンテストに取り組んでもらうために、Kaggle の始め方などをここでは解説します。 なおこの Lesson 17 での説明は2023年4月2日時点のものです。Kaggle の仕様変更により操作が少し変わる場合もあるので注意してください。

まずは Kaggle のアカウントを作成しましょう。 こちらをクリックして、Kaggle の公式ウェブサイトに移行しましょう。

L17C1_kaggle1.png 出典:Kaggle, https://www.kaggle.com/

上記のような画面が開かれたら、右上の「Register」のボタンをクリックします。

L17C1_kaggle2.png 出典:Kaggle, https://www.kaggle.com/account/login/

Google のアカウントで登録するか email のアドレスで登録するかを聞かれるので好きな方を選びましょう。 今回は email の方を選びます。

L17C1_kaggle3.png 出典:Kaggle, https://www.kaggle.com/account/login/

email アドレス、パスワード、および名前の入力を求められます。ここで登録した名前は公開されるので注意しましょう(あとから変更できます)。 入力が済んだら、「Next」をクリックします。

L17C1_kaggle4.png 出典:Kaggle, https://www.kaggle.com/account/login/

プライバシーと規約が表示されるので、それを読み、同意するのであれば「I agree」をクリックします。

L17C1_kaggle5.png 出典:Kaggle, https://www.kaggle.com/account/login/

先ほど入力したメールアドレスを確認するため、そのメールアドレスに6桁のコードが送られます。それを入力し、「Next」をクリックしましょう。

L17C1_kaggle6.png 出典:Kaggle, https://www.kaggle.com/

上のような画面が開かれれば、アカウント作成およびログインに成功です。Kaggle を始めるための第一歩を踏むことができました。

Lesson 17 Chapter 2
チュートリアルコンペをやってみよう

Kaggle のコンテストは、コンペティション(通称コンペ)と呼ばれます。 Kaggle にはチュートリアルとして位置づけられているコンペがあるので、それに参加することを通して Kaggle のコンペへの参加の仕方を学びましょう。

Kaggle にログインした画面で、左側にあるメニューから「Competitions」を選びます。

L17C2_kaggle1.png 出典:Kaggle, https://www.kaggle.com/competitions/

開いた画面で、「Seacrh competitions」と書かれた検索バーがあるので、そこに「Titanic」と入力し、「Results」に表示されたコンペの中から チュートリアルコンペである「Titanic - Machine Learning from Disaster」を選択します。

L17C2_kaggle2.png 出典:Kaggle, https://www.kaggle.com/competitions/titanic/

このコンペは、タイタニック号の乗客に関するさまざまなデータから、その乗客が生存できたかどうかを予測するものです。 使用するデータセットがシンプルで初心者向けになっています。 このコンペを通して、データの前処理やモデルの選択、そして予測結果の提出までの一連の流れを学びましょう。

ではまずはコンペに参加するための操作を説明します。 右側にある「Submit Predictions」をクリックしましょう。 なおこのとき、場合によっては同じところに「Join Competition」というボタンが表示されているかもしれません。 その場合はまずこのボタンをクリックして、表示されるコンペのルールなどに目を通しましょう。それに同意後、「Submit Predictions」のボタンが現れるはずです。

L17C2_kaggle3.png 出典:Kaggle, https://www.kaggle.com/competitions/titanic/

すると上のような電話番号の入力を求めるダイアログが表示されるので、入力し、「Send verification code」をクリックします。

L17C2_kaggle4.png 出典:Kaggle, https://www.kaggle.com/competitions/titanic/

送信された認証コードを入力し、「Verify」をクリックしましょう。

L17C2_kaggle5.png 出典:Kaggle, https://www.kaggle.com/competitions/titanic/

すると画面右側に提出のための枠が出現するので、「Notebook」欄の「New Notebook」をクリックします。

L17C2_kaggle6.png 出典:Kaggle, https://www.kaggle.com/code/rn86222/notebook3af43269d9/edit/

すると上のような画面が開かれるでしょう。 これは Notebook というもので、Kaggle のコンペに参加するために、コードを書いたり予測結果を提出したりすることができる環境です。 データ分析や機械学習のために必要なライブラリは既にインストールされています。 プログラミング言語としては Python と R から選ぶことができますが、この教材では Python を使用することにします。 なお Notebook の操作方法は Jupyter Notebook と似ています。予測結果の提出の仕方など Kaggle の Notebook 特有の操作については後ほど説明します。

ではいよいよコードをこの Notebook 上に書いていきましょう。 まずは与えられたデータセットを確認してみます。 右側のメニューの「Input」を見てもわかるように、今回は「train.csv」、「test.csv」、「gender_submission.csv」の3つのファイルがあります。 これらの中身を少し見てみましょう。

Python
import pandas as pd

train = pd.read_csv("../input/titanic/train.csv")
test = pd.read_csv("../input/titanic/test.csv")
gender_submission = pd.read_csv("../input/titanic/gender_submission.csv")

上記のようにすることで、 csv ファイルを読み込んで DataFrame に変換できます。 DataFrame に対して head()を使うと先頭のいくつかのデータを表示させることができるので、 これを使ってtraintestgender_submissionをそれぞれ見てみます。

Python
train.head()
Python
test.head()
Python
gender_submission.head()

まずtrainについてですが、 これには乗客の情報として、PassengerId(乗客ID)、Survived(生存できたかどうか)、Pclass(チケットクラス)、Name(名前)、Sex(性別)、 Age(年齢)、SibSp(同乗していた兄弟・配偶者の数)、Parch(同乗していた親・子供の数)、Ticket(チケット番号)、Fare(運賃)、Cabin(客室番号)、Embarked(出港地) が記載されています。 一方testには、乗客の情報として Survived 以外が記載されています。 そしてgender_submissionには、testに対応した乗客の Survived だけが「女性のみが1」というルールで記載されています。

これはどういうことかというと、まず我々がモデルの学習に使えるのは「train.csv」であり、 それを使って予測するものは「test.csv」内の乗客の Survived で、その際の提出用ファイルのサンプルが「gender_submission.csv」ということです。 「train.csv」には乗客が生存できたかどうかの正解データが記載されているので、教師あり学習を行うことになります。

データの確認が済んだところで、データの前処理に移ります。 trainおよびtestに対してまとめて処理を行う方が何かと便利なので、 一旦次のようにしてひとまとめにします。後ほど学習などを行う際には分離して用います。

Python
train_and_test = pd.concat([train, test], sort=False)

concatによって複数の DataFrame を結合することができます。 なおあとで分離しやすいようにsort=Falseで結合の際のソートは無効化しています。

データの前処理として今回必要なのは、主に以下の3つです。

  • 欠損値の処理
  • 不必要な特徴量の削除
  • 文字列から数値への変換

まず欠損値の処理ですが、 欠損値かどうか調べるisnull()と合計値を求めるsum()を組み合わせて以下のようにすることで各列の欠損値をカウントできます。

Python
train_and_test.isnull().sum()

結果を見ると Survived、Age、Fare、Cabin、Embarked に欠損値があることがわかりました。 Survived に関しては元々testにその列がないので気にする必要はないです(len(test)と一致することを確かめましょう)が、 その他については何らかの処理を行う必要があると考えられます。 欠損値の処理としては、その行を削除してしまうか、代わりの値(平均値や最頻値)で埋めてしまうことが多いです。

まず Age ですが、これは平均値で欠損値を埋めましょう。 mean()で平均値を求められ、またfillna()で欠損値の置き換えができます。

Python
train_and_test["Age"].fillna(train_and_test["Age"].mean(), inplace=True)

次は Fare です。こちらも平均値で欠損値を置き換えます。

Python
train_and_test["Fare"].fillna(train_and_test["Fare"].mean(), inplace=True)

続いて Cabin ですが、これは乗客の生存にあまり関係がない可能性があるので、学習には使わないことにします。よって欠損値を処理する必要はありません。

最後に Embarked です。これはデータが文字列になっているので、平均値ではなく最頻値を使って欠損値を埋めます。 最頻値はmode()で取得できますが、これは値そのものではなく配列を返す(最頻値は複数ありうるので)ことに注意しましょう。

Python
train_and_test["Embarked"].fillna(train_and_test["Embarked"].mode()[0], inplace=True)
train_and_test.isnull().sum()

以上で欠損値の処理が済みました。 ところでデータが文字列のままでは扱いにくいので、欠損値の処理のついでに数値に変換しておきます。 今回の Embarked は3種類('C'、'Q'、'S')ありますが、これらに特に意味のある順番がつけられるわけではありません。 このようなときは Embarked_C、Embarked_Q、Embarked_S の3つの列を新たに作り、対応する列は0、それ以外は1になるようにします。 例えば Embarked が'Q'である乗客は、Embarked_C のみが1でそれ以外は0になるようにします。

実はこのような処理は Pandas のget_dummiesによって簡単に行うことができます。 Sex についても同様なのでこれらをまとめて処理しましょう。

Python
train_and_test = pd.get_dummies(train_and_test, columns=["Sex", "Embarked"])
train_and_test.head()

ではまだ処理していないデータについて見ていきましょう。 PassengerId、Name、Ticket は生存できたかどうかには関係ないと考えられるので、先ほどの Cabin と合わせて削除します。 これは Pandas の dropを使えば実行できます。

Python
train_and_test.drop(["PassengerId", "Name", "Ticket", "Cabin"], axis=1, inplace=True)
train_and_test.head()

axis=1で列の削除を指定しています。 では残りのデータについてです。Pclass は1~3の整数で、この値が小さい順に高いチケットクラスを表します。これはそのまま用いても良いでしょう。 SibSpと Parch もそのまま用います。 よってデータの前処理は以上になります。

続いて学習データを整備します。 train_and_testを分離して、さらに独立変数と従属変数をそれぞれ取り出します。

Python
train = train_and_test[:len(train)]
test = train_and_test[len(train):]

x_train = train.drop("Survived", axis=1)
y_train = train["Survived"]
x_test = test.drop("Survived", axis=1)

それではいよいよ学習と予測を行ってみましょう。 今回は乗客が生存したかどうかの2値分類なので、ロジスティック回帰を使います。 やり方は Lesson 15 で学んだ通りです。

Python
from sklearn import linear_model
logistic_regression = linear_model.LogisticRegression(max_iter=1000)

logistic_regression.fit(x_train, y_train)

y_pred = logistic_regression.predict(x_test)
print(y_pred)

このとき、y_predの中身を見ると、値は浮動小数点数になっています。 これを整数値に直しつつ、提出サンプルの「gender_submission.csv」と同じ形式で提出ファイルを作成しましょう。

Python
submission = gender_submission
submission["Survived"] = list(map(int, y_pred))
submission.to_csv("submission.csv", index=False)

gender_submissionをコピーし、 map(int, y_pred)によって値を整数に変換したものを"Survived"の列に入れ、 最後に csv ファイルに変換しています。

提出用ファイルができたので、実際に提出してみます。 右側のメニューに「Submit to competition」があるのでそれを開き、「Submit」をクリックします。

L17C2_kaggle7.png 出典:Kaggle, https://www.kaggle.com/code/rn86222/notebook3af43269d9/edit/

すると上のようになるので、「Submit」ボタンを押すと提出完了です。 提出したファイルは自動で採点され、採点が終わるとスコアが表示されます。 またコンペのページから「LeaderBoard」を開くと順位表が掲載されており、自分の順位を確認することができます。 ぜひさまざまな工夫を凝らすことで、より高いスコアや順位を目指してみましょう。