この記事は、2019年6月時点の執筆内容のため技術的に古い内容になります。
先日、機械学習の勉強会に参加してきた。
そこで、Kaggleの存在を知ることになりました。
Kaggleは、世界中のデーターサイエンティスト、AIエンジニアが集まるネットワーク上のコミュニティです。
企業や研究者がデータを投稿し、コンペという形で精度の良い予測モデリングを競わせます。
最近では、日本企業のメルカリがデータを提供して、世界中のデーターサイエンティスト、AIエンジニアに精度の良い予測モデリングを競わせたことで有名です。
Kaggleを始めたらまずはタイタニック問題から
勉強会でKaggleに詳しい人に、最初はどんな問題をやったらいいか聞いてみました。その結果、タイタニックの生き残り予測モデルであることがわかりました。
タイタニックの生き残り予測モデルとは、タイタニックの乗船客データをみて、どんな人が生還しているのかを予測するモデルをつくるものです。すでにコンペの期限は過ぎていて、賞金はゲットできないが、実践的なデータが使えるので実務に近い勉強ができる。
というわけで、タイタニックの問題をやってみたので、ポイント絞って問題を特く考え方を書いていきたいと思います。
コードを書く前の準備
■実装環境
・Python3.6
・jupyter notebook
・以下のライブラリー
numpy、pandas、sklearn、graphviz(問題を解くのに必要ではないが、DecisionTreeRegressorの学習過程を見るのに使う)
Kaggle上でもコードを書くことが可能です。しかし、読み込みが1分以上かかることがあり、ものすごく遅いため、自分のPCに開発環境を入れて実装しています。
■タイタニック問題のコンペの概要
タイタニック問題の概要が書いてあります。
実際の作業内容は、概要の指示に従います。
Titanic: Machine Learning from Disaster
コンペのサイトからデータをダウンロードします
コンペのサイトから3つのデータファイル(csv)をダウンロードします。
■ダウンロードするデータ
train.csv・・・訓練データ
test.csv・・・テストデータ
gender_submission.csv・・・予測のセットを含めます。
実際に書いたソースコード
実際に書いたコードは以下の通りです。
実際に書いたコード
実際に書いたコードです。説明はコード内のコメントに記載しました。
# coding: utf-8
#ライブラリー読み込み
import numpy as np
import pandas as pd
#import sklearn.tree as DecisionTreeRegressor これでは使えない
#機械学習のモデル作成にsklearnのDecisionTreeRegressorを使用する
from sklearn.tree import DecisionTreeRegressor
#訓練データを読み込む
tf_train = pd.read_csv("train.csv")
#テスト用のデータを読み込む
tf_test = pd.read_csv("test.csv")
#正解(予測セット)データを読み込む
tf_gender_submission = pd.read_csv("gender_submission.csv")
#tf_train.head()
tf_train.head()
#欠損値の穴埋めをする(testのときにデータと正解値の行数が一致しなくなるため)
#ロジックは前の値で置き換えるもの
#しかし、テストにつかうデータに対して、欠損値に穴埋めしてよいのかという疑問は残る
tf_train = tf_train.fillna(method="ffill")
tf_test = tf_test.fillna(method="ffill")
#get csv
#Fareは、testデータに欠損があるため
#drop_column =["Name","PassengerId","SibSp","Cabin","Ticket","Embarked"] #0.20055821371610846
#drop_column =["Name","PassengerId","SibSp","Cabin","Ticket","Embarked","Pclass"] #0.21491228070175442
drop_column =["Name","PassengerId","SibSp","Cabin","Ticket","Embarked","Pclass","Age","Parch"] #0.19311944506819512(試した結果)
#drop_column =["Name","PassengerId","SibSp","Cabin","Ticket","Embarked","Pclass","Age","Parch","Fare"] #0.21401855934746247
#不要と思われるカラムを削除する
tf_train.drop(drop_column ,axis=1, inplace=True)
tf_test.drop(drop_column ,axis=1, inplace=True)
genders = {'male': 0, 'female': 1} # 辞書を作成
# Sexをgendersを用いて数値に変換
tf_train['Sex'] = tf_train['Sex'].map(genders)
tf_test['Sex'] = tf_test['Sex'].map(genders)
X_train = tf_train.iloc[:, 1:]
Y_train = tf_train['Survived']
X_train.head()
#モデルを作成する
tree_model = DecisionTreeRegressor() #max depthによって値が変わる
fit = tree_model.fit(X_train, Y_train)
#様子を見るためtreeの図を出力する
from sklearn import tree
import graphviz
dot_data = tree.export_graphviz(fit, out_file=None)
graph = graphviz.Source(dot_data)
graph.render("taitanic")
#テスト用データで予測してみる
predicted_survived = tree_model.predict(tf_test)
print(tf_test.isnull().any())
####################################
#ここからデータの検証に入る
####################################
from sklearn.metrics import mean_absolute_error
#0に近づくほど精度が高いモデルと言える
y = tf_gender_submission.Survived
mean_absolute_error(y, predicted_survived)
#最終的に「0.19311944506819512」という数字が出た(0に行くほど精度が高い。逆に1に近づくほど精度が悪いとも言う)
使用したモデルはDecisionTreeRegressorを使ってみた
DecisionTreeRegressorとは木のように仕分けするロジックです。
DecisionTreeRegressorのロジックは、scikit-learnの公式サイトに以下のように書かれています。
Decision Trees (DTs) are a non-parametric supervised learning method used for classification and regression. The goal is to create a model that predicts the value of a target variable by learning simple decision rules inferred from the data features.
https://scikit-learn.org/stable/modules/tree.html#tree
誤差の割合は
予測セットとモデルから予測した数字の誤差を調べると
「0.19311944506819512」という数字が出た。
0に近づくほど、精度が高いと言えます。
使用するデータ(カラム)の決定。
独断と偏見で、必要と思われるカラムを抽出してライブラリDecisionTreeRegressorにかけたという感じです。カラムを追加したり、削ったりして試行錯誤しました。
最終的な誤差が「0.19311944506819512」という数字になりました。
まとめ
Kaggleは、実際のデータを使って機械学習の習得に役立ちます。
Kaggleには、複数のデータからパターンを見つけるなど難しいものもたくさんありますが、挑戦してみる価値はあるかと思います。
タイタニック問題の解き方がわかってきたら、いろいろな問題に挑戦してみましょう。
\IT未経験者からのサポートあり!転職サービス3選!!/
サービス名 | |||
---|---|---|---|
未経験 | 未経験OK | 未経験の転職専用 | 経験者向け |
公開の求人数 | ITエンジニア全体で1万件以上 ITエンジニア未経験で600件以上 |
未公開 | 5,000件以上 |
利用対象 | 全職種 | IT特化 | IT特化 |
特徴 | ✓誰もが知る転職サービス ✓経歴を登録しておくとオファーが来る |
✓企業担当者と条件交渉 ✓スキルの身につく企業を紹介 |
✓IT専門のエージェントが対応 ✓転職成功すると年収200万円以上の大幅アップがある |
転職サポート内容 |
|
|
|
公式サイト | リクナビネクスト | テックゲート | レバテックキャリア |