工学と医学のあいだ

医者のふりをしたエンジニアになりたい。ゆるゆるやってます。

Learn Feature Engineering②

Learn Feature Engineering Tutorials | Kaggle

kaggle learn で feature engineeringを勉強するシリーズ第二弾。

www.kaggle.com

今回はカテゴリカルエンコーディングについて。

  • Count Encoding
  • Target Encoding
  • CatBoost Encoding

の取り扱いを勉強します。

 

使用するライブラリはこちら。

http://contrib.scikit-learn.org/category_encoders/

 

1) Categorical encodings and leakage

実際に使用する場合は、データセットのうちtrainのみを使い、testやvalidationは使用しません。使用するとleakしてしまうからです。

 

2) Count encodings

    import category_encoders as ce
cat_features = ['ip', 'app', 'device', 'os', 'channel']
train, valid, test = get_data_splits(clicks)

# Create the count encoder count_enc = ce.CountEncoder(cols=cat_features) # Learn encoding from the training set count_enc.fit(train[cat_features]) # Apply encoding to the train and validation sets train_encoded = train.join(count_enc.transform(train[cat_features]).add_suffix('_count')) valid_encoded = valid.join(count_enc.transform(valid[cat_features]).add_suffix('_count'))

category_encodersから、CountEncoder()を選択したのち、.fitでtrainingデータを学習させ、.transformでencodingします。.add_suffixを使って、_countを列名に付け加えて元のデータセットにjoinします。

 

3) Why is count encoding effective?

なぜcount encodingが有効なのでしょうか?

希少値は、似たようなカウント(1や2のような値)を持つ傾向があります。そのため、予測時に希少値をまとめて分類することができます。カウントが大きい値は、他の値とカウントが全く同じである可能性が低いです。結局、重要なグループに分類することができます。

 

4) Target encoding

CountEncoderと同様、TargetEncoderを使用します。.fit時にtargetとなるtrainingデータの列を指定する必要があります。

 

5) Try removing IP encoding

IPアドレスを除いてencodingするとどうなるでしょうか?同一のIPアドレスごとのデータが少ないので、ノイズが多くなってしまいます。また、testやvalidationでtrainingデータにない新しいIPアドレスを見たとき(これはほとんどの新しいデータであると思われます)モデルのパフォーマンスは非常に悪くなります。したがって、IPアドレスを除外するほうが成績はよくなることが予想されます。

 

6) CatBoost Encoding

CountEncoderと同様、CatBoostEncoderを使用します。.fit時にtargetとなるtrainingデータの列を指定する必要があります。5)で予想した通り、validation AUC scoreがさらに高くなりました。

 

まとめ)

category_encodersという便利なライブラリーを使用しました。

count encodingがなぜ有効かを勉強しました。

IPアドレスのような値を入れてしまうと、testやvalidationには汎化しにくいことを学びました。

leakしないようにtrain datasetのみで.fitすることに注意しましょう。

Learn Feature Engineering①

Learn Feature Engineering Tutorials | Kaggle

kaggle learn で feature engineeringを勉強するシリーズ第一弾

Baseline Model | Kaggle

1) Construct features from timestamps

.dt.hour.astype('uint8')を使うと、pandas形式のタイムスタンプを時間(hour)の特徴量に変換することができる。

 # Split up the times
    click_times = click_data['click_time']
    clicks['day'] = click_times.dt.day.astype('uint8')
    clicks['hour'] = click_times.dt.hour.astype('uint8')
    clicks['minute'] = click_times.dt.minute.astype('uint8')
    clicks['second'] = click_times.dt.second.astype('uint8')

 

2) Label Encoding

scikit-learnのpreprocessing.LabelEncoderから、.fit_transform methodを使うと、categorical featureをlabel encodingすることができる。

    label_encoder = preprocessing.LabelEncoder()
    for feature in cat_features:
        encoded = label_encoder.fit_transform(clicks[feature])
        clicks[feature + '_labels'] = encoded

 

どちらも知らなかったのでとても勉強になりました。

Deep Learningを使ったキルミーベイベーアイコン686枚によるキルミーベイベー的な画像分類

Abstract

kivantium.hateblo.jp 

