線形回帰でタイタニックを試す 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を使ってタイタニックコンペに挑戦します。
ご覧下さりありがとうございます。いただいたサポートは図書館への交通費などに使わせていただきます。