見出し画像

線形回帰でタイタニックを試す 2

こんにちは、junkawaです。
前回に引き続き、cousera machine learningで学んだ線形回帰を使ってKaggleのタイタニックコンペを解いていきます。

今回は、正規方程式を実装して線形回帰を解きます。

Colaboratoryで実行した結果を記します。

データの準備

import pandas as pd
import numpy as np

def prepareData(data):
  data.loc[data["Sex"] == "male", "Sex"] = 0
  data.loc[data["Sex"] == "female", "Sex"] = 1
  data["Age"] = data["Age"].fillna(data["Age"].median())

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

X = train.loc[:,["Sex","Age","SibSp","Parch","Fare"]]
y = train.loc[:,"Survived"]
X = X.assign(One=1).loc[:,["One","Sex","Age","SibSp","Parch","Fare"]]

ここまでは前回と同じです。
トレーニングデータ train.csv をprepareData()で前処理します。

前回との違いは、feature scalingが必要ないところです。
正規方程式では最急降下法のように漸次 theta を変化させるのではなく、式を解くことで一度に解(theta)を求めます。
従って、パラメタ(theta0、theta1、...、thetan)毎の変化の幅を均一にするfeature scalingが不要となります。

そんなナイスな方法(正規方程式)があるなら、最急降下法を使わなくてもいいのでは、と思いますが、正規方程式にも欠点があります。
パラメタ数が多くなると計算に時間がかかる、データ数が少ないと解が出ない、などです。

正規方程式

def normalEqn(X, y):
  theta = np.linalg.inv(X.T.dot(X)).dot(X.T).dot(y)
  return theta

theta = normalEqn(X.values, y.values)

normalEqn()で、上記の数式(正規方程式)を解いています。
最急降下法と異なり簡潔ですね。

参考

テストデータへ適用

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

Xdash = test.loc[:,["Sex","Age","SibSp","Parch","Fare"]]
Xdash = Xdash.assign(One=1).loc[:,["One","Sex","Age","SibSp","Parch","Fare"]]

def hypothesis(X, theta):
  return X.dot(theta) 

predictions = hypothesis(Xdash, theta)
predictions = pd.DataFrame(data=predictions)
predictions.columns = ["Survived"]
predictions[predictions >= 0.5] = 1
predictions[predictions < 0.5] = 0
predictions[["Survived"]] = predictions[["Survived"]].fillna(0.0).astype(int)

output = test.loc[:,["PassengerId"]].join(predictions)
output.to_csv("submit.csv", index=False)

ここは、前回とほぼ同じ内容です。
テストデータ Xdash に、学習したthetaと仮説関数hypothesisを適用して生存を予測します。

一部違うところは(pd.DataFrame(data=predictions)など)、thetaの型が前回と違うためです(前回はpandasで生成、今回はnumpyで生成)。
本筋には影響しないので省略します。

Kaggleに提出

!kaggle competitions submit -c titanic -f submit.csv -m ""

スコアは最急降下法の時と同じく、0.77033でした。

おまけ

結果の比較

!diff submit_gd.csv submit_ne.csv

最急降下法の結果 submit_gd.csvと、正規方程式の結果 submit_ne.csv は全く同じ結果となりました。

最急降下法のtheta (feature scalingあり)

0  0.383828
1  0.256756
2 -0.038715
3 -0.060479
4 -0.025892
5  0.097367

最急降下法のtheta (feature scalingなし)

feature scalingなしの場合、thetaが正規方程式のthetaと同じになることを示したかったのですが、目的関数Jが発散してしまい、thetaを求めることができませんでした。

0 -2.194953e+254
1 -9.868859e+253
2 -7.075993e+255
3 -1.536746e+254
4 -1.249770e+254
5 -1.986951e+256

正規方程式のtheta

0  0.259723
1  0.537242
2 -0.002976
3 -0.054798
4 -0.032248
5  0.001960

最急降下法のthetaと値が異なるのは、feature scalingしているためだと思われます。

まとめ

Colaboratory上で線形回帰の正規方程式を実装し、Kaggleのタイタニックコンペを解いてみました。
結果は、最急降下法と同じスコアでした。

次回は、scikit-learnのLinear Regressionを使ってタイタニックコンペに挑戦します。

ご覧下さりありがとうございます。いただいたサポートは図書館への交通費などに使わせていただきます。