
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(コンペ)は、企業や政府がコンペ形式(競争形式)で課題を提示し、賞金と引き換えに最も制度の高い分析モデルを買い取るという、最近でいう一種のクラウドファンディングに近いような仕組みとなります。
2. 事前準備
データセットの確認
まず、データセットにどのような項目があるか確認していきます。
下記のようにpandasというデータ解析を支援する機能を提供するライブラリを使って項目名とデータセットの中身を見ることができます。
<span class="token keyword">import</span> pandas <span class="token keyword">as</span> pd
train <span class="token operator">=</span> pd<span class="token punctuation">.</span>read_csv<span class="token punctuation">(</span><span class="token string">"/ディレクトリパス/train.csv"</span><span class="token punctuation">)</span>
train<span class="token punctuation">.</span>head<span class="token punctuation">(</span><span class="token punctuation">)</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span></span>

- PassengerId:乗客の一意のID
- Survived:生存(1)または死亡(0)
- Pclass:乗客のクラス(1番目、2番目、または3番目)
- Name:乗客の名前
- Sex:乗客の性別
- Age:乗客の年齢
- SibSp:タイタニック号に乗る兄弟/配偶者の数
- Parch:タイタニック号に乗る親/子の数
- Ticket:チケット番号
- Fare:チケットの運賃
- Cabin:キャビン番号
- Embarked:乗客が船に乗った場所(C-シェルブール、S-サザンプトン、Q =クイーンズタウン)
<span class="token keyword">import</span> pandas <span class="token keyword">as</span> pd
test <span class="token operator">=</span> pd<span class="token punctuation">.</span>read_csv<span class="token punctuation">(</span><span class="token string">"/ディレクトリパス/test.csv"</span><span class="token punctuation">)</span>
test<span class="token punctuation">.</span>head<span class="token punctuation">(</span><span class="token punctuation">)</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span></span>

