LoginSignup
29
24
記事投稿キャンペーン 「2024年!初アウトプットをしよう」

KaggleのTitanicで上位10%のスコアを出す

Last updated at Posted at 2024-01-07

KaggleのTitanicで上位10%のスコアを出すことができたため、コードをメモしておきます。
スコア上昇のためにsklearn.ensemble.VotingClassifierを用いたアンサンブル学習を行いました。

ライブラリの読み込み

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

データの読み込み

pandas.dataframeを用いて、学習データ、テストデータ、提出データをデータフレームとして代入します。

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

データの可視化

Survivedの可視化

seaborn.countplotを用います。

sns.countplot(x="Survived", data=train)
plt.show()

__results___11_0.png

Survived、Pclass、Age、SibSp、Parch、Fareの関係の可視化

seaborn.pairplotを用います。

sns.pairplot(train[["Survived", "Pclass", "Age", "SibSp", "Parch", "Fare"]], hue="Survived")
plt.show()

__results___12_0.png

Pclassの可視化

seaborn.countplotを用います。

sns.countplot(x="Pclass", hue="Survived", data=train)
plt.show()

__results___14_0.png

次に、seaborn.catplotを用います。

g = sns.catplot(x="Pclass",y="Survived", data=train, kind="bar")
g = g.set_ylabels("survival rate")
plt.show()

__results___15_0.png

Sexの可視化

seaborn.countplotを用います。

sns.countplot(x="Sex", hue="Survived", data=train)
plt.show()

__results___18_0.png

次に、seaborn.catplotを用います。

g = sns.catplot(x="Sex",y="Survived", data=train, kind="bar")
g = g.set_ylabels("survival rate")
plt.show()

__results___19_0.png

Ageの可視化

seaborn.histplotを用います。

sns.histplot(data=train.dropna(subset=["Age"]), x="Age", hue="Survived", kde=True)
plt.show()

__results___22_0.png

SibSpの可視化

seaborn.catplotを用います。

g = sns.catplot(x="SibSp",y="Survived", data=train, kind="bar")
g = g.set_ylabels("survival rate")
plt.show()

__results___24_0.png

Parchの可視化

seaborn.catplotを用います。

g = sns.catplot(x="Parch",y="Survived", data=train, kind="bar")
g = g.set_ylabels("survival rate")
plt.show()

__results___26_0.png

SibSp + Parchの可視化

seaborn.catplotを用います。

train["TotalFamily"] = train["SibSp"] + train["Parch"]

g = sns.catplot(x="TotalFamily", y="Survived", data=train, kind="bar")
g.set_ylabels("Survival rate")
plt.show()

__results___28_0.png

Fareの可視化

seaborn.histplotを用います。

sns.histplot(data=train.dropna(subset=["Fare"]), x="Fare", hue="Survived", kde=True)
plt.show()

__results___30_0.png

Embarkedの可視化

seaborn.catplotを用います。

g = sns.catplot(x="Embarked",y="Survived", data=train, kind="bar")
g = g.set_ylabels("survival rate")
plt.show()

__results___32_0.png

データ前処理

データの読み込み

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

trainとtestの連結

pandas.concatを用いて、データフレームを結合します。

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

欠損値の確認

pandas.isnullpandas.DataFrame.sumを用いて、欠損値をカウントします。

data.isnull().sum()

ラベルエンコーディングと欠損値の補完

Sex

ラベルエンコーディングにはsklearn.preprocessing.LabelEncoderを用います。

from sklearn.preprocessing import LabelEncoder

le = LabelEncoder()
data['Sex'] = le.fit_transform(data['Sex'])
data.head()

femaleが0、maleが1となりました。

Age

欠損値を中央値で置換します。

data['Age'].fillna(data['Age'].median(), inplace=True)

Fare

欠損値を平均値で置換します。

data['Fare'].fillna(np.mean(data['Fare']), inplace=True)

Embarked

pandas.DataFrame.fillnaを用いて欠損値をSで置換した後、ラベルエンコーディングを行います。

data['Embarked'].fillna(('S'), inplace=True)
data['Embarked'] = le.fit_transform(data['Embarked'])
data.head()

Cが0、Qが1、Sが2となりました。

TotalFamily (SibSp + Parch)の作成

data["TotalFamily"] = data["SibSp"] + data["Parch"]

Name、PassengerId、Ticket、Cabinの削除

データ分析に用いない列、Name、PassengerId、Ticket、Cabinを削除します。

delete_columns = ['Name', 'PassengerId', 'Ticket', 'Cabin']
data.drop(delete_columns, axis=1, inplace=True)

学習データとテストデータの抽出

train = data[:len(train)]
test = data[len(train):]
y_train = train['Survived']
X_train = train.drop('Survived', axis = 1)
X_test = test.drop('Survived', axis = 1)

学習

RandomForestClassifierGradientBoostingClassifierKNeighborsClassifierSVCVotingClassifierを用いて、学習を行います。

from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier, VotingClassifier
from sklearn.neighbors import KNeighborsClassifier
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC

clf_rf = RandomForestClassifier(max_depth=2, random_state=0)
clf_gb = GradientBoostingClassifier()
clf_knn = KNeighborsClassifier()
clf_svc = make_pipeline(StandardScaler(), SVC(probability=True))

ensemble_clf = VotingClassifier(estimators=[('rf', clf_rf), ('gb', clf_gb), ('knn', clf_knn), ('svc', clf_svc)], voting='soft')
ensemble_clf.fit(X_train, y_train)

予測を行い、予測結果を表示します。

y_pred = ensemble_clf.predict(X_test)
y_pred[:10]
array([0., 0., 0., 0., 0., 0., 0., 0., 1., 0.])

スコアを表示します。

ensemble_clf.score(X_train, y_train)

スコアは0.8821548821548821でした。

データの出力

提出データをsubmission.csvとして出力します。

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

提出した結果と順位を以下に示します。

スクリーンショット 2024-01-07 16.39.14.png

15994人中1508位(2024年1月7日現在)と、上位10%のスコアを出すことができました。

もう一度同じコードで提出してみました。

スクリーンショット 2024-01-09 12.20.15.png

スコアが0.79425に上昇し、16104人中1276位(2024年1月9日現在)と、上位8%のスコアを出すことができました。

アンサンブル学習によりスコアが上昇することを実感しました。
他のコンペにもアンサンブル学習を用いて挑戦したいです。

参考文献

https://qiita.com/upura/items/3c10ff6fed4e7c3d70f0
https://www.kaggle.com/code/sishihara/upura-kaggle-tutorial-01-first-submission
https://ct-innovation01.xyz/DL-Freetime/kaggle-003/
https://qiita.com/kunishou/items/bd5fad9a334f4f5be51c

29
24
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
29
24