Elsaの技術日記(徒然なるままに)

主に自分で作ったアプリとかの報告・日記を記載

MENU

Kaggle初心者がTitanic - Machine Learning from Disasterを解いてみた

約半年前に登録していたKaggle。
https://elsammit-beginnerblg.hatenablog.com/entry/2020/09/24/221054

データサイエンスの森 Kaggleの歩き方

たまに機械学習の環境として利用させていただいていたのですが、
何も挑戦していなかったんですよね😥
まだ早い、まだ早い、と思ってしまい一歩が踏み出せなかった。。

ふと、
流石に登録しただけじゃな、、
ちょっと挑戦してみよう!!
と思い立ち、
まずは登竜門である「Titanic - Machine Learning from Disaster」を解いて投稿まで実施してみることにしました!!



■Titanic - Machine Learning from Disasterとは?

Kaggle側が用意した機械学習初学者向けの課題です。
課題はタイタニック号の難破船を生き延びた乗客を予測するモデルの作成
になります。

用意されているデータは、
レーニング用データ:train.csv
テスト用データ:test.csv
テスト結果データ:gender_submission.csv
の3つです。
レーニングデータはこちらのようなデータが格納されております。
f:id:Elsammit:20210306120300p:plain

テストデータはこちら。
f:id:Elsammit:20210306120424p:plain

要するにトレーニングデータを元に学習を進めて、
テストデータよりSurvived(0/1)を予測してね。
という問題になります。

■まずは自力で

ではまずは自力で実施してみました。

まずは先ほど取得したcsvを読み出します。
そして、性別とEmbarked(出港地)を文字列⇒整数値に変換した結果を列に追加していきます。
コードはこちら。

import numpy as np # linear algebra
import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)

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

def type_to_num(p_type,test):
    if p_type == test:
        return 0
    else:
        return 1

def Embarked_Num(Embarked):
    if Embarked == "S":
        return 0
    elif Embarked == "C":
        return 1
    elif Embarked == "Q":
        return 2
    else:
        return 0
    
Sex = train["Sex"].apply(type_to_num,test="male")
train["sex_num"] = Sex
Embarked = train["Embarked"].apply(Embarked_Num)
train["Embarked_num"] = Embarked
train["Age"] = train["Age"].fillna(train["Age"].median())

train.head(5)

試しにこちらを実行すると、こちらのようにEmbarked_numとsex_num列が追加されているのが分かるかと思います。
f:id:Elsammit:20210306121602p:plain

では次にトレーニングデータを元に学習を進めていきます。
モデルは使い慣れているLogisticRegressionで実施してみました。

from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split

X = train.loc[:,["Pclass","Age","SibSp","Parch","Fare","sex_num","Embarked_num"]].values
y = train["Survived"].values

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.1, random_state=0)

lr = LogisticRegression(C=1.0)
lr.fit(X, y)

そして、、、トレーニングしたモデルで実際に予測を行ってみたいと思います!!
先ほどと同様に性別等を文字列⇒整数値に変換し列追加して、モデルに引数として与えて予測させてみます。

Sex_Test = train["Sex"].apply(type_to_num,test="male")
test["sex_num"] = Sex_Test
Embarked_test = train["Embarked"].apply(Embarked_Num)
test["Embarked_num"] = Embarked_test
test["Age"] = test["Age"].fillna(train["Age"].median())
test.Fare[152] = test.Fare.median()

Xtest = test.loc[:,["Pclass","Age","SibSp","Parch","Fare","sex_num","Embarked_num"]].values
ytest = sample["Survived"].values

print("-------------------------------------------------")
print("testデータに対するscore: %.3f" % lr.score(Xtest, ytest))
print("-------------------------------------------------")

こちらを実施した結果、、、(泣)

-------------------------------------------------
testデータに対するscore: 0.531
-------------------------------------------------

ダメダメでした。。

ただせっかく頑張ったので、とりあえずアップしてみることに。
アップは予測結果を書き込んだcsvファイルで行うようなので予測結果をcsvファイルに書き込みます。
コードはこちら。

Prediction = lr.predict(Xtest)

PassengerId = np.array(test["PassengerId"]).astype(int)
solution = pd.DataFrame(Prediction, PassengerId, columns = ["Survived"])
solution.to_csv("result.csv", index_label = ["PassengerId"])

こちらを実行するとresult.csvが生成されます。

では早速結果をアップしてみます。
アップは、
Titanic - Machine Learning from Disaster
コンペに行き、Submit Predictions選択。
f:id:Elsammit:20210306122514p:plain

そして、下記の通り先ほど作成したresult.csvをアップロードの上、
Make Submissionを押下すればOKです。
f:id:Elsammit:20210306122708p:plain

結果ですが、
20611位
ぐらいかな??あまりに結果が悪すぎて順位が見切れてしまっている。
あまりいい結果が得られず残念😥

■他の方のコードを流用してみる

では次に学習も兼ねて他の方のコードを参考にしてみます。
今回はこちらの方を参考にさせて頂きました。
www.codexa.net

詳しいコードはこちらのサイトにて説明されているのでこちらでは省きますが、
私のコードと異なる点は、
 ①モデルは決定木を用いていること
 ②性別とEmbarkedを置き換えている
 ③欠損されたデータに対して平均値を用いて補完をしっかり行っている
の3点でした。

こちらの結果を先ほどと同様にcsvファイルにしてアップロードを行ってみたところ、
スコアは0.73で順位は19000台になりました!!

■最後に

今回は初めてのKaggle投稿に調整してみました!!
他の方のコードを見て思ったのは、
データが上手く扱えていない、適切なモデルを選択出来ていない!!

機械学習を行う上でこれらは重要になるので、、勉強進めます。
後、ただ机上で勉強だけしても生のデータ扱わないと伸びないところもあるかと思うので、
もっと積極的にKaggleのコンペにも参加していきたいと思いました👍