機械学習モデルの構築練習が出来るサービス、kaggleを始めてみました。kernelを用いて初めてsubmitするまでに行ったことを紹介します。
Contents
やったこと
・kaggleアカウント作成
・Titanicのコンペティション参加
・kernelを用いた学習モデル作成
・予測して提出
kaggleでは、サイト上でプログラムを実行することができます。データの読み込み、機械学習モデルの作成、予測、出力、提出まで、すべてブラウザ上で無料で行うことができました。
タイタニックコンペティション
常時参加可能な初心者向けコンペティションです。
乗客の性別や年齢といった与えられたデータから、タイタニック号で生存出来たかどうかの予測を行います。
kernel作成
コンペティションのサイトからNotebooksを選択→New Notebookを選択で、kernelを新規作成することができます。
Select type で Notebook を選択すれば、Jupyter Notebook のような要領でプログラムの作成、実行を行えます。
データの読み込み
このコンペティションでは、以下の3つのcsvファイルが用意されています。
test.csv : テストデータ。このデータの予測結果を提出する。
train.csv : 訓練データ。学習モデル構築に用いる。
gender_submission.csv : 解答例。
kernelから、pandasを用いてデータの読み込みを行っていきます。
データは、../input/titanic/ 上に格納されていました。
pandasを用いて配列に格納していきます。
訓練データの読み込み
1 2 3 4 5 6 7 8 |
import pandas as pd # train data load train = pd.read_csv("../input/titanic/train.csv") # 出力確認 print(train.shape) train.head() #先頭(最初)の行を返す |
結果
テストデータの読み込み
1 2 3 4 |
test = pd.read_csv("../input/titanic/test.csv") # 出力確認 print(test.shape) test.head() #先頭(最初)の行を返す |
結果
訓練データには、生存情報(Survived)が含まれていますが、テストデータには含まれていません。
この、テストデータに含まれる乗客の生存情報を、他の情報から予測していきます。
解答例の読み込み
1 2 3 4 5 |
# sample prediction pred = pd.read_csv("../input/titanic/gender_submission.csv") # 出力確認 print(pred.shape) pred.head() |
結果
このようなフォーマットのcsvファイルを作成し、提出することがコンペティションのゴールです。
この解答例では、男性を全て死亡、女性を全て生存と予測しています。
ちなみにこの予測方法で提出してみると、スコア(精度?)は0.76555になりました。
データの可視化
モデル構築のために有効そうな特徴量の選定を行っていきます。
コンペティションで与えられたデータには、一部値が空欄で欠損しているものがありました。
まずは欠損しているデータの確認を行います。
1 2 |
# train データの欠損値の数 train.isnull().sum() |
1 2 |
# test データの欠損値の数 test.isnull().sum() |
trainデータの結果
Age(年齢), Cabin(部屋番号), Embarked(乗船した港) の情報に欠損があることがわかりました。
今回は、データに欠損がなく扱いやすそうな Sex(性別), Pclass(階級) の二つを特徴量として扱います。
1 2 3 |
import seaborn as sns #性別と生存者数 sns.countplot(data=train, x="Sex", hue="Survived") |
1 2 |
#乗客の階級と生存者数 sns.countplot(data=train, x="Pclass", hue="Survived") |
seabornをインポートし、性別と階級別での生存者数の比較を行いました。
女性の方が生存率が高く、また階級が高い人の方が生存率が高いことがわかりました。
データ整形
性別と階級以外の、学習に用いない不要なデータを取り除きます。
また、与えられたデータでは、性別が male, female, で表現されているため、これを数値に変換する必要があります。
1 2 3 4 5 6 7 8 |
# 不必要な列を消去する train2 = train.drop(["PassengerId","Name","Age","SibSp","Parch","Ticket","Fare","Cabin","Embarked"], axis=1) test2 = test.drop(["PassengerId","Name","Age","SibSp","Parch","Ticket","Fare","Cabin","Embarked"], axis=1) # 性別を数値に変換 train2 = train2.replace("male",0).replace("female",1) test2 = test2.replace("male",0).replace("female",1) train2.head() |
これにより、配列が生存情報と特徴量だけのシンプルな状態になりました。
ランダムフォレストによる予測→提出
訓練データの配列を解答と特徴量の二つに分割し、これを元に機械学習モデルの構築を行います。
今回は、sklearnのRandomForestClassifierを用いました。
1 2 3 4 5 6 7 8 |
from sklearn.ensemble import RandomForestClassifier forest = RandomForestClassifier(n_estimators = 100) train_x = train2[["Pclass", "Sex"]] #特徴量 train_y = train2["Survived"] # 正解データ # 学習 forest = forest.fit(train_x, train_y) |
学習させた機械学習モデルを用い、テストデータの予測を行います。
予測結果から提出用のcsvファイルを生成しました。
1 2 3 4 5 6 7 8 9 10 |
test_x = test2[["Pclass", "Sex"]] # 予測 pred = forest.predict(test_x) result = pd.DataFrame({ "PassengerID" : test["PassengerId"], "Survived" : pred }) print(result) result.to_csv("result.csv", index=False) |
kernelで生成したcsvファイルは、Commitを行った後、
Versionsから任意のversionを選択
→Open versionを押下
→ページ遷移後、Output Files から『Submit to Competition』を選択
で、結果の提出を行うことができます。
提出した結果、自分がオリジナルで作成したモデルのスコアは0.75598でした。
性別で分けただけの解答例よりも悪い結果に……
スコアの結果は、ランキング形式で他のユーザーと比較することが出来ます。
おわりに
とりあえず一通りの方法を理解しました。
今後は特徴量を増やしたりして、せめてサンプルよりは予測精度を向上させたいです。
また、pandasやseabornといったライブラリの扱いもまだまだ不慣れなので、これを機会にゴリゴリ習得していきたいなあと思いました。
参考にしたサイト



つづき
