見出し画像

ヘボkagglerのTitanic再挑戦【初心に返る編】 #kaggle #機械学習

お世話になっております。

ここで新しい技術を導入する前に、もっと丁寧に欠損値を埋めていこうということです。

df[df[column]=='Master']

年齢を見ても子供。

Capt

70才。この人は・・・

df[df[column].str.contains('Capt')]
df_train[df_train['Name'].str.contains('Capt')]
df_test[df_test['Name'].str.contains('Capt')]

テストデータにはいない。
そのため、特殊な人なので、特殊な人グループに分ける。

df[column] = df[column].replace(['Capt'], 'test_non')

テストにいない人。

Col

少ないがテストデータにもいる。トレーニングデータには1人いるが、サンプルとして少なすぎるので、その他にまとめる。

df[column] = df[column].replace(['Col'], 'Other')

この調子で、全部やってみる。

Countess|伯爵夫人

夫人か。高貴な夫人。テストにいない。まとめる。

Dona|愛称?

Donaldさん。テストに同じ愛称はいない。が、Donaを含む人は他に2人いることがこれでわかった。ミスター&ミセスドナルド。この時、はじめて家族同士で助け合うか、どちらかが犠牲になって、相手を助けるケースを思いつく。どちらかが犠牲になった場合、男性が女性を庇うとして、男性が死亡するケースがあるか調べたくなる。

Lady

1人、テストにいない。まとめるが、、、前回まででPclassがお金持ちだと仮定していて生存に関連すると仮定しているから、お金持ちカテゴリに入れたい。
Capt CountessもPclassが1なので、test_nonに入れても問題ない。

Sir

1人。テストにいない。Pclass1。

Jonkheer

貴族の総称か?テストにいない。Pclass1。

Don|愛称?

テストにいない。Pclass1。

Mme

テストにいない。Pclass1。

Ms

トレーニングにもテストにも1人ずつ。Pclass2と3の女性。ミセスか?Missか?

ミスにしよう。SibSpとか0だ。さっきの夫婦らしき人のデータを見ていたから、この辺0なら未婚としよう。

Mlle|婦女?

テストにいない。Pclass1。

Dr

結構いる。Pclassバラバラ。その他へ。

Rev

Pclass2、その他へ。

Major

テストにいない。Pclass1

MrとMissとか

column = 'mrms'
df[column] = df['Name'].str.extract('([A-Za-z]+)\.', expand = False)
df[column] = df[column].replace(['Capt', 'Countess','Lady','Sir','Jonkheer', 'Don','Dona', 'Mlle','Mme','Major'], 'test_non')
df[column] = df[column].replace(['Ms'], 'Miss')
df[column] = df[column].replace(['Col','Dr', 'Rev'], 'Other')

Embarked

df[df['Embarked'].isnull()]

2つある。
Icard, Miss. Amelie
Stone, Mrs. George Nelson (Martha Evelyn)
家族での助け合いを後で見るから、これは助かる。
女性で、単独で乗船しているようだ。

80円(単位はもうどうでもいい)で乗っているから、乗船箇所はわかりそうなものだ。

df[df['Fare']==80]

Sか。

df['Embarked'].fillna('S',inplace=True)

家族での助け合い

これがあるかどうかを調べる。

Parch

親子の数。

pd.crosstab(df.Parch,df.Survived,margins=True).style.background_gradient(cmap='summer_r')

下と同じような計算をしている。
3以上は3。

SibSp

pd.crosstab(df.Parch,df.Survived,margins=True).style.background_gradient(cmap='summer_r')

兄弟、配偶者

1人だと34%の生存率。38%生存率が全体平均で、平均を下回る。
2人だと55%の生存率。2人で50%。ふーむ。
3人、4人でガクッと生存率が落ちているような。
逃げるボートの大きさとか?そんなん2-2で別れればいいしなぁ。

とりあえず3以上は3だな。

それで、特徴量の作り方で足したり引いたりというのがあるので、この数字を足したのと引いたのを特徴量に追加。

機械学習を作動させてみよう。

正解率、やっと昔に戻る

ふー。

Cabinも埋めてみるか。事故で船体の後部が大破したのは知っているから、船室の位置も生存に関係するだろう。

個別に埋めにいってみよう。

column = 'Cabin'
df[column+'head'] = df[column].str.extract('([A-Za-z]+)', expand = False)

labels, uniques = pd.factorize(df['Cabinhead'])
df['Cabinhead']=labels

一瞬、数字にして相関を見ながら、

df.corr()
l=list(['Pclass','Farecut'])

船室のクラスと運賃のビン分割で、

df['Cabinheadmedian']=df['Cabinhead'].fillna(df.groupby(l)['Cabinhead'].transform('median'))

グループバイして中央値で埋める。

df['Cabinheadmedian'] = np.round(df['Cabinheadmedian'])

欠損値の残りを見てみる

df[df['Cabinheadmedian'].isnull()]
df.isnull().sum()

31個

Parch+SibSp

親兄弟、同乗の人数でCabinは一緒か?Ticketが一緒なら一緒かもしれない。そう考えると、TicketとParch+SibSpでグループ分けするべきか。

無理やり欠損値埋め

これで現状の特徴量生成は止めよう。
もういい。ファミリーサイズとか思い浮かばんものは踏まえられない。
というわけで、次に進もう。
適当に埋めると、正答率が下がるな。。。
75%、ふむ。

一旦、遺伝的ホニャララへ移行しよう。

いつもお読みいただき、ありがとうございます。 書くだけでなく読みたいので、コメント欄で記事名入れてもらうと見に行きます。