Kaggle:タイタニック号乗客の生存予測のデータセット その14:Ageの欠損値を修正してみる 機械学習編

目次

Kaggle

前回は機械学習・データサイエンスのプラットフォーム「Kaggle(カグル)」の「タイタニック号乗客の生存予測」のデータセットのAgeの欠損値を重みありのランダムに設定してみました。

今回はAge(年齢)の欠損値を機械学習で予想できるのかを試してみたいと思います。

そして精度よく予想できたら、その値を使って、さらに生存予測をしていくという戦略です。

ではまずは前回同様、データの読み込みとこれまでの修正を行っていきます。

<セル1>

import pandas as pd

train = pd.read_csv("train.csv")
test = pd.read_csv("test.csv")

train.loc[train["Sex"] == "male", "Sex"] = 0
train.loc[train["Sex"] == "female", "Sex"] = 1
test.loc[test["Sex"] == "male", "Sex"] = 0
test.loc[test["Sex"] == "female", "Sex"] = 1

test.loc[test["Fare"].isnull() == True, "Fare"] = 7.8875

train.loc[train["Embarked"].isnull() == True, "Embarked"] = "S"

train.loc[train["Embarked"] == "S", "Embarked"] = 0
train.loc[train["Embarked"] == "C", "Embarked"] = 1
train.loc[train["Embarked"] == "Q", "Embarked"] = 2
test.loc[test["Embarked"] == "S", "Embarked"] = 0
test.loc[test["Embarked"] == "C", "Embarked"] = 1
test.loc[test["Embarked"] == "Q", "Embarked"] = 2

all_data = pd.concat([train.drop(columns = "Survived"), test])

all_data

そしてAge(年齢)の欠損値の数を確認しておきましょう。

<セル2>

all_data.isnull().sum()

実行結果
PassengerId       0
Pclass            0
Name              0
Sex               0
Age             263
SibSp             0
Parch             0
Ticket            0
Fare              0
Cabin          1014
Embarked          0
dtype: int64

1309個のデータ中、263個のデータが欠損しています。

この状況からAgeの値を機械学習・予想するプログラムを作成していきましょう。

Ageに対する機械学習の準備

Ageの値が欠損していない1046個のデータを訓練用データセットとして機械学習させていきます。

ということでAgeの値が欠損していないデータと欠損しているデータを寄り分けます。

<セル3>

Age_yes = all_data[all_data["Age"].isnull() == False]
Age_no = all_data[all_data["Age"].isnull() == True]

実行結果

「Age_yes」にAgeの値が欠損していないデータを、「Age_no」にAgeの値が欠損しているデータを寄り分けました。

ここでは寄り分けただけなので、実行しても何も起こっていないように見えます。

それぞれのデータを表示してみましょう。

<セル4>

Age_yes

実行結果
<セル5>

Age_no

実行結果

これでAgeが欠損していないデータと欠損しているデータにより分けることができました。

一応、それぞれのデータセットの欠損値の数を確認しておきましょう。

<セル6>

Age_yes.isnull().sum()

実行結果
PassengerId      0
Pclass           0
Name             0
Sex              0
Age              0
SibSp            0
Parch            0
Ticket           0
Fare             0
Cabin          774
Embarked         0
dtype: int64
<セル7>

Age_no.isnull().sum()

実行結果
PassengerId      0
Pclass           0
Name             0
Sex              0
Age            263
SibSp            0
Parch            0
Ticket           0
Fare             0
Cabin          240
Embarked         0
dtype: int64

確かに寄り分けられています。

機械学習を試してみる

ではAgeのデータが欠損していないデータセット「Age_yes」を使って機械学習させてみましょう。

今回は数値を予想したいので、回帰(Regression)になります。

ということで一番基本的な「LinearRegression」モデルを使って機械学習させてみます。

今のところ、欠損していないデータは「Pclass」、「Sex」、「SibSp」、「Parch」、「Fare」、「Embarked」ですのでとりあえず全部説明変数として使ってみることにします。

<セル8>

from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import r2_score

x = Age_yes.loc[:, ["Pclass", "Sex", "SibSp", "Parch", "Fare", "Embarked"]]
y = Age_yes["Age"]

x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, train_size=0.8)

model = LinearRegression()
model.fit(x_train, y_train)
pred = model.predict(x_test)

print(r2_score(y_test, pred))

実行結果
0.17765627431220632

スコアが「0.17766」というかなり低いスコアになってしまいました。

これでは満足に予想できているとは言えません。

その原因を探るため、それぞれの値間の相関係数を計算してみます。

<セル9>

corr = Age_yes.corr()

corr

実行結果

Ageの列を見てみると、「Pclass」が-0.48106となっており、負の相関が少しあるように見えます。

他の値は残念ながら、ほとんど相関がないようです。

ということで説明変数を「Pclass」だけにして、再度機械学習を試してみます。

<セル10>

from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import r2_score

x = Age_yes.loc[:, ["Pclass"]]
y = Age_yes["Age"]

x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, train_size=0.8)

model = LinearRegression()
model.fit(x_train, y_train)
pred = model.predict(x_test)

print(r2_score(y_test, pred))

実行結果
0.13841400089854328

「0.13841」とかなり低いスコアとなってしまいました。

ということは機械学習でAge(年齢)の値を予測するのは難しそうということです。

残念ながらこのアイデアはボツということで、次回からはもう少し地道にAgeの欠損値を埋めていく方法をかんがえていきましょう。

ではでは今回はこんな感じで。

よかったらシェアしてね!

コメント

コメントする

目次
閉じる