約半年前に登録していたKaggle。
https://elsammit-beginnerblg.hatenablog.com/entry/2020/09/24/221054
たまに機械学習の環境として利用させていただいていたのですが、
何も挑戦していなかったんですよね😥
まだ早い、まだ早い、と思ってしまい一歩が踏み出せなかった。。
ふと、
流石に登録しただけじゃな、、
ちょっと挑戦してみよう!!
と思い立ち、
まずは登竜門である「Titanic - Machine Learning from Disaster」を解いて投稿まで実施してみることにしました!!
■Titanic - Machine Learning from Disasterとは?
Kaggle側が用意した機械学習初学者向けの課題です。
課題はタイタニック号の難破船を生き延びた乗客を予測するモデルの作成
になります。
用意されているデータは、
トレーニング用データ:train.csv
テスト用データ:test.csv
テスト結果データ:gender_submission.csv
の3つです。
トレーニングデータはこちらのようなデータが格納されております。
テストデータはこちら。
要するにトレーニングデータを元に学習を進めて、
テストデータより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列が追加されているのが分かるかと思います。
では次にトレーニングデータを元に学習を進めていきます。
モデルは使い慣れている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選択。
そして、下記の通り先ほど作成したresult.csvをアップロードの上、
Make Submissionを押下すればOKです。
結果ですが、
20611位
ぐらいかな??あまりに結果が悪すぎて順位が見切れてしまっている。
あまりいい結果が得られず残念😥
■他の方のコードを流用してみる
では次に学習も兼ねて他の方のコードを参考にしてみます。
今回はこちらの方を参考にさせて頂きました。
www.codexa.net
詳しいコードはこちらのサイトにて説明されているのでこちらでは省きますが、
私のコードと異なる点は、
①モデルは決定木を用いていること
②性別とEmbarkedを置き換えている
③欠損されたデータに対して平均値を用いて補完をしっかり行っている
の3点でした。
こちらの結果を先ほどと同様にcsvファイルにしてアップロードを行ってみたところ、
スコアは0.73で順位は19000台になりました!!
■最後に
今回は初めてのKaggle投稿に調整してみました!!
他の方のコードを見て思ったのは、
データが上手く扱えていない、適切なモデルを選択出来ていない!!
機械学習を行う上でこれらは重要になるので、、勉強進めます。
後、ただ机上で勉強だけしても生のデータ扱わないと伸びないところもあるかと思うので、
もっと積極的にKaggleのコンペにも参加していきたいと思いました👍