ヘボ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%、ふむ。
一旦、遺伝的ホニャララへ移行しよう。
いつもお読みいただき、ありがとうございます。 書くだけでなく読みたいので、コメント欄で記事名入れてもらうと見に行きます。