0. はじめに
- 前提:大した記事でもないのに分けてしまいましたが、モデリング編の続きです。
- 主旨:テストデータを使って予測し、モデルの検証までのプロセスを紹介します。数学的な細かいところなどはすっ飛ばします。(Kaggle上で検証することが大前提)
- 環境:Kaggle Kernel Notebook
4. 予測する
前回の記事で作成したモデルで、テストデータを使って生存したかどうかを予測します。
4.1. テストデータ準備
まずは、テストデータを準備します。
実際のデータ解析時には、元のデータから訓練データとテストデータを分ける必要がありますが、
Kaggleでは分けてくれているので、Competitionページからテストデータ(test.csv)をダウンロードします。
test_csv = pd.read_csv('../input/titanic/test.csv', sep=',')
test_csv.head()
念のため、テストデータの概要も確認しておきます。
# 次元の確認
test_csv.shape
# 出力結果
(418, 11)
# 欠損データ数の確認
test_csv.isnull().sum()
# 出力結果
PassengerId 0
Pclass 0
Name 0
Sex 0
Age 86
SibSp 0
Parch 0
Ticket 0
Fare 1
Cabin 327
Embarked 0
dtype: int64
訓練データではFareの欠損値はありませんでしが、テストデータでは1件だけあるようです。
モデリング時のAgeと同様に、欠損値は平均値で埋めることにします。
テストデータに対しても、訓練データ同様にデータ整形をしていきます。
# 不要な列を取り除く
test = test_csv.drop(['Name', 'SibSp', 'Ticket', 'Cabin'] , axis=1)
# 女性ダミーを作る
test['Female'] = test['Sex'].map(lambda x: 0 if x == 'male' else 1 ).astype(int)
# Parchが0とそれ以上でダミーを作る
test['Parch_d'] = test['Parch'].map(lambda x: 0 if x == 0 else 1).astype(int)
# EmbarkedがSとそれ以外でダミーを作る
test['Embarked_S'] = test['Embarked'].map(lambda x: 1 if x == 'S' else 0).astype(int)
# Ageの欠損値を埋める
test['Age'].fillna(test['Age'].mean(), inplace=True)
# Fareの欠損値を埋める
test['Fare'].fillna(test['Fare'].mean(), inplace=True)
4.2. 予測する
それでは、前回作成したモデルを使って予測していきましょう。
# 予測する
predict = model.predict(test_x)
predict[:10]
# 出力結果
array([0, 0, 0, 0, 1, 0, 1, 0, 1, 0])
出力はNumpy配列のarrayで返ってくることに注意してください。
5. 評価
5.1. 予測結果データの提出
それでは、作成したモデルがどのくらいいいのかを検証していきたいと思います。
Kaggle上では、予測した結果を提出するとScoreが返ってきて、その値によって評価します。
そのため、提出用のデータを作成します。
submit_csv = pd.concat([test['PassengerId'], pd.Series(predict)], axis=1)
submit_csv.columns = ['PassengerId', 'Survived']
submit_csv.to_csv('./submition.csv', index=False)
こんな感じのデータを作って、Competitionのページから提出します。
結果は、こんな感じでした。
5.2. 予測結果の評価
Kaggleでは正解データを入手できなかったので、正解データがあった場合の評価としてAccuracyを紹介します。
Accuracyは予測結果がどのくらい実際のデータと合っていたのかを示します。
Accuracy = (正しく予測できたサンプル数)/(全体のサンプル数)
として計算されます。
このうち、正しく予測できたサンプル数とは、1のサンプルは1、0のサンプルは0と予測できたものです。
仮に、先ほどのsubmit_csvに'Survived_test'
という実際に生存したかどうかのデータが入っているとします。
pd.crosstab(submit_csv['Survived'], submit_csv['Survived_test'])
# 出力結果(想定)
Survived_test 0 1
Survived
0 a b
1 c d
上記のような出力結果になるはずですので、
Accuracy = a + d / (a + b + c + d)
で求められます。
モデルの評価指標は他にもあって、モデルの用途などによって使い分けていきます。
6. 終わりに
- 途中でミスってEmbarked_Sを抜きでモデリング・評価していたのですが、そちらの方が結果は良かったです
- 今回はお試しなので直感的にではありますが、仮説を持ってモデリングしていきました
- 次回はロジスティック回帰の解説をしたいと思います