Labellioを知りました。今回は、アニメ「キルミーベイベー」のアイコン686枚*1を用いて、キルミーベイベーとカガクチョップその他の画像分類を行いました。その結果、顔が写っていないやすなをやすなだと認識させることに成功しました。

Introduction

キルミーベイベーはカヅホ先生原作の4コマ漫画である。2012年にアニメ化された。現在原作は7巻まで。2013年発売のキルミーベイベー・スーパーにOVAが収録された。熱狂的なファンによって2期が待望されている。

twitter.com

また、カヅホ先生による、カガクチョップという漫画も連載中である。声優、赤崎千夏田村睦心の意表をついた起用により、CMが話題になっている。

comic-meteor.jp

www.youtube.com

Methods

今回用いたデータセットでは、やすな、ソーニャ、あぎり、やすなとソーニャ、没キャラ、その他の6つのクラスを作りました。作成の仕方は、以下のように画像をフォルダに入れて、フォルダをまとめてzipファイルを作りました。分類では686枚のアイコンをじっくり鑑賞することができました。

f:id:oribeyasuna:20150719091931p:plain

例えば、やすなとソーニャのフォルダの中身は以下のようになりました。なお、にせやすなはやすなの分類にしました。

f:id:oribeyasuna:20150719092123p:plain

あぎりさんともう一人以上いるパターン、かぼちゃあぎりさんは今回の6クラスに入らないと判断したため使いませんでした。

f:id:oribeyasuna:20150719092335p:plain

Labellioでtrainingしました。途中でバグが発生しましたが、きっと私が原因ではないと信じています。迅速な対応をしていただきました。以下がtraining後の結果です。

f:id:oribeyasuna:20150719095808p:plain

90%程度の精度で分類ができると考えられます。データセットを増やすことでまだ精度が上昇することが期待されます。なので2期をお願いします。

Results and Discussion

まずはキルミーベイベー的非キルミーベイベー画像の分類を行いました。

まずはカヅホ先生のアイコンを分類しました。69%でその他に分類されています。22%でやすならしいです。

f:id:oribeyasuna:20150719095757p:plain

次に、カガクチョップの鈴園沙衣を分類しました。予想通りソーニャに74%で分類されました。セオリー通りだと、声優はソーニャ役の田村睦心さんですが、CMではやすな役の赤崎千夏さんが起用され、われわれと人工知能の予想を裏切ったということになります。

f:id:oribeyasuna:20150719093825p:plain

カガクチョップの長倉蓮も分類しました。44%でやすなです。CMではソーニャ役の田村睦心さんが起用されました。ソウダッター!!

f:id:oribeyasuna:20150719094102p:plain

最後に、キルミーベイベーの画像分類を行いました。

まずは原作のやすなを分類しました。93%という高精度でやすなと分類されています。しっかりキャラの書き分けができているということが分かりました。

f:id:oribeyasuna:20150719094511p:plain

続いて、再度原作のやすなを分類しました。こんなのでもやすなだと分類して、正直驚きました。手と足の位置がやすなの特徴量になっている可能性が考えられます。感動しなかったら木の下に埋めてもらっても構わないよ。ババーン

f:id:oribeyasuna:20150719094647p:plain

Future works

ディープラーニングでやすな細胞を発見したい。

感想

予想を遥かに上回る容易さでディープラーニングができました。小学生の夏休みの自由研究などに、いろいろな画像セットを作って実験してみてはいかがでしょうか。

予想以上に686枚の画像セットが優秀だったので驚きました。かぼちゃあぎりさんを除外する必要がなかったような気もしてきたので、そこら辺も深く考えるべく、ぜひキルミーベイベー2期をよろしくお願いいたします。

追記

Labellioのネットワークレイヤー。

f:id:oribeyasuna:20150719112813p:plain

畳み込み層。これ他のモデルでも同じになるけれど正しいのだろうか?

追記:肉眼で分からないレベルで違うらしい

conv1

f:id:oribeyasuna:20150719112835p:plain

conv2

f:id:oribeyasuna:20150719112847p:plain

conv3

f:id:oribeyasuna:20150719112855p:plain

conv4

f:id:oribeyasuna:20150719112909p:plain

conv5

f:id:oribeyasuna:20150719112903p:plain