#はじめてのKaggle ~Titanic編~
社会人1年目・コミュニティAIRS-Labに参加していますyappiです!
コミュニティ「自由研究室 AIRS-Lab」のAdvent Calendar、3日目を担当します。
普段は仕事でSalesforce、趣味でSwift、Flutterなどを触ってます!
今回AIRS-Labに参加したことをきっかけにpythonを学習し始めました!
そのアウトプットをする機会としてkaggleに参加しました!
##はじめに
さぁ分析してみよう!ってスタートできるわけがありませんでした...笑
trainデータ?testデータ?って何?という状態からの参加。
実行環境は初心者の味方!google colaboratoryで実践してみました!!
右も左もわからない状態から、とりあえずKaggle初心者の登竜門Titanicを!(見たことありませんが...)
まずはじめにやったことは資料集めからですね...。
##kaggle初心者の第一歩
もともとそんなにpython自体触ったことがなかったので...。
pythonの文法を調べたり、分析手法を調べたり、回帰とは?分類とは?何ぞやって感じで、
初歩的なことから調査していきました。
調査をしていく中で、たどり着いた最初の一歩がデータの加工でした!(調査した内容の9割ぐらい関係ないです...笑)
とりあえずデータに触れてみないとイメージ湧かない!加工の仕方わからない!
よし!データの加工をしてみよう!
おっと。csvファイルってどうやっていれるんだっけ?...。...。...。
colabのファイルに直接入れよう...。そう思って毎回立ち上げる度に直接入れてました。
そこで、AIRS-Labのビギナーズ勉強会!ありがたいことにドライブ上のファイルを参照することを教えていただきました!(前にもやったことがあるような...ないような...)
from google.colab import drive
drive.mount('/content/drive')
%cd'ドライブのフォルダ指定'
import pandas as pd
train = pd.read_csv('titanic/train.csv')
ってな感じで、何も分析が始まらずデータを表示するだけで1週間が経ってしまいました...。
##データの加工
さぁ。やっとデータを扱えます。笑
ここからは、先輩方皆様のブログや資料を拝見させていただきまして、なんとなーくやってることが分かってきまして...文字列を数値へ変換して...欠損値を設定して...
# 欠損値処理
train['Fare'] = train['Fare'].fillna(train['Fare'].median())
train['Age'] = train['Age'].fillna(train['Age'].median())
train['Embarked'] = train['Embarked'].fillna('S')
# カテゴリ変数の変換
train['Sex'] = train['Sex'].apply(lambda x: 1 if x == 'male' else 0)
train['Embarked'] = train['Embarked'].map({'S':0, 'C':1, 'Q':2}).astype(int)
train = train.drop(['Cabin', 'Name', 'PassengerId', 'Ticket'], axis = 1)
print(train)
train_X = train.drop('Survived', axis = 1)
print(train_X)
train_y = train.Survived
print(train_y)
(train_X, test_X, train_y, test_y) = train_test_split(train_X, train_y, test_size = 0.3, random_state = 666)
やっとのことでデータの加工ができました。w
さぁここからが問題です...。いや、ここまでも問題だらけでしたが...。
##分析
まず。分析手法って何があるんだっけ?笑
回帰とか分類は聞いたことあるけど、具体的にどういった手法があるだろ...そこからまた調査を...。
しかし、自分で選定できず...そういや勉強会で決定木分析とかランダムフォレストとか会話に出てたなぁ。それやってみよ。ぐらいのノリでやってみました!!
今回はこちらを参考にさせていただきました。データの加工もこちらを参考にしてます!
【Pythonで決定木 & Random Forest】タイタニックの生存者データを分析してみた
なんとなーくでやってみたので正しい使い方ができているのかわかりませんが...。
決定木分析
#決定木
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import (roc_curve, auc, accuracy_score)
clf = DecisionTreeClassifier(random_state=0)
clf = clf.fit(train_X, train_y)
pred = clf.predict(test_X)
pred = clf.predict(test_X)
fpr, tpr, thresholds = roc_curve(test_y, pred, pos_label=1)
auc(fpr, tpr)
accuracy_score(pred, test_y)
#結果は0.7947761194029851でした
ランダムフォレスト
#ランダムフォレスト
from sklearn.ensemble import RandomForestClassifier
clf = RandomForestClassifier(random_state = 0)
clf = clf.fit(train_X, train_y)
pred = clf.predict(test_X)
fpr, tpr, thresholds = roc_curve(test_y, pred, pos_label=1)
auc(fpr, tpr)
accuracy_score(pred, test_y)
#結果は0.8208955223880597でした
pythonのライブラリって豊富で便利ですね。笑
分析も先輩方の知識を参考に実践してみましたが、データ加工したらライブラリに突っ込んでみたいな感じで進めていったらあれ。もう終わり?って感じで呆気ない!って感じでした。笑
有識者の方はもっと深いと思われると思いますが...。ご容赦ください。笑
K近傍法
# 項目の型を調べる
train.dtypes
# 数値のみを変数へ
X = train[['Pclass', 'SibSp', 'Parch']]
y = train[['Survived']]
# sklearnを使用
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
# K近傍法ライブラリ
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier()
knn.fit(X_train, y_train)
knn.score(X_test, y_test)
# 結果は0.6502242152466368でした
一度、勉強会の触りの部分でK近傍法を使った分析をやってみましたが、それもライブラリを使って呆気なく終わってしまいました。笑
それほど便利ってことですよね!そしてもっと深く掘っていけば自由に扱えるようになるのかな...と。
##さいごに
ここ1カ月学習してきて、ひょっとして、データと分析手法をいかに選定できるかがみそなの?って今更ながら...感じました。(1カ月何やってんだって感じですww)
三つの手法を使ってみましたけど、これも今更ながら、分析手法でパーセンテージが変わるってすごいなぁって純粋に感じましたね。
データの着目点や取るべき手法がちょっと違うだけで、こんなにも変わるのかぁ...。
そんなこんなでKaggleを通して、pythonにより興味を持つことができました!
AIRS-Labの我妻さん、運営の方に感謝です!!
Titanicの演習においては、今後データの着目点を変えてみたり、分析手法を変えて実践してみようと思います!
##参考文献
Titanic - Machine Learning from Disaster
【Pythonで決定木 & Random Forest】タイタニックの生存者データを分析してみた
KaggleのTitanicデータに対してsklearnの決定木を試してみる
【Kaggle初心者入門編】タイタニック号で生き残るのは誰?
scikit-learnでデータを訓練用とテスト用に分割するtrain_test_split