Python-機械学習-特徴量エンジニアリングこんにちは!たかぱい(@takapy0210)です。2019の10日目の記事です。Encodersを動かしてみた結果をまとめてみようと思います。Encodersとはカテゴリ変数をさまざまな数値変数に変換してくれるライブラリです。EncodingといったKaggleなどの分析コンペでもよく使われている手法が多く収録されており、個人的にオススメのライブラリです。Encodersはscikit-learn-contribプロジェクトの1つに登録されおり、scikit-learnのAPIの流儀に従って実装されているため、scikit-learnに親しい人であれば違和感なく使えるのも1つの特徴だと思います。公式ドキュメント:contrib.scikit-learn.orgドキュメントを見ていただくと分かると思いますが、冒頭で挙げた有名どころの他にも多くのContentsを含んでいます。本日はこれらを用いたらどのような変換をしてくれるのかを検証していければと思います。※実際のモデルへ適用し精度の検証までは行っていません。今回はあくまでどのような動作をするのかを検証してみたものになります。)は、そのままの形(数値で表現されていない形)では学習させることができません。そこで、何らかの量的変数に置き換えて表現する必要があります。Encodersです。使用するデータ今回検証に使用したデータはfeaturetoolsから取得したデモデータです。検証するために意図的にデータを整形しています。size=len(df))これで下記のようなデータフレームが生成されます。今回はこのdeviceカラムをゴニョゴニョしていきます。5また、コンペで利用することも想定し、下記のようにtrainとtestも作っておきます。コンペや実務でも遭遇するパターンとして、laptopに関してはtestデータにのみ存在する水準としています。Encodingに分けて紹介していきます。どちらもカテゴリ変数の変換ですが、下記のようにEncode時に必要な引数が異なるため、敢えて分けて記載します。Encoding:Encodeに目的変数を必要とする準備pipでインストールできます。category_encodersまた、下記のようにimportしてカラムを指定しておきます。Hotおなじみのやつです。Encodingなどをやろうとすと結構辛かったりします。(numpyで返ってくるので、それをまたDataFrameに変換しないといけない・・・とk)その点、category_encoders使えば下記のようにシンプルに記述できます。Encodingと同じやつです。1Binaryカテゴリをバイナリビット文字列に変換してくれます。Encodingを使い分けることができます。Encodingと同様の結果が得られます。Encodingと同様の結果が得られます。Hashingを用いることでその数を少なくすることが可能です。水準数を少なくしているので、ハッシュ関数の計算によっては異なる水準でも同じ場所にフラグが立つことがあります。Encodingを行うと特徴量が膨大になってしまう場合に利用することが多いです。Encodingを使用することが多いと思います)Hashingはn_componentsで変換後の特徴量の数を決定することができます。0このままだと、全てが0のカラムも返ってきてしまうので、drop_invariant=Trueとすると、1が設定されているカラムのみを取得することができます。Coding下記のように変換されます。4)詳細はこちらを参照。variable.と記載があるので、名義尺度または順序尺度の変数の変換に向いていると思われます。Coding下記のように変換されます。Codingの例(k=4)詳細はこちらを参照。Coding下記のように変換されます。spaced.と記載があるので、順序尺度の変数の変換に向いていると思われます。Coding下記のように1つの水準を全て-1で表現し、残りはOne-Hotで表現します。Codingの例(k=4)詳細はこちらを参照。Encodingとは、目的変数を用いてカテゴリ変数を数値に変換する手法です。目的変数をリークさせる可能性があるので、使うときには注意が必要です。data.のように、回帰と分類でアプローチの方法が異なるようですが深ぼって検証はできていません。Encodingしてくれる手法です。6.00このEncodingですが、下記のようにfitとtransformを別で実行すると値が変化するので注意が必要です。Encoderに近い変換になります。EncoderCatBoostの内部での変換を真似してやってしまおう、というもの(?)みたいです。このリファレンスのいずれかの式で算出していると思うのですが、正確なところまでは分かりませんでした。EncoderJames-Stein推定量を使用しているみたい。(この辺りは知識不足で分からず。勉強します)ドキュメントには下記の加重平均を用いていると記載されています。Encoderをよりシンプルにしたもの、という記載がされている。mの値が大きいほど、収縮が強くなる。8.727たしかに、mが大きい方が数値の分散が少なくなっていることが分かる。distributionと記載があるので、連続した量的データに対して有効のようです。これは目的変数がbinary(2値分類)の必要があるため、targetを以下のように変更します。1この状態で変換してみます。0.000最後にいかがでしたでしょうか。(書き始めたのが当日の0時過ぎだったこともあり、深いところまで調査できずに終わってしまいました。準備が大切ですね)自分でも知らない変換手法が多くあり、とても勉強になりました。Encodersを使用することで、よりシンプルに実装できているので、「カテゴリ変換どうにかなんね〜かなぁ」と悩んでいる方は是非一度使ってみてはいかがでしょうか。次は各種変換方法でカテゴリを変換したもので実際にモデリングして、scoreへの影響などを調査できればと思っています。関連記事2019-06-23GloVeを使って単語の分散表現を取得するこんにちは。takapy(@takapy0210)です。UNIXコマンドの基礎」こんにちは。takapy(@takapy0210)です。toC企業でMLエンジニアとして働いています。ブログでは主に機械学習界隈の話ができればと思っています。(1)月別アーカイブリンクプライバシーポリシ。