データ解析

機械学習で重要な特徴量エンジニアリングとは?

特徴量エンジニアリング
ウマたん
ウマたん
当サイト【スタビジ】の本記事では、精度の高いモデルを構築する上で非常に重要な特徴量エンジニアリングについて簡単に解説していきます。特徴量エンジニアリングの流れやテクニックを知っているのと知っていないのとではたたき出すアウトプットの質が全く違うので必ず理解しておきましょう!

こんにちは!

消費財メーカーでデータサイエンティストをやっているウマたん(@statistics1012)です!

機械学習を使ってモデルを構築する上で、非常に重要なのが特徴量エンジニアリング。

特徴量とは、モデルにインプットする要素・変数のこと。

例えばお店の売上を予測するために気温や曜日のデータを使う場合、気温や曜日が特徴量になります。

統計学の世界では変数という言葉を使いますが、専ら機械学習界隈では特徴量と言いますね。

そんな特徴量を上手く作り出し精度を高めようとする取り組みが特徴量エンジニアリングなのです。

ロボたん
ロボたん
なんだか難しそうだなー!
ウマたん
ウマたん
難しくはないんだけど知っておいた方が良いテクニックもあるので注意が必要だ!

この記事では、そんな特徴量エンジニアリングに必要な考え方やテクニックを紹介していきます!

特徴量エンジニアリングに必要な考え方

メモ

特徴量エンジニアリングの目的は予測精度を上げるコトであり様々なアプローチがあります。

・全く新しい特徴量を追加する
・特徴量の集計方法を変える
・特徴量を変換する
・既存の特徴量を組み合わせて新たな特徴量を作り出す
・サンプルを操作する

などなど。

特徴量エンジニアリングには、ドメイン知識が非常に重要。

ドメイン知識とは、そのデータセットの領域に関係する知識のこと。

業界や職種によってドメインは区切られます。

BtoBとBtoCの商材ではもちろん特徴量の勘所は違いますし、BtoCでも車を扱う会社と日用品を扱う会社で違うというのは理解できるでしょう。

そのドメイン特有の考え方や重要指標が存在するので、それをしっかり理解して特徴量として追加したり加工したりすることがモデルの精度を高める上で非常に重要になってきます。

ただ、いくらドメイン知識があっても特徴量エンジニアリングのテクニックを知らないと筋の良いモデルは作り出せません。

いくつかある特徴量エンジニアリングについて解説していきます!

特徴量エンジニアリングのテクニック

PC

ここでは、既存のデータを加工したり、既存の特徴量を組み合わせて新たな特徴量を作り出すテクニックを紹介します。

Kaggleなどのデータコンペでは全員に決まったデータが与えられるので、与えられたデータの中でどのような特徴量を生み出すかが肝になりますが、実務ではそもそもデータを計測するところから設計したり、他のテーブルデータから必要なデータを引っ張ってきたりすることも多いです。

特徴量エンジニアリングのテクニックを知っておくのは大事ですが、近視眼的になるのではなく広い視野で特徴量を見つけられるようにしておきましょう!

one-hot-encoding

one-hot-encodingは、統計学の世界で言うダミー変数化とほぼ同義で多クラスのカテゴリーを01ラベルで表す特徴量として展開していきます。

例えば以下のようなケースだと、

カテゴリ
A
B
A
C
・・・
A
B

one-hot-encodingをすることにより以下のようなデータ構造に変換されます。

AB
10
01
10
00
10
01

この時、Aが0でBが0であればCということが明示的に分かるのでCのカラムは必要ありません。

逆にCのカラムを追加してしまうと変数同士の重複が起き「多重共線性」という問題が生じ推定精度が不安定になります。

Pythonでは、pandasのget_dummiesを使って簡単にone-hot-encoding化することができます。

XgboostLightgbmなど決定木モデルの場合は、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かつCB
10
01
00
10
10
01

これにより特徴量が増えすぎるのを防ぐことができます。

Frequency encoding

各水準の出現回数でカテゴリ変数を置き換えます。

例えば以下のような特徴量は、

カテゴリ
A
A
C
C
A
A
B

