Kaggleチュートリアル

Table of Contents
機械学習の勉強のため、Kaggleのチュートリアルを試してみました。
1 Kaggleとは
Kaggleはデータ分析のCompetitionサイトで、企業や研究者が投稿したテーマを様々なデータ分析手法を駆使して、予測モデルの精度を競う場所になります。
trainデータとtestデータがサイト上から渡され、trainデータをもとにモデリングし、testデータで予測し投稿する、という手順になります。
Kaggleには初心者用のチュートリアルも用意されています。
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)