【Kaggleの本で勉強(4/18)】Tabular_Playground 組み合わせ(続き)
よくよく本とDiscussionとコードとを見直してやり直してみた。
本に書いてあったアンサンブルは回帰タスクだったんで間違えてた。
二項分類になるように、0か1に変換したらOKでした。
ただ、ランダムフォレストを組み合わせても良くはならなかった。。
LightGBM単体が一番精度が良く0.80334でした!
tpg2021april_submit01.csv:LightGBM
tpg2021april_submit02.csv:RandomForest
tpg2021april_submit03.csv:LightGBM0.5+RandomForest0.5
tpg2021april_submit04.csv:LightGBM0.7+RandomForest0.3
【Kaggleの本で勉強(4/17)】Tabular_Playground 組み合わせ
LightGBMとランダムフォレストを半分ずつ組み込んでsubmitしてみたところ、
あれ???
スコアが出ない。。。なぜじゃ。
もう、今日は遅くなってしまったので解明はまた今度。。
【Kaggle日記(4/17)】Tabular_Playground ②
この間、LightGBMで学習したのだけど、KaggleのDiscussionで一番良い成績の人のやつを見たら、他のツールで学習したのとアンサンブルしていたので、それに習ってランダムフォレストで学習してみました。
ほとんど元のデータをさわらないで欠損値の補正とラベルエンコーディングだけやって出してみたらすごい精度が低かったので(0.57とか)、パラメータの調整をGridSerchCVでやって出したんだけどあんまり変わらなかった。。。
ランダムフォレストで出すのにすごい時間がかかって疲れてしまったので、アンサンブルしてない。。。
【Kaggleの勉強(4/17)】Tabular_Playground‐2021April 欠損値とかの補正
2021AprilのDiscussionを参考に見てみたら欠損値を鮮やかに(初心者の私から見ると、ほんとに鮮やか)処理している方がいたので今後のために書き残します。
ただ、プログラムの意味が難しくて解読が必要でした。
■平均値で穴埋め
これは本にも書いてあったので理解できました
all_df['Age'] = all_df['Age'].fillna(all_df['Age'].mean())
■欠損値はXで穴埋め、他の値は先頭の文字だけにする
all_df['Cabin'] = all_df['Cabin'].fillna('X').map(lambda x: x[0].strip())
ここからよくわからない。
mapとlambdaが何しているのか。
ここのリンクで勉強。ふむふむ。
techacademy.jp
まず、lambdaは無名関数といって、簡単な処理の関数であればdefで書く代わりに
使えるもの、ということらしい。使い方は、
lambda 引数: 返り値
とするか、
関数名 = lambda 引数: 返り値
として、関数名に置き換えてdefと同じように使うこともできる。
例えば、
def square(n): return n ** 2
はこの式を書けば同じように使える。
square = lambda n: n**2
次にmapの使い方。
map(関数, シーケンス)
なので、関数にlambdaを入れるとこんな感じになる。
map(lambda 引数: 処理, シーケンス)
でもさっきの式にはシーケンスが指定されていないな。。。
そもそも x[0].strip() ってなんだ??
strip()をググると、
stripメソッドの引数に何も指定しない場合、自動で空白文字を削除します。
とあるので、xの1つ目の値から空白文字を削除することになる。
空白文字ってなんだ??
これは、
空白文字は以下の通りです。
半角スペース
全角スペース
「\n」改行
「\f」改ページ
「\t」タブ
「\v」垂直タブ
「\r」復帰
ということらしい。
( ,,`・ω・´)ンンン? strip()ってなんか意味あんのかな?
わからんけど、入れなくてもおんなじ結果になった。
ええっと、シーケンスが特定されいないけど、、、
あ、Pandasでのmapの動きを見ればいいのかな。
これで見ると、、、
Seriesの各要素に適用されるようだ。別にシーケンスは指定しないでいいんだね。
なので、このコードの意味は、
all_df['Cabin'] = all_df['Cabin'].fillna('X').map(lambda x: x[0].strip())
Cabinの値のNullをXに置き換えて、それぞれの値の1文字目の空白を削除したもので
置き換えるという意味かな。
次は、
all_df['Ticket'] = all_df['Ticket'].fillna('X').map(lambda x:str(x).split()[0] if len(str(x).split()) > 1 else 'X')
これが一番良くわからなかった。
NullをXで置き換えるまでは一緒。で、次にもしそれぞれの値(文字列)のstr(x).split()が1より大きかったら
str(x)をsplitした文字列の1番目の値に置き換える。1以下だったらXに置き換えるってことね。
str(x).split()がわからんのぅ。。。
この記事でわかるかな。
note.nkmk.me
str(x).split() = 区切り文字で分割
みたいだ。区切り文字を何も指定していないので、この場合はスペースで区切られるみたいだ。
lenはリストの要素数を数えるので、スペースの区切りが無いものは1、区切りがあると1より大きな
数字が返ってくる。
Ticketはアルファベット+スペース+数字もしくは数字で表されているように見えるので、意味が
ありそうな先頭のアルファベットだけ残して、数字だけのものはXに変えちゃってるのね。
よくわかりました。これでデータの整理を終えて、今度はブレンドをやってみよう。
【Kaggle日記(3/27)】Titanic、HousePricesの次:Tabular_Playground ①
というわけで、Tabular_Playgroundというのをやってみた。
Titanicと同じようなデータセットということなので、本を頼りにやってみてとりあえず初回のSubmitまでできた。
さて、この後どうやれば精度があがるのやら。
どこか参考になるページを探さねば。
【Kaggle日記】Titanic、HousePricesの次は?
ひとまず、Kaggleデータ分析入門をやり終わったので、TitanicとHousePricesには触れてみたものの、さて次はどうすればいいのかしら。。。
ググってみた結果このページがわかりやすかった。
ここに初心者向けのコンペのリストがあるんだけど、、、
やったことのあるのは、回帰と二項分布だけなので他の種類は難しいかな。
コンペ名に付いている種類でいうと、【Started】か【Playground】でしょうねぇ~きっと。
ということは、これですね!
ということで、チャレンジするコンペはこれに決定。
ただし。。。
ページが英語なのでどうしようかと思っていたら先ほどのページに翻訳の仕方がいろいろと載っていました。
ブックマークレットなんていう初めて目にする技やChromeの拡張機能(monkey???)を駆使しながらなんとか、翻訳ページを出現させることができました。
っと、ここまでやったら疲れちまった。
ひとまずデータの読み込みだけして、続きはまたということで。
【Kaggleの本で勉強(3/21)】HousePrices 追加分析② 高額なおうちの条件を可視化する
価格の上位10%に入っている家の条件を決定木を使って可視化します。
決定木はLightGBMと比べて精度が低いらしいので予測する段階では使わないみたいです。でも、LightGBMで分析した結果を可視化することで、新たな特徴量を生成するヒントが得られることもあるため、このような使い方をするらしいです。
最後の決定木の図は見てもよくわからないんですが、ひとまずこれでHousePricesはおしまいです。