は以下のように変換できます。

カテゴリ
4
4
2
2
4
4
1

target encoding

目的変数の情報を使ってカテゴリ変数を置き換える方法です。

カテゴリ目的変数
A1
A1
C0
C1
A0
A1
B0

この場合、それぞれの平均を取って以下のように変換できます。

A=(目的変数の総計が3)/4=0.75
B=(目的変数の総計が0)/1=0
B=(目的変数の総計が1)/2=0.5

カテゴリ目的変数
0.751
0.751
0.50
0.51
0.750
0.751
00

ただ、この場合目的変数の情報を特徴量に用いることになるので、リーク(知らないはずのデータを情報として取り入れてしまい予測精度の悪化を招くこと)に気を付けなくてはいけません。

以下の書籍に詳しいので詳しく知りたい方は、ぜひチェックしてみてください!

created by Rinker
¥3,428
(2020/11/24 22:53:16時点 Amazon調べ-詳細)

クラスタリングで特徴量作成

実は大学時代に研究でクラスタリングで特徴量を生成して精度を高めるという研究をしていたことがあるのですが、この方法も精度を高めるのに有効です。

クラスター分析
クラスター分析とは?RとPythonでの実装方法を一緒に見ていこう!当サイト【スタビジ】の本記事では、クラスター分析についてまとめていきます。クラスター分析は教師なし学習の定番手法で、データの構造や傾向を把握するのに非常に役立ちます。クラスター分析を利用してデータを可視化してみましょう!...

複数ある説明変数をクラスタリングにかけて、新たなカテゴリを生成しそれを新たな説明変数として加えることで精度が上がるコトがあります。

クラスタ中心からの距離を特徴量とするテクニックもデータセットによっては有効になります。

主成分分析で次元圧縮

主成分分析とは、複数の特徴量を圧縮して少なくする手法です。

主成分分析
主成分分析とは?簡単な説明とPythonでの実装!当サイト【スタビジ】の本記事では、実務の基礎分析にて使われることの多い主成分分析について詳しく見ていきます。最後にはカンタンなPythonでの実装も載せていますのでぜひ参考にしてみてください!...

精度を追い求める場面ではそれほど使われることはありませんが、あまりにも特徴量の多い高次元データには有用です。

既存の特徴量から演算で特徴量作成

複数の変数の特徴量を組み合わせて新たな特徴量を生成する方法も有用の時があります。

例えば、顧客別の購入金額と購入件数があった時にそれらを除算して購入単価という変数を作ることで精度が上がる場合があります。

モデル構築時の過程で、このような効果も加味してくれますが、明示的に特徴量を生成した方がよいことが多いです。

欠損値の処理

欠損値(欠測値)の処理も重要な特徴量エンジニアリングの1つです。

欠損値

Xgboostなどの決定木モデルでは、欠損値を含んでいてもそのまま学習データとしてインプットが可能なので特別な処理をせずそのまま使うことが多いですが、他の手法を使用する場合は欠損値の処理が必要です。

欠損値の処理には、

・代表的な値で補完する
・欠損値そのものを目的変数にして予測補完する
・欠損値が生じていることことフラグ立てしてカテゴリ変数化する(non-encoding)

などがあります。

ちなみい欠損値が生じる原因によってタイプが分かれており、

・完全ランダムでは発生しているのか
・他の変数に起因して発生しているのか
・欠損値が生じている変数自身に起因して発生しているのか

によって対応が変わってきます。

欠損値
欠損値の発生パターンと補完方法!Pandasで確認・補完してみよう!当サイト【スタビジ】の本記事では、欠損があるデータの解析方法について説明していきます。欠損データ解析は非常に重要ですが知っておくべきことが多いので、まずは全体の概要と方法について理解してもらえたら嬉しいです。最後のパートではPandasで欠損値の補完をしていきますよ!...

スタッキング

機械学習における定番手法であるアンサンブル学習

データコンペティションのKaggleでもよく使われるXgboostLightgbmもアンサンブル学習を使っています。

そんなアンサンブル学習の1つであるスタッキング!

