Kagglerへの道#1 Titanic: Machine Learning from Disaster」(タイタニック:災害からの機械学習)

皆さん、おはこんばんにちは! SIer出身のエンジニア、みやもとです。
今回はkaggleのチュートリアルとして有名な「Titanic: Machine Learning from Disaster」(タイタニック:災害からの機械学習)をやってみようと思います。

タイタニック問題とはタイタニック号に乗船した客の生存率を予測してどの乗客が生存したのかを求めるものになっており、Kaggleが初心者向けとして出題している問題です。

1.kaggleとは

まず呼び方ですが、Kaggleと書いて「カグル」と読みます。日本でも最近は定着してきましたが、Kaggleに参加している方を「カグラー(Kaggler)」とも呼びます。
Kaggleですが、本サイトへ行くと一番上に書かれていますが「The Home of Data Science & Machine Learning」(データサイエンスと機械学習の家)と題されている通り、世界中の機械学習・データサイエンスに携わっている約40万人の方が集まるコミニティーです。
Kaggleでは、企業や政府などの組織とデータ分析のプロであるデータサイエンティスト/機械学習エンジニアを繋げるプラットフォームとなっています。単純なマッチングではなく、Kaggleの最大の目玉とも言える「Competetion(コンペ)」がKaggleの特徴の一つです。
Competition(コンペ)は、企業や政府がコンペ形式(競争形式)で課題を提示し、賞金と引き換えに最も制度の高い分析モデルを買い取るという、最近でいう一種のクラウドファンディングに近いような仕組みとなります。

Kaggleとは?機械学習初心者が知っておくべき3つの使い方 より引用

2.事前準備

データセットの確認

まず、データセットにどのような項目があるか確認していきます。
下記のようにpandasというデータ解析を支援する機能を提供するライブラリを使って項目名とデータセットの中身を見ることができます。

import pandas as pd

train = pd.read_csv("/ディレクトリパス/train.csv")

train.head()

  • PassengerId:乗客の一意のID
  • Survived:生存(1)または死亡(0)
  • Pclass:乗客のクラス(1番目、2番目、または3番目)
  • Name:乗客の名前
  • Sex:乗客の性別
  • Age:乗客の年齢
  • SibSp:タイタニック号に乗る兄弟/配偶者の数
  • Parch:タイタニック号に乗る親/子の数
  • Ticket:チケット番号
  • Fare:チケットの運賃
  • Cabin:キャビン番号
  • Embarked:乗客が船に乗った場所(C-シェルブール、S-サザンプトン、Q =クイーンズタウン)
import pandas as pd

test = pd.read_csv("/ディレクトリパス/test.csv")

test.head()

  • PassengerId:乗客の一意のID
  • Pclass:乗客のクラス(1番目、2番目、または3番目)
  • Name:乗客の名前
  • Sex:乗客の性別
  • Age:乗客の年齢
  • SibSp:タイタニック号に乗る兄弟/配偶者の数
  • Parch:タイタニック号に乗る親/子の数
  • Ticket:チケット番号
  • Fare:チケットの運賃
  • Cabin:キャビン番号
  • Embarked:乗客が船に乗った場所(C-シェルブール、S-サザンプトン、Q =クイーンズタウン)

欠損値の確認

次に欠損値の確認を行います。
欠損値とは、項目にNaNと入っている値で下記を見るとAge(年齢)、Cabin(キャビン番号)、Embarked(乗客が乗った場所)のデータに欠損値があることが確認できます。

train.info()
print('_'*40)
test.info()

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 12 columns):
PassengerId    891 non-null int64
Survived       891 non-null int64
Pclass         891 non-null int64
Name           891 non-null object
Sex            891 non-null object
Age            714 non-null float64
SibSp          891 non-null int64
Parch          891 non-null int64
Ticket         891 non-null object
Fare           891 non-null float64
Cabin          204 non-null object
Embarked       889 non-null object
dtypes: float64(2), int64(5), object(5)
memory usage: 83.7+ KB
________________________________________

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 418 entries, 0 to 417
Data columns (total 11 columns):
PassengerId    418 non-null int64
Pclass         418 non-null int64
Name           418 non-null object
Sex            418 non-null object
Age            332 non-null float64
SibSp          418 non-null int64
Parch          418 non-null int64
Ticket         418 non-null object
Fare           417 non-null float64
Cabin          91 non-null object
Embarked       418 non-null object
dtypes: float64(2), int64(4), object(5)
memory usage: 36.0+ KB

欠損値の補完とデータの変換

欠損値の補完とデータの変換を行なっていきます。欠損値の補完には平均値や最頻値などを入れて欠損値を補填します。次にデータを処理しやすいように下記のように変換して行きます。今回は、Cabin(キャビン番号)は予測で使用しないので欠損値の補完は行いません。

# 欠損値の補完
train["Age"] = train["Age"].fillna(train["Age"].median())
train["Embarked"] = train["Embarked"].fillna("S")

# データの変換
train["Sex"][train["Sex"] == "male"] = 0
train["Sex"][train["Sex"] == "female"] = 1
train["Embarked"][train["Embarked"] == "S" ] = 0
train["Embarked"][train["Embarked"] == "C" ] = 1
train["Embarked"][train["Embarked"] == "Q"] = 2
 
train.head(10)

# 欠損値の補完
test["Age"] = test["Age"].fillna(test["Age"].median())
test.Fare[152] = test.Fare.median()

# データの変換
test["Sex"][test["Sex"] == "male"] = 0
test["Sex"][test["Sex"] == "female"] = 1
test["Embarked"][test["Embarked"] == "S"] = 0
test["Embarked"][test["Embarked"] == "C"] = 1
test["Embarked"][test["Embarked"] == "Q"] = 2
 
test.head(10)

3.実行

予測の実行

今回は、参考にさせて頂いたサイトで予測モデルに決定木を使用していたのでそのまま決定木で予測します。予測に使用するのはPclass(チケットクラス)、Sex(性別)、Age(年齢)、Fare(料金)を使用します。

from sklearn import tree

target = train["Survived"].values
features_one = train[["Pclass", "Sex", "Age", "Fare"]].values
 
# 決定木の作成
my_tree_one = tree.DecisionTreeClassifier()
my_tree_one = my_tree_one.fit(features_one, target)
 
# 「test」の説明変数の値を取得
test_features = test[["Pclass", "Sex", "Age", "Fare"]].values
 
# 「test」の説明変数を使って「my_tree_one」のモデルで予測
my_prediction = my_tree_one.predict(test_features)
 

Kaggleにアップロード

予測したデータはCSVデータとして書き出し、Kaggle上にアップロードします。

# PassengerIdを取得
PassengerId = np.array(test["PassengerId"]).astype(int)
 
# my_prediction(予測データ)とPassengerIdをデータフレームへ落とし込む
my_solution = pd.DataFrame(my_prediction, PassengerId, columns = ["Survived"])
 
# my_tree_one.csvとして書き出し
my_solution.to_csv("my_tree_one.csv", index_label = ["PassengerId"])

4.まとめ

今回は、始めての機械学習だったのでサイトを参考にさせていただきました。機械学習では、データの補完やどの項目を予測モデルで使用するかが最も重要になってくるようで、Kaggleではカーネルと呼ばれる他の参加者がどのようなデータの補完を行ったのかやどの項目を使用したかがわかるようになっています。今後はそのカーネルを見て機械学習を勉強して行きたいと思います。

参考

【Kaggle初心者入門編】タイタニック号で生き残るのは誰?

関連記事

プロジェクトストーリー

技術

コメント

この記事へのコメントはありません。

カテゴリー

TOP
TOP