初めまして。データアナリティクスチームのハガーです。
データ分析のコンペティションサイトであるKaggleに初めて投稿してみましたので、その感想などを書きたいと思います。
Kaggleとは予測モデルのコンペティションを行う場を提供している運営会社となります。
Kaggle Top : https://www.kaggle.com
Kaggleでのコンペティションの流れは以下のようになっています。
①予測モデルが必要な企業等が問題とデータを投稿
②分析者が競い合い、より精度の高い「予測」モデルを作成し投稿
③精度が高い予測モデルについては、企業等に予測モデル提供する代わりに、賞金などを得る
賞金などはコンペティションの種類にもよりますが、$1,000,000のものもありました!
まずはチュートリアルで用意されている「Titanic: Machine Learning from Disaster」に投稿してみます。
※予測モデルとは、既知のデータから得られる関連性を利用して、新しいデータや別のデータではどのようになるのかを予測するするために使われるモデルのこと。
タイタニック号沈没事故はご存知かと思いますが、本問題ではタイタニック号の乗船客が生存したかどうかのデータの一部が与えられ、そのデータを元に残りの乗客が生存したかどうかを予測するというものになります。
与えられるデータは以下になります。
乗船客が生存したか死亡したか判明しているデータ(学習データ):891人分
乗船客が生存したか死亡したか不明なデータ(テストデータ):417人分
891人分の学習データを元に、417人分のテストデータの人間が生存したか死亡したかを予測することになります。
1人分のデータの構成は以下となります。(テストデータには、survivalの値なし)
値 | 説明 |
survival | Survival (0 = No; 1 = Yes) ⇒ 1が生存、0が死亡 |
pclass | Passenger Class (1 = 1st; 2 = 2nd; 3 = 3rd) ⇒ 階級(1がファーストクラス) |
name | Name ⇒ 名前 |
sex | Sex ⇒ 性別 |
age | Age ⇒ 年齢 |
sibsp | Number of Siblings/Spouses Aboard ⇒ 一緒に乗船した兄弟、配偶者の数 |
parch | Number of Parents/Children Aboard ⇒ 一緒に乗船した親子の数 |
ticket | Ticket Number ⇒ チケット番号 |
fare | Passenger Fare ⇒ 乗船料 |
cabin | Cabin ⇒ 部屋番号 |
embarked | Port of Embarkation (C = Cherbourg; Q = Queenstown; S = Southampton) ⇒ 乗船港 |
※欠損データが多くそのままでは使用できない値もあり、平均値で埋めるなどして使用します(データクレンジング)。
環境としてPythonの機械学習ライブラリである「scikit-learn」ライブラリを使用します。
予測モデル作成の手法ですが、今回の問題はデータ分析の世界では「Classification Problem(分類問題)」と呼ばれているもので、その中最も単純な2クラス問題に該当します。分類手法はいろいろありますが、昔から使われている方法としては「ロジスティック回帰」があります。
「scikit-learn」ライブラリのマニュアルを確認すると、Classification Problemを解くのに好ましい手法が書かれています。
http://scikit-learn.org/dev/tutorial/machine_learning_map/index.html
まずはあまり気にせず、以下の手法をほぼデフォルトのまま使用して予測モデルを作成し、Kaggleに投稿してみました。
1.ロジスティック回帰
2.線形SVM
3.k近傍法
4.SVM(Gaussianカーネル)
5.ランダムフォレスト
結果は1分もかからずに表示されました。
一番精度が良かったもの:線形SVM
精度:0.76555(約76.7%)
順位:4746/6057位 (上位約78.3%)
デフォルトのままだと微妙な結果ですね。
データの特徴を知るために、データの相関関係を見てみました。
Survived | Pclass | Age | SibSp | Parch | Fare | female | C | Q | |
Survived | 1.000000 | -0.034542 | -0.254085 | 0.106346 | 0.023582 | 0.134241 | 0.532418 | 0.104870 | -0.038544 |
Pclass | -0.034542 | 1.000000 | -0.306514 | -0.103592 | 0.047496 | -0.315235 | 0.046181 | -0.231837 | -0.039131 |
Age | -0.254085 | -0.306514 | 1.00000 | -0.156162 | -0.271271 | -0.092424 | -0.184969 | 0.085018 | 0.019038 |
SibSp | 0.106346 | -0.103592 | -0.156162 | 1.00000 | 0.255346 | 0.286433 | 0.104291 | -0.056723 | 0.169446 |
Parch | 0.023582 | 0.047496 | -0.271271 | 0.255346 | 1.00000 | 0.389740 | 0.089581 | -0.074372 | -0.066406 |
Fare | 0.134241 | -0.315235 | -0.092424 | 0.286433 | 0.389740 | 1.00000 | 0.130433 | 0.240382 | 0.015625 |
female | 0.532418 | 0.046181 | -0.184969 | 0.104291 | 0.089581 | 0.130433 | 1.00000 | 0.062691 | 0.004024 |
C | 0.104870 | -0.231837 | 0.085018 | -0.056723 | -0.074372 | 0.240382 | 0.062691 | 1.00000 | -0.078017 |
Q | -0.038544 | -0.039131 | 0.019038 | 0.169446 | -0.066406 | 0.015625 | 0.004024 | -0.078017 | 1.00000 |
Survived列を見ると1番影響が大きいのはfemaleで、これはダミー変数を与えているため、sex(性別)が1番影響が大きいということがわかります。実際にデータを見てみても女性のほうが生存率が高く、史実でも女性が優先的に救助されたという事実があるとのこと。
次点はage(年齢)になりますが、負の相関を示しているので若いほど生存している確率が高いことがわかります。体力面もあるかもしれませんが、子供から優先的に救助された事実もあるとのこと。
実はage(年齢)は欠損値が多いので、平均値で補完してしまっていました(学習データで177人分欠損)。age(年齢)をより正確に補完できれば精度が向上するものと考えられます。
そこで、age(年齢)の補完のために以下を実施してみました。
①Pclass(階級)との関連性を利用したAge(年齢)の補完
Age(年齢)との相関を見てみると、一番関連性があるのがPclass(階級)ということがわかります。Pclass(階級)は数字が小さいほうが良い階級であるため、負の相関を示していることから年齢が上がるほど良い階級となっているようです。
②英語の敬称との関連性を利用したage(年齢)の補完
Kaggleには「kernels」という項目があり、そこではデータサイエンティスト達が自分の手法を公開していたり、関連性のある値について考察していたります。「kernels」をいくつかを読むと、name(名前)の値を分割して敬称を取り出し、「Master」、「Miss」、「Mr」、「Mrs」、と、「それ以外」に分類してモデルに取り込んでいる例がいくつかありました。子供や女性の敬称は年齢の推測に一役買うことができると考えられます。
以上を考慮した上で再度モデルを作成し、Kaggleに投稿してみました。
一番精度が良かったもの : ロジスティック回帰
精度 : 0.78947(約78.9%)
順位 : 1933/6057位 (上位約33.3%)
精度としては約2%の向上となりました。
順位が一気に上がっているので、私のようにデフォルトのままお試しで投稿している人が多いのかもしれません。
英語なので最初は躊躇してしまいましたが、思ったよりも簡単に投稿できました。
「kernels」の項目に目を通すだけでも勉強になりますね。
今後はスキルを磨くためにも、実際のコンペティションにも応募してみたいと思います。