スタッキングはアンサンブル学習ですが、新たな特徴量を作る方法でもあります。

僕自身普段スタッキングは使わないのですが、簡単に説明します。

Step1:いくつかのFold(グループ)にデータを分けて、それぞれを各モデルで予測する(いわゆるクロスバリデーションを色んなモデルでやる)

Step2:それぞれの予測値を新たな特徴量とする

Step3:何回か繰り返して最終アウトプット算出

アンサンブル学習のついては以下の記事でまとめています!

アンサンブル学習とは?バギングとブースティングとスタッキングの違い当サイト【スタビジ】の本記事では、アンサンブル学習についてまとめていきます!アンサンブル学習とは機械学習を学ぶ上で非常に重要な考えであり、いくつかのモデルを組み合わせて汎化能力を上げるもの。有名なランダムフォレストやXgboostなどもアンサンブル学習によって生み出されているんです!...

アンダーサンプリング

実データを扱っていると度々現れるのが不均衡データ!

不均衡データとはデータの比率に偏りがあるもの。

金融取引の不正利用データやメールのCVデータなど、母数が大量にありその中で該当する正例が非常に少ないケースはよくあります。

アンダーサンプリングは、そのような不均衡データに対して「少数派のデータ群に合わせて多数派のデータ群を削除する」という方法です。

オーバーサンプリング

オーバーサンプリングはアンダーサンプリングとは違い、逆に「少数派のデータを多数派に合わせて増やす」という方法です。

オーバーサンプリングの中で特によく使われる手法がSMOTEと呼ばれるものです。

SMOTEは、Synthetic Minority Over-sampling TEchniqueの略でK近傍法のアルゴリズムを利用して少数派のサンプルを増やしていきます。

不均衡データに関しては以下の記事でまとめています!

smote
不均衡データの扱い方と評価指標!SmoteをPythonで実装して検証していく!当サイト【スタビジ】の本記事では、実データによくありがちな不均衡データの特徴とどのように分析していったら良いかについてまとめてみました!最終的にSMOTEというオーバーサンプリング手法を使ってPythonで解析していきます!...

特徴量エンジニアリングを学ぶのにオススメな本

特徴量エンジニアリングを学ぶのにオススメな本がこれ!

created by Rinker
¥3,428
(2020/11/24 22:53:16時点 Amazon調べ-詳細)

Kaggleで使用される特徴量エンジニアリングについて分かりやすく解説してくれます。

Kaggleでの具体例を出しながら、どのようなデータでどのようなテクニックが有効だったのか非常に分かりやすく学べるのでめちゃくちゃオススメです!

Kaggleはやらない人でも、実務で役立つエッセンスが詰まっていますよー!

ぜひ手に取って読んでみましょう!

特徴量エンジニアリング まとめ

特徴量エンジニアリングについて解説してきました!

機械学習の手法自体は誰でも簡単に実装できますが、同じ機械学習手法でもそこにどのような特徴量をインプットするかで得られる結果は全く違います。

それゆえ、良いモデルを作るために特徴量エンジニアリングがめちゃくちゃ大事なんです!

ロボたん
ロボたん
なるほどー実際に色んな特徴量エンジニアリング手法を試してみたくなったよ!
ウマたん
ウマたん
ぜひ、適切な特徴量を作ってモデルの精度を上げていこう!

最後にここで紹介してきた特徴量エンジニアリングのテクニックを再度まとめておきましょう!

機械学習手法については以下の記事で詳しく解説しています!

機械学習
機械学習入門に必要な知識と勉強方法をPythonとRの実装と一緒に見ていこう!当サイト【スタビジ】の本記事では、入門者向けに機械学習についてカンタンにまとめていきます。最終的にはどのように機械学習を学んでいけばよいかも見ていきます。細かい手法の実装もPython/Rを用いておこなっていくので適宜参考にしてみてください。...
Pythonを初学者が最短で習得する勉強法

Pythonを使うと様々なことができます。しかしどんなことをやりたいかという明確な目的がないと勉強は捗りません。

Pythonを習得するためのロードマップをまとめましたのでぜひチェックしてみてくださいね!