Kaggleチュートリアル

Table of Contents

機械学習の勉強のため、Kaggleのチュートリアルを試してみました。

 

1 Kaggleとは

Kaggleはデータ分析のCompetitionサイトで、企業や研究者が投稿したテーマを様々なデータ分析手法を駆使して、予測モデルの精度を競う場所になります。
trainデータとtestデータがサイト上から渡され、trainデータをもとにモデリングし、testデータで予測し投稿する、という手順になります。
Kaggleには初心者用のチュートリアルも用意されています。

2 Titanicチュートリアル

今回試したチュートリアルは、有名なタイタニック号沈没事故を題材にしたもので、
乗客の年齢、性別、社会階級、などのデータから生死を予測することが課題となります。
データ・セットは以下の通り。 

PassengerID 乗客ID
survival 生死(0 = No; 1 = Yes)
pclass 乗客の社会階級
name Name
sex 性別
age 年齢
sibsp 乗船している夫婦、兄弟姉妹の数
parch 乗船している親、子供の数
ticket チケットNo
fare 乗船料金
cabin 船室
embarked 乗船場所

survivalは、trainデータのみに存在。上記データからtestデータのsurvivalを予測する。

 

3 環境

言語: Python3.6.2(anaconda)

  • anacondaはpythonのデータ分析系のライブラリがセットとなっているパッケージ

環境: jupyter notebook

  • プログラムの記述、実行、可視化、メモ、が一元管理できる環境。

Pyhonパッケージ:

import pandas as pd
import numpy as np
from pandas import DataFrame
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
import csv

 

4 データ読み込み

train.csv、test.csvはKaggleサイトからダウンロードし、適当な場所に保存する。

# 訓練データの読み込み
df_train = pd.read_csv('~/Devel/Kaggle/Titanic/train.csv')
# テストデータの読み込み
df_test = pd.read_csv('~/Devel/Kaggle/Titanic/test.csv')

 

5 欠損データの補完

年齢データに欠損が存在するため、適当な値で補完する。
今回は性別毎の平均値で補完。

# 訓練データの欠損を補完
age_mean_train = df_train.groupby('Sex').Age.mean()
df_train.Age.fillna(df_train[df_train.Age.isnull()].apply(lambda x: age_mean_train[x.Sex],axis=1), inplace=True)
# テストデータの欠損を補完
age_mean_test = df_test.groupby('Sex').Age.mean()
df_test.Age.fillna(df_test[df_test.Age.isnull()].apply(lambda x: age_mean_test[x.Sex],axis=1),inplace=True)

※データ欠損は以下で確認出来る。
※年齢以外にも欠損データは存在するが、今回は分析に使用しない

df_train.isnull().sum()

 

6 ダミー変数化

数値でないデータが含まれているため、扱いやすいように数値データに置き換える。

df_train['Female'] = df_train['Sex'].map( {'male': 0, 'female': 1} ).astype(int)
df_test['Female'] = df_test['Sex'].map( {'male': 0, 'female': 1} ).astype(int)
pclass_df_train  = pd.get_dummies(df_train['Pclass'],prefix='Class')
pclass_df_test  = pd.get_dummies(df_test['Pclass'],prefix='Class')
df_train = df_train.join(pclass_df_train)
df_test = df_test.join(pclass_df_test)

 

7 モデル生成と学習

2値分類モデルの一つであるロジスティック回帰を適用。

# 今回使用しないデータはドロップ
X = df_train.drop(['PassengerId','Survived','Pclass','Name','Sex','SibSp','Parch','Ticket','Fare','Cabin','Embarked'],axis=1)
# 期待値
y = df_train.Survived
# モデルの生成
clf = LogisticRegression()
# 学習実行
clf.fit(X, y)

 

8 予測

テストデータを生成したモデルで予測する。

df_test_in = df_test.drop(['PassengerId','Pclass','Name','Sex','SibSp','Parch','Ticket','Fare','Cabin','Embarked'],axis=1)
test_predict = clf.predict(df_test_in)

 

9 結果をファイル出力

KaggleへSubmitするために、結果をファイル出力する。

with open("predict_result_data.csv", "w") as f:
    writer = csv.writer(f, lineterminator='\n')
    writer.writerow(["PassengerId", "Survived"])
    for pid, survived in zip(df_test['PassengerId'], test_predict):
        writer.writerow([pid, survived])

 

KaggleにSubmitしたところ、予測精度は75.598%でした。(8136位/9650)

Author: xxx

Created: 2017-12-11 Mon 01:47

Emacs 25.3.1 (Org mode 8.2.10)

Validate

\ 最新情報をチェック /