週末記録

自分メモのため散らかりまくり

Kaggle のTitanicチュートリアルやってみたメモ

はじめに

Kaggleはどうなんだろうとふと思い立ちTitanicチュートリアルをやってみました。Submitまでの大きな流れは理解できたと考えます。初見のため他の方のブログを参考にし、たまたま openml のデータセットを用いる例を参照したことで、submit時にそれなりに迷いましたが、無事submitまでたどりつきました。迷って試行錯誤したことでより理解できたと良い方向に考えています。

Submit 記録↓

対象チュートリアル

www.kaggle.com

実施環境

環境としてはGoogle Colab 環境で実施しました(Kaggle Jupyter Notebook、Google Colab どちらの環境がベターなのかわかりませんが、Google Colab は他でも使用していたため、今回も Google Colab を使用しました)。

Submit までの大きな流れ

  1. データセット取得
  2. データ前処理
  3. 学習、予測
  4. Submit

具体的な実施方法は多くのブログでも記載されている為、詳細はここでは記載しませんが素直に Kaggle が用意した学習データで学習し、テストデータを用いて予測、結果提出の流れがよさそうです。

 

はまった点(openmlのdatasetを使ったためにはまった点)

  • Kaggleのdataset と列名が異なる
    • Kaggleで submitするには列名を合わせる必要があるが、何を submit 必要なのかすら知らない初見では迷う。学習モデルを適用する際にも形式を合わさないといけない点も面倒。
    • openml の dataset はこちら

    • Kaggle の dataset はこちら

  • test データと training データが分かれていない
    • Taitanic チュートリアルでは418行の結果提出を求められるが、単純に提出結果の行数を合わせるだけでなく、test.csvと同一の対象者に関する結果提出が必要。418行より多くても少なくても、対象者が異なってもダメ(Kaggle側が用意した test.csv を対象にした結果を提出必要)。openml のデータを使用して自分で training と test データを分けたりしたことで結果提出時にFAILとなり結局 Kaggle 側が用意した test.csv を用いて提出しました。
    • 対象者が異なるとFAILEDした例↓
    •  

実施したコマンド達(メモ)

  • X.isnull().sum()
    • データ欠損チェック用(欠損数 0以外のデータで重要そうなものは対処必要)

  • X["age"] = X["age"].fillna(X["age"].median())
    • 中央値で補う
  • X["embarked"] = X["embarked"].fillna("S")
    • 多い数で補う
  • X["sex"] = pd.get_dummies(X["sex"], drop_first=True)
    • 文字列データを数値に置き換え
       
  • X = pd.concat([X, pd.get_dummies(X["embarked"], prefix="embarked")], axis=1).drop(columns=["embarked"])
    • 複数値を持つカラムを個別のカラムに分離
  • PassengerId = test_y.index.astype(int)
    • int 指定
  • my_solution = pd.DataFrame(pred_X, PassengerId, columns = ["Survived"])
    • PassengerId と pred_X を組み合わせる
  • my_solution.to_csv("titanic_solution_01.csv", index_label = ["PassengerId"])
    • csvファイル出力
  • feature_columns =["Name""SibSp""Parch""Ticket""Fare""Cabin""Sex""Age""Embarked","Pclass"]
  • test_kaggle = test_kaggle.drop(columns=feature_columns, axis=1)
    • 対象カラムをdrop
  • from sklearn.metrics import accuracy_score
  • accuracy_score(test_y, pred_X)
    • 予測がどの程度あってるか確認
  • from sklearn.model_selection import train_test_split
  • seed=0
  • train_X, test_X, train_y, test_y  = train_test_split(X, y, test_size=0.35, random_state=seed)
    • training データと test データ(35%)に分離(Kaggleのdataset使えばこういうの必要ない)
  • from sklearn.tree import DecisionTreeClassifier
  • tree_model = DecisionTreeClassifier()
  • tree_model.fit(train_X, train_y)
  • pred_X = tree_model.predict(test_X)
    • 学習、予測

以上