こんにちは!
消費財メーカーでデータサイエンティストをやっているウマたん(@statistics1012)です!
機械学習を使ってモデルを構築する上で、非常に重要なのが特徴量エンジニアリング。
特徴量とは、モデルにインプットする要素・変数のこと。
例えばお店の売上を予測するために気温や曜日のデータを使う場合、気温や曜日が特徴量になります。
統計学の世界では変数という言葉を使いますが、専ら機械学習界隈では特徴量と言いますね。
そんな特徴量を上手く作り出し精度を高めようとする取り組みが特徴量エンジニアリングなのです。
この記事では、そんな特徴量エンジニアリングに必要な考え方やテクニックを紹介していきます!
目次
特徴量エンジニアリングに必要な考え方

特徴量エンジニアリングの目的は予測精度を上げるコトであり様々なアプローチがあります。
・全く新しい特徴量を追加する
・特徴量の集計方法を変える
・特徴量を変換する
・既存の特徴量を組み合わせて新たな特徴量を作り出す
・サンプルを操作する
などなど。
特徴量エンジニアリングには、ドメイン知識が非常に重要。
ドメイン知識とは、そのデータセットの領域に関係する知識のこと。
業界や職種によってドメインは区切られます。
BtoBとBtoCの商材ではもちろん特徴量の勘所は違いますし、BtoCでも車を扱う会社と日用品を扱う会社で違うというのは理解できるでしょう。
そのドメイン特有の考え方や重要指標が存在するので、それをしっかり理解して特徴量として追加したり加工したりすることがモデルの精度を高める上で非常に重要になってきます。
ただ、いくらドメイン知識があっても特徴量エンジニアリングのテクニックを知らないと筋の良いモデルは作り出せません。
いくつかある特徴量エンジニアリングについて解説していきます!
特徴量エンジニアリングのテクニック

ここでは、既存のデータを加工したり、既存の特徴量を組み合わせて新たな特徴量を作り出すテクニックを紹介します。
Kaggleなどのデータコンペでは全員に決まったデータが与えられるので、与えられたデータの中でどのような特徴量を生み出すかが肝になりますが、実務ではそもそもデータを計測するところから設計したり、他のテーブルデータから必要なデータを引っ張ってきたりすることも多いです。
特徴量エンジニアリングのテクニックを知っておくのは大事ですが、近視眼的になるのではなく広い視野で特徴量を見つけられるようにしておきましょう!
one-hot-encoding
one-hot-encodingは、統計学の世界で言うダミー変数化とほぼ同義で多クラスのカテゴリーを01ラベルで表す特徴量として展開していきます。
例えば以下のようなケースだと、
カテゴリ |
A |
B |
A |
C |
・・・ |
A |
B |
one-hot-encodingをすることにより以下のようなデータ構造に変換されます。
A | B |
1 | 0 |
0 | 1 |
1 | 0 |
0 | 0 |
1 | 0 |
0 | 1 |
この時、Aが0でBが0であればCということが明示的に分かるのでCのカラムは必要ありません。
逆にCのカラムを追加してしまうと変数同士の重複が起き「多重共線性」という問題が生じ推定精度が不安定になります。
Pythonでは、pandasのget_dummiesを使って簡単にone-hot-encoding化することができます。
XgboostやLightgbmなど決定木モデルの場合は、one-hot-encoding化を行わずそのままカテゴリでデータをインプットしても問題ないのですが、それ以外の学習器を使用する場合はone-hot-encoding化が必要です。
Feature hashing
one-hot-encodingでは、10の水準を持つカテゴリの場合、新たな特徴量が9つ生成されることになります。
つまり水準が多ければ多いほど特徴量が増え高次元になっていき計算が不安定になる可能性が考えられます。
そこで行われるのがこのFeature hashingです。
Feature hashingでは、複数の水準を1つのカラムで表現します。
例えば
カテゴリ |
A |
B |
D |
C |
・・・ |
A |
B |
の場合Feature hashingを使うと例えば以下のようになります。
AかつC | B |
1 | 0 |
0 | 1 |
0 | 0 |
1 | 0 |
1 | 0 |
0 | 1 |
これにより特徴量が増えすぎるのを防ぐことができます。
Frequency encoding
各水準の出現回数でカテゴリ変数を置き換えます。
例えば以下のような特徴量は、
カテゴリ |
A |
A |
C |
C |
A |
A |
B |
は以下のように変換できます。
カテゴリ |
4 |
4 |
2 |
2 |
4 |
4 |
1 |
target encoding
目的変数の情報を使ってカテゴリ変数を置き換える方法です。
カテゴリ | 目的変数 |
A | 1 |
A | 1 |
C | 0 |
C | 1 |
A | 0 |
A | 1 |
B | 0 |
この場合、それぞれの平均を取って以下のように変換できます。
A=(目的変数の総計が3)/4=0.75
B=(目的変数の総計が0)/1=0
B=(目的変数の総計が1)/2=0.5
カテゴリ | 目的変数 |
0.75 | 1 |
0.75 | 1 |
0.5 | 0 |
0.5 | 1 |
0.75 | 0 |
0.75 | 1 |
0 | 0 |
ただ、この場合目的変数の情報を特徴量に用いることになるので、リーク(知らないはずのデータを情報として取り入れてしまい予測精度の悪化を招くこと)に気を付けなくてはいけません。
以下の書籍に詳しいので詳しく知りたい方は、ぜひチェックしてみてください!
クラスタリングで特徴量作成
実は大学時代に研究でクラスタリングで特徴量を生成して精度を高めるという研究をしていたことがあるのですが、この方法も精度を高めるのに有効です。

