Re:ゼロから始めるML生活

どちらかといえばエミリア派です

xfeatを使ってみる

pfn-researchから公開されているxfeatという特徴量エンジニアリングのライブラリがあります。

私自身はは特徴量エンジニアリングの「と」の字もよくわかっていませんが、こちらのライブラリを使用すると何やら特徴量エンジニアリングがかんたんに書けると聞いて、なんとなく使ってみたくなりました。 ということで、xfeatを使っていろいろやってみたいと思います。

xfeat is なに?

pfn-researchが公開している特徴量エンジニアリングのライブラリです。

github.com

スライドによる説明はこちら。

github.com

使い方についてはこちらの記事が非常にわかりやすいので、こちらも合わせて確認するとよいかと思います。

acro-engineer.hatenablog.com

試しに使ってみる

さて、本題です。実際に使って色々やってみたいと思います。

チュートリアルはこちら。

github.com

適当にチュートリアルのコード見てみる

カリフォルニア住宅価格のデータセットを使用して、とりあえず特徴量エンジニアリングをやってみたいと思います。

特徴量を自力で作る際にちょっと記述するだけで特徴量の組み合わせを勝手に生成してくれるので、何も考えなくても適当に作成できます。

こんな感じでカラムの組み合わせを定義することで自動で特徴量を作ってくれるみたいです。

# カラムを組み合わせた特徴量を作成するパイプライン
encoder = Pipeline([
    SelectNumerical(),
    ArithmeticCombinations(
        drop_origin=False,
        operator="+",
        r=3,
        output_suffix="",
    ),
])
encoder.fit_transform(df)

今回は数値だけを取り扱っていますが、カテゴリ変数であってもかんたんに操作できるようです。

Feature Selection

新しい特徴量を作ることができることは確認できたので、今度はFeature Selectionをやってみます。

サンプルコードはこちらです。

github.com

この場合、ベースにあるのはLightGBMのFeature Importanceの値で、その重要度によってFeature Selectionをするようです。

下記のところで特徴量を新しく作って学習しています。

print("After adding interaction features:")
df = feature_engineering(df)
evaluate_dataframe(df, data.target)

更に、Feature Selectionは、下記のところでやってますね。

print("After applying GBDTFeatureSelector:")
df = feature_selection(df, data.target)
evaluate_dataframe(df, data.target)

もとのサンプルコードをほぼそのままですが、実行してみるとFeature Selectionによって精度が高くなっていることが確認できます。

Feature Selection + Optuna

さらに、上記のコードだとFeatureはThresholdが固定値になっていました。 これはOptunaと組み合わせることでThresholdの値に関しても調整しながらFeature Selectionができるようです。

特にThresholdの値を調節しなくても、勝手にいい感じにFeature Selectionしたいときには重宝しそうです。

参考文献

こちらの文献を参考にさせていただきました。

acro-engineer.hatenablog.com

www.smartbowwow.com

感想

ちょっと使ってみたかったので、チュートリアルをなぞってみた次第です。

特徴量エンジニアリングが大事だとわかってはいるものの、個人的にはあまり得意ではないのが正直なところです。 この手のツールを上手に使えるといろいろ捗るところもあると思うんで、しばらく使ってみて慣れていきたいと思います。