- PassengerId:乗客の一意のID
- Pclass:乗客のクラス(1番目、2番目、または3番目)
- Name:乗客の名前
- Sex:乗客の性別
- Age:乗客の年齢
- SibSp:タイタニック号に乗る兄弟/配偶者の数
- Parch:タイタニック号に乗る親/子の数
- Ticket:チケット番号
- Fare:チケットの運賃
- Cabin:キャビン番号
- Embarked:乗客が船に乗った場所(C-シェルブール、S-サザンプトン、Q =クイーンズタウン)
欠損値の確認
次に欠損値の確認を行います。
欠損値とは、項目にNaNと入っている値で下記を見るとAge(年齢)、Cabin(キャビン番号)、Embarked(乗客が乗った場所)のデータに欠損値があることが確認できます。
train<span class="token punctuation">.</span>info<span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">'_'</span><span class="token operator">*</span><span class="token number">40</span><span class="token punctuation">)</span>
test<span class="token punctuation">.</span>info<span class="token punctuation">(</span><span class="token punctuation">)</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span></span>
<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(キャビン番号)は予測で使用しないので欠損値の補完は行いません。
<span class="token comment"># 欠損値の補完</span>
train<span class="token punctuation">[</span><span class="token string">"Age"</span><span class="token punctuation">]</span> <span class="token operator">=</span> train<span class="token punctuation">[</span><span class="token string">"Age"</span><span class="token punctuation">]</span><span class="token punctuation">.</span>fillna<span class="token punctuation">(</span>train<span class="token punctuation">[</span><span class="token string">"Age"</span><span class="token punctuation">]</span><span class="token punctuation">.</span>median<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
train<span class="token punctuation">[</span><span class="token string">"Embarked"</span><span class="token punctuation">]</span> <span class="token operator">=</span> train<span class="token punctuation">[</span><span class="token string">"Embarked"</span><span class="token punctuation">]</span><span class="token punctuation">.</span>fillna<span class="token punctuation">(</span><span class="token string">"S"</span><span class="token punctuation">)</span>
<span class="token comment"># データの変換</span>
train<span class="token punctuation">[</span><span class="token string">"Sex"</span><span class="token punctuation">]</span><span class="token punctuation">[</span>train<span class="token punctuation">[</span><span class="token string">"Sex"</span><span class="token punctuation">]</span> <span class="token operator">==</span> <span class="token string">"male"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">0</span>
train<span class="token punctuation">[</span><span class="token string">"Sex"</span><span class="token punctuation">]</span><span class="token punctuation">[</span>train<span class="token punctuation">[</span><span class="token string">"Sex"</span><span class="token punctuation">]</span> <span class="token operator">==</span> <span class="token string">"female"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">1</span>
train<span class="token punctuation">[</span><span class="token string">"Embarked"</span><span class="token punctuation">]</span><span class="token punctuation">[</span>train<span class="token punctuation">[</span><span class="token string">"Embarked"</span><span class="token punctuation">]</span> <span class="token operator">==</span> <span class="token string">"S"</span> <span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">0</span>
train<span class="token punctuation">[</span><span class="token string">"Embarked"</span><span class="token punctuation">]</span><span class="token punctuation">[</span>train<span class="token punctuation">[</span><span class="token string">"Embarked"</span><span class="token punctuation">]</span> <span class="token operator">==</span> <span class="token string">"C"</span> <span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">1</span>
train<span class="token punctuation">[</span><span class="token string">"Embarked"</span><span class="token punctuation">]</span><span class="token punctuation">[</span>train<span class="token punctuation">[</span><span class="token string">"Embarked"</span><span class="token punctuation">]</span> <span class="token operator">==</span> <span class="token string">"Q"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">2</span>
train<span class="token punctuation">.</span>head<span class="token punctuation">(</span><span class="token number">10</span><span class="token punctuation">)</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span>

<span class="token comment"># 欠損値の補完</span>
test<span class="token punctuation">[</span><span class="token string">"Age"</span><span class="token punctuation">]</span> <span class="token operator">=</span> test<span class="token punctuation">[</span><span class="token string">"Age"</span><span class="token punctuation">]</span><span class="token punctuation">.</span>fillna<span class="token punctuation">(</span>test<span class="token punctuation">[</span><span class="token string">"Age"</span><span class="token punctuation">]</span><span class="token punctuation">.</span>median<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
test<span class="token punctuation">.</span>Fare<span class="token punctuation">[</span><span class="token number">152</span><span class="token punctuation">]</span> <span class="token operator">=</span> test<span class="token punctuation">.</span>Fare<span class="token punctuation">.</span>median<span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token comment"># データの変換</span>
test<span class="token punctuation">[</span><span class="token string">"Sex"</span><span class="token punctuation">]</span><span class="token punctuation">[</span>test<span class="token punctuation">[</span><span class="token string">"Sex"</span><span class="token punctuation">]</span> <span class="token operator">==</span> <span class="token string">"male"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">0</span>
test<span class="token punctuation">[</span><span class="token string">"Sex"</span><span class="token punctuation">]</span><span class="token punctuation">[</span>test<span class="token punctuation">[</span><span class="token string">"Sex"</span><span class="token punctuation">]</span> <span class="token operator">==</span> <span class="token string">"female"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">1</span>
test<span class="token punctuation">[</span><span class="token string">"Embarked"</span><span class="token punctuation">]</span><span class="token punctuation">[</span>test<span class="token punctuation">[</span><span class="token string">"Embarked"</span><span class="token punctuation">]</span> <span class="token operator">==</span> <span class="token string">"S"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">0</span>
test<span class="token punctuation">[</span><span class="token string">"Embarked"</span><span class="token punctuation">]</span><span class="token punctuation">[</span>test<span class="token punctuation">[</span><span class="token string">"Embarked"</span><span class="token punctuation">]</span> <span class="token operator">==</span> <span class="token string">"C"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">1</span>
test<span class="token punctuation">[</span><span class="token string">"Embarked"</span><span class="token punctuation">]</span><span class="token punctuation">[</span>test<span class="token punctuation">[</span><span class="token string">"Embarked"</span><span class="token punctuation">]</span> <span class="token operator">==</span> <span class="token string">"Q"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">2</span>
test<span class="token punctuation">.</span>head<span class="token punctuation">(</span><span class="token number">10</span><span class="token punctuation">)</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span>

3. 実行
予測の実行
今回は、参考にさせて頂いたサイトで予測モデルに決定木を使用していたのでそのまま決定木で予測します。予測に使用するのはPclass(チケットクラス)、Sex(性別)、Age(年齢)、Fare(料金)を使用します。
<span class="token keyword">from</span> sklearn <span class="token keyword">import</span> tree
target <span class="token operator">=</span> train<span class="token punctuation">[</span><span class="token string">"Survived"</span><span class="token punctuation">]</span><span class="token punctuation">.</span>values
features_one <span class="token operator">=</span> train<span class="token punctuation">[</span><span class="token punctuation">[</span><span class="token string">"Pclass"</span><span class="token punctuation">,</span> <span class="token string">"Sex"</span><span class="token punctuation">,</span> <span class="token string">"Age"</span><span class="token punctuation">,</span> <span class="token string">"Fare"</span><span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">.</span>values
<span class="token comment"># 決定木の作成</span>
my_tree_one <span class="token operator">=</span> tree<span class="token punctuation">.</span>DecisionTreeClassifier<span class="token punctuation">(</span><span class="token punctuation">)</span>
my_tree_one <span class="token operator">=</span> my_tree_one<span class="token punctuation">.</span>fit<span class="token punctuation">(</span>features_one<span class="token punctuation">,</span> target<span class="token punctuation">)</span>
<span class="token comment"># 「test」の説明変数の値を取得</span>
test_features <span class="token operator">=</span> test<span class="token punctuation">[</span><span class="token punctuation">[</span><span class="token string">"Pclass"</span><span class="token punctuation">,</span> <span class="token string">"Sex"</span><span class="token punctuation">,</span> <span class="token string">"Age"</span><span class="token punctuation">,</span> <span class="token string">"Fare"</span><span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">.</span>values
<span class="token comment"># 「test」の説明変数を使って「my_tree_one」のモデルで予測</span>
my_prediction <span class="token operator">=</span> my_tree_one<span class="token punctuation">.</span>predict<span class="token punctuation">(</span>test_features<span class="token punctuation">)</span>
<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span>
Kaggleにアップロード
予測したデータはCSVデータとして書き出し、Kaggle上にアップロードします。
<span class="token comment"># PassengerIdを取得</span>
PassengerId <span class="token operator">=</span> np<span class="token punctuation">.</span>array<span class="token punctuation">(</span>test<span class="token punctuation">[</span><span class="token string">"PassengerId"</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">.</span>astype<span class="token punctuation">(</span><span class="token builtin">int</span><span class="token punctuation">)</span>
<span class="token comment"># my_prediction(予測データ)とPassengerIdをデータフレームへ落とし込む</span>
my_solution <span class="token operator">=</span> pd<span class="token punctuation">.</span>DataFrame<span class="token punctuation">(</span>my_prediction<span class="token punctuation">,</span> PassengerId<span class="token punctuation">,</span> columns <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token string">"Survived"</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
<span class="token comment"># my_tree_one.csvとして書き出し</span>
my_solution<span class="token punctuation">.</span>to_csv<span class="token punctuation">(</span><span class="token string">"my_tree_one.csv"</span><span class="token punctuation">,</span> index_label <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token string">"PassengerId"</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span>

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