複数ある説明変数をクラスタリングにかけて、新たなカテゴリを生成しそれを新たな説明変数として加えることで精度が上がるコトがあります。
クラスタ中心からの距離を特徴量とするテクニックもデータセットによっては有効になります。
主成分分析で次元圧縮
主成分分析とは、複数の特徴量を圧縮して少なくする手法です。

精度を追い求める場面ではそれほど使われることはありませんが、あまりにも特徴量の多い高次元データには有用です。
既存の特徴量から演算で特徴量作成
複数の変数の特徴量を組み合わせて新たな特徴量を生成する方法も有用の時があります。
例えば、顧客別の購入金額と購入件数があった時にそれらを除算して購入単価という変数を作ることで精度が上がる場合があります。
モデル構築時の過程で、このような効果も加味してくれますが、明示的に特徴量を生成した方がよいことが多いです。
欠損値の処理
欠損値(欠測値)の処理も重要な特徴量エンジニアリングの1つです。

Xgboostなどの決定木モデルでは、欠損値を含んでいてもそのまま学習データとしてインプットが可能なので特別な処理をせずそのまま使うことが多いですが、他の手法を使用する場合は欠損値の処理が必要です。
欠損値の処理には、
・代表的な値で補完する
・欠損値そのものを目的変数にして予測補完する
・欠損値が生じていることことフラグ立てしてカテゴリ変数化する(non-encoding)
などがあります。
ちなみい欠損値が生じる原因によってタイプが分かれており、
によって対応が変わってきます。

スタッキング
機械学習における定番手法であるアンサンブル学習。
データコンペティションのKaggleでもよく使われるXgboostやLightgbmもアンサンブル学習を使っています。
そんなアンサンブル学習の1つであるスタッキング!
スタッキングはアンサンブル学習ですが、新たな特徴量を作る方法でもあります。
僕自身普段スタッキングは使わないのですが、簡単に説明します。
Step1:いくつかのFold(グループ)にデータを分けて、それぞれを各モデルで予測する(いわゆるクロスバリデーションを色んなモデルでやる)
Step2:それぞれの予測値を新たな特徴量とする
Step3:何回か繰り返して最終アウトプット算出
アンサンブル学習のついては以下の記事でまとめています!

アンダーサンプリング
実データを扱っていると度々現れるのが不均衡データ!
不均衡データとはデータの比率に偏りがあるもの。
金融取引の不正利用データやメールのCVデータなど、母数が大量にありその中で該当する正例が非常に少ないケースはよくあります。
アンダーサンプリングは、そのような不均衡データに対して「少数派のデータ群に合わせて多数派のデータ群を削除する」という方法です。
オーバーサンプリング
オーバーサンプリングはアンダーサンプリングとは違い、逆に「少数派のデータを多数派に合わせて増やす」という方法です。
オーバーサンプリングの中で特によく使われる手法がSMOTEと呼ばれるものです。
SMOTEは、Synthetic Minority Over-sampling TEchniqueの略でK近傍法のアルゴリズムを利用して少数派のサンプルを増やしていきます。
不均衡データに関しては以下の記事でまとめています!

特徴量エンジニアリングを学ぶのにオススメな本
特徴量エンジニアリングを学ぶのにオススメな本がこれ!
Kaggleで使用される特徴量エンジニアリングについて分かりやすく解説してくれます。
Kaggleでの具体例を出しながら、どのようなデータでどのようなテクニックが有効だったのか非常に分かりやすく学べるのでめちゃくちゃオススメです!
Kaggleはやらない人でも、実務で役立つエッセンスが詰まっていますよー!
ぜひ手に取って読んでみましょう!
特徴量エンジニアリング まとめ
特徴量エンジニアリングについて解説してきました!
機械学習の手法自体は誰でも簡単に実装できますが、同じ機械学習手法でもそこにどのような特徴量をインプットするかで得られる結果は全く違います。
それゆえ、良いモデルを作るために特徴量エンジニアリングがめちゃくちゃ大事なんです!
最後にここで紹介してきた特徴量エンジニアリングのテクニックを再度まとめておきましょう!
機械学習手法については以下の記事で詳しく解説しています!
