【タイタニック】特徴量の追加とGridSearchで精度向上した話

Kaggle

背景

Kaggleのタイタニックの続きです。

前回はできなかったEDA、ビニング処理、モデルのパラメータ調整をやっていきます。

なお、前処理などの内容は前回と同様の内容で終了していることを前提に実施します。

EDAパート

EDAとは?

EDAとはExploratory data analysis(探索的データ分析)と呼ばれるモデル作成を行う前に実施する作業のことで、Kaggle業界ではよく使われる言葉です。

むちゃくちゃ簡単にいうと、「データを観察して、データのパターンや特徴を発見すること。」ということです。
詳しくは下記のサイトでわかりやすく説明されてます。

【データサイエンティスト入門編】探索的データ解析(EDA)の基礎操作をPythonを使ってやってみよう
データサイエンティストの最初の一歩「探索的データ解析(EDA)」をPythonを使ってやってみよう!データの特徴を探求し、構造を理解することを目的としたデータサイエンスの最初の一歩です。

そんなん前からやってるわ!と思ったのですが、

・未知のデータを扱う上ですごく重要な考え方であると思ったこと
・横文字使いこなせる俺かっけえ

をしたいので自分も周りに合わせて「EDA」と呼ばせてもらいます。

Parch(両親、子供の数)とSibSp(兄弟、配偶者の数)

前回使えなかった変数のParchとSibSpをEDAしていきます。

まずは、Parch、SibSpとSurvivedの関係についてグラフ化していきましょう。

どちらも0で生存率が低く、1~2で生存率が上がっていく、似たような分布をしてます。

そもそも、ParchとSibSpは同乗者の数という点では同じような意味のデータであるので、両方の値を足し合わせた”family-size”(家族数)というカラムを作成して、分布を確認してみます。

0で死亡者率が高く、1~3で生存率が高い二つの変数をの特徴を足し合わせた変数になりました!

特徴量に追加しましょう。

Name(名前)

次に前回利用できなかったNameの中身をEDAします。まずは、教師データの上から10データを見ていきます。

名前のデータについては、あんまり関係ないかと思いましたが

Mr,Miss,Mrsなどの敬称が,(コンマ)の前に存在していることがわかります。

敬称の部分をsplit関数を利用して分離して、”Title”(敬称)のカラムを作成していきます。

Mr,Miss,Mrsのほかにもたくさんの敬称が存在するのがわかります。

テストデータの中身はどうなっているでしょうか?

テストデータと比較してわかったことはMajor、Captなどテストデータには存在しないデータが含まれていることです。これを残しておくと精度が下がるのでdropを用いて省いていきます。

はい、テストデータに含まれないデータの削除が終わりました。TitleとSuvivedの関係を確認しましょう。

Mr(男性)の生存率が極端に低く、Master(老人男性)がやや高い。 また、Mrs(既婚女性)はMiss(未婚女性)に比べ生存率が高いという特徴がみられます。これは年齢の高い人、女性を先に逃がしたという風に考えられるのではないでしょうか?

Sexの上位互換となる特徴量になると考えられます。

Ticket、CabinのEDAについてはまた次回実施していきます。

特徴量作成

ビニング処理

ビニング処理は特徴量をあるエリアで区切って新しいカテゴリ変数に変換する処理のことです。先ほど作ったfamily-size,Titleのデータに対して処理を行っていきます。

family-size(家族の数)のビニング

family-sizeは0の時に死亡率が高い、1~3の時に生存率が高い、それ以上では死亡率が高い という特徴がみられます。またデータを見ると、7以降では生存率が0になるので、4つのエリアに分割し、family-size-binというカラムに追加していきましょう。

データを見ると

・small … 生存率が高い
・alone … 死亡率が高く,n数も多い
・big … 生存率が0% = bigのデータは必ず死亡する
・medium … 死亡率が高い

この4エリアのデータに分けられたました。テストデータにも反映させます。

Title(敬称)のビニング

同様にTitleについても処理を行っていきます。

分け方は、登場回数の多いMr,Mrs,Miss,Masterは残し、それ以外はRareで統一します。
また、Ms,MlleについてもMissの書き間違いとみなしてMissに統一します。

テストデータでも同じ処理を入れます。

ビニング終了です。

LabelEncording

カテゴリ変数の離散化をしていきますが、今回はLabelEncordingという関数を利用します。

LabelEncordingは指定したカテゴリ変数を自動で離散化してくれる便利ツールです。

今回使う特徴量でカテゴリ変数にあたるのは ’Sex’,’family-size-bin’,’Title’,’Embarked’

の4種類です。これらにLabelEncordingをかけていきます。

教師データの目的変数(y_train)、説明変数(X_train)、テストデータの説明変数(y_test)を作成します。

特徴量作成完了です。

モデル作成

ランダムフォレストでfeature importanceの計算

ようやくモデル作成です!今回も前回と同様ランダムフォレスト識別していきますが、特徴量が増えたのでランダムフォレストでfeature importanceを計算して、どの特徴量が一番効いているかをチェックしていきます。

追加した特徴量のTitleとfamily-size-binは思ったより効いてなさそうです。

特に、TitleはSexの上位版の特徴量であると思っていたのですが、ほとんど変わらない結果となりました。Rareで頻度の少ない値をまとめてしまったのが悪かったのでしょうか?
ひとまずこのままでパラメータ調整、モデル作成行います。

GridSearchを使ったパラメータ調整

最後に前回できなかったパラメータ調整をやっていきます。

パラメータ調整にはGridSearchを利用します。振った水準の中でどのパラメータが最適か計算してくれる便利な奴です。

水準、因子数は適当に決めて動かします。

でました。ちなみにこの計算に1時間くらい経過。。。ラップトップのローカル環境でやるとこうなります。

モデルの作成と提出

パラメータ調整も終了したのでいよいよモデル作成+提出です!

今回はパラメータ調整結果の比較のために

・ベストパラメータでのモデル

・パラメータ調整なしのモデル

・パラメータ適当に決めたモデル

の3つを作成して結果を比較していきます。

Scoreの結果を見るとパラメータ調整なしは過学習してそうですね。

それでは分類結果をcsvに出力してKaggleに提出してみましょう。

提出結果は、、、

ベストパラメータ Score:0.77033

・パラメータ調整なし Score:0.74162

・適当パラメータ Score:0.77033

でした!

前回のScoreが0.72727だったので、特徴量の追加だけで。約1.4%のScoreの向上
パラメータ調整の有無でScoreが2.8%の向上につながりました!

(適当パラメータとベストパラメータのスコアが変わらないのが気になりますが。)

目標としている8割までもう少しです。特徴量の追い込みとモデルの変更などをして8割めざしていきます!

コメント

タイトルとURLをコピーしました