「特徴量エンジニアリング」でAIの性能を上げよう
機械学習を用いて「何かを予測するAI」を作成する時、その「予測精度」は非常に重要になります。
同じAIでも、70%当てるものと90%当てるものでは、その価値は大違いでしょう。
たとえ目的が同じであっても、「AIの作り方」によってその精度は変わってきます。
それはつまり、人間が意識的にAIの性能を上げていく事ができるということを意味します。
このAIの精度を上げていくための術のひとつが「特徴量エンジニアリング(Feature Engineering)」と呼ばれる技術となります。
本記事ではそんな特徴量エンジニアリングの基本的な考え方・やり方についてご紹介します。
特徴量エンジニアリングとは
何かを予測させるAIを作る時、機械学習などを用いて「学習モデル」を構築することになります。
これは即ち、データをインプットして、その中に潜むルールやパターンを機械に頑張って見つけ出してもらう作業です。
・・・ここで、ルールを発見する作業は機械がやってくれるわけですが、その元データを入力するのはあくまでも人間な訳です。
手元にあるデータをそのまま突っ込んでも何かしらの学習モデルは構築してくれますが、より「機械が理解しやすい形」にデータを加工してからデータを突っ込めば、より効率的にルールを発見してくれるようになります。
「特徴量エンジニアリング」とはまさにこれで、人間がインプットデータを「AIがルールを見つけやすい形」に加工してあげる作業となります。
特徴量エンジニアリングとは即ち「いかにAIの気持ちになれるか」・・・という技術とも言えるでしょうか。
ちなみに、特徴量エンジニアリングはいわゆる「教師あり学習」の機械学習全般に適用できるものなので、あまり「AI」には括られない重回帰分析などにも使えます。
重回帰分析でも「当てはまりの良い式」を作れた方が精度の高い意思決定に繋げることができますので、特徴量エンジニアリングは重要です。
データクレンジングとの違い
同様の作業に「データクレンジング」があります。
これはデータの欠損値や入力ミスなどを補完して上げる作業で、こちらもインプットデータを修正してあげる作業です。
正式な定義があるわけではありませんが、データクレンジングはあくまで「人間にとってデータを綺麗にする」作業です。
ただ、それが機械にとっても分かりやすい形になっていることも多く、これはこれで大事な作業です。
逆に、特徴量エンジニアリングは「機械にとってデータを綺麗にする」作業です。
こちらは人間が見たらむしろよく分からないデータ形式になる事もしばしばあります。
そういう意味でも、「AIの気持ちになって考える」事ができないと上手くいかないでしょう。
と、このように両者はその目的が違ってきます。
ですが、行う作業としては被る部分もあるため、きっちりとこの両者を線引きするのは難しいかもしれません。
特徴量エンジニアリングの方法
それでは、具体的な方法の説明に移ります。
先にお断りしておくと、データの形式や分析の目的によって適用できる手法・適用すべき手法は異なってきます。
一律で以下の方法論を当てはめれば良いという話ではない事をご了承ください。
以下のような様々な「やり方」がある事を理解して、場合場合に応じて適切な方法を選ぶという姿勢を持っていただければと思います。
それでは、今回は例題として以下の「アイスクリームの売上データ」を例に取ってご説明します。
アイスクリームの売上(目的変数)には一体どの項目(説明変数)が深く関わるのかを知りたい。
もしくは明日以降はどれくらい売れそうかを推測したい経営者の目線になって考えてみてください。
それでは、このデータをどんどん加工していきます。
項目を減らす
まずはシンプルな所で、説明変数を間引きしてあげる作業です。
「別に、この項目は関係なさそうだな」と初めから分かるところもあるかと思います。
これは人間の感覚が必要な部分なので、機械にはできません。
確かに、ほとんどの機械学習のアルゴリズムは、説明変数がそれぞれ重要なものか、重要でないものかを自分で判断してくれます。
しかし、AIにむたみやたらにデータを投入すると「無駄な探索」をさせてしまうことにもなります。
また、投入するデータ量が少ないと、無駄な項目との間に偶然に関係性が生まれてしまう場合もあります。
初めから不要そう(=関係なさそう)な説明変数は人間が抜いておいてあげれば、AIは残された説明変数を深く調査する事ができます。
さて、先ほどのアイスクリームの売上の例を見てみましょう。
項目は「日付、天気、降水量、商品数、SNSシェア数、為替レート」です。
天候関連はアイスクリームの売上に関わりそうですし、日付による差や商品数による差も影響しそうです。
SNSシェアがお店の宣伝になっていれば売上に関わってくるかもしれません。
・・・が、為替レートはどうでしょう。もちろん、何か遠巻きに関わってくる可能性は無きにしも非ずですが、アイスクリームの売上個数に直接影響があるとは考えにくいです。
今回はこの項目は削ってみることにします。
・・・ただし、人間には見つけられない関係性をAIが発見してくれる可能性もあるので、項目はむやみに削るものではありません。
悩むくらいの説明変数は残しておいた方が良いと思います。
なので、為替レートもとりあえず残しておく方針でも、それはそれで悪くない気はします。
一度学習モデルを作ってその結果を見てから、それで「やっぱりこの項目は要らないや」となる場合もあります。
そういった手順で考えるのも良いでしょう。
項目を増やす
減らす手があるならば増やす手もあります。
例えば、「もしかして、気温によっても売上は変わるのでは?」ということが想定されるなら、そのデータも欲しい所です。
何でもかんでも欲しいデータをゲットできる訳ではありませんが、気温なら気象庁のホームページなどから取ってくる事ができます。
それでは、気温のデータを持ってきて、列を追加してみます。
カテゴリ変数の変換
カテゴリ変数とは、データが数値ではなく、「性別(男性/女性)」「年代(20代/30代/…)」などのようにカテゴリとなっている項目を言います。
この例で言えば、「天気」の列がそれに当たります。
確かに、晴れか雨かで売上個数には影響がありそうです。
しかし、見てみると「快晴」と「晴れ」、また「霧雨」と「雨」・・・といった似通った天気が散見されます。
晴れか雨かで売上は違っても、晴れか快晴かで売上がそこまで違うとは考えづらいです。
しかし、機械にとっては「快晴」も「晴れ」も「雨」もただ別物であるという事しか分かりません。
それならば、いたずらにカテゴリを細分化するより、近いものは同じと見なしてもらった方が良さそうです。
では、「快晴」「晴れ」は「晴れ」。「霧雨」「雨」「雷」は「雨」とまとめてしまいましょう。
すると、以下のようになります。
あくまでこれは一例であり、「雨が降っているか、それ以外か」の2値にしてしまうなど、切り分け方も色々とあります。
数値の変換
続いては、数値の列を見ていきます。
「SNSシェア数」に注目してみると、普段は1桁くらいで推移しているのに、急に大きな数値になっている所があります。
いわゆる「バズった」という事でしょうか。
こういった、「基本的には少ない数値で推移するが、ちょこちょこと突然大きな値が出てくる」ようなデータは「対数変換」を行うと数値のばらつきが適切になる場合があります。(「裾の長い分布」「ロングテールな分布」などと呼ばれます。)
ということで、今回は対数変換してみます。
すると、以下のようになりました。
数値の変換方法には本当に様々あります。
単純に絶対値を取ったり、2乗したり、四捨五入したりという対処が有効な場合もありますし、どんなデータでも平均値0、標準偏差1に変えてしまう「標準化」、変数の取る値を強制的に一定の範囲内に押し込めてしまう「Min-Maxスケーリング」。
あるいは、数値の大きい順にランキング化してしまったり、「10未満/10以上」のようにカテゴリ変数にしてしまう手もあります。
無論、無理に変換する必要はありません。
「〜〜〜という理由から、・・・の変換をする」と明確な理由がある場合にのみ対応しましょう。
もともと決定木分析は「値がX以上」と「X未満」という条件で2分類していくだけなので、いくら数値変換しても値の大小関係が変わらないならば、このXが変わるだけで作成される決定木には影響がないからです。
日時情報の変換
続いては日時に注目してみます。
日時には非常に重要な要素が多く、これを活用しないのは非常に勿体ないと思います。
というのも、「日時」には「季節」「月初/月末」「平日/休日(祝日)」「午前/午後」「朝/昼/晩」などなど、たくさんのカテゴリ情報が取れる項目だからです。
今回の例には時間情報はなく、ずっと5月なので「季節」の列を作っても意味はありませんが、休日情報は入れることができそうです。
確かに平日と休日で売上は違うでしょう。
・・・ということで、「日付」列から「休日フラグ」の列を生成してみます。
祝日も「休日」とします。
どんどんデータの様相が変わってきましたね。
時間をずらす
日時情報を活かした特徴量エンジニアリングにはもうひとつ視点あります。
売上に影響するまでに「タイムラグ」が発生する場合があります。
例えば、SNSシェア数。バズった当日に売上が上がるより、売上に直結するのはその翌日やその週の土日だったりします。
では、「当日のSNSシェア数」よりも「前日のSNSシェア数」の方が売上に影響を及ぼすと考えてみましょう。
すると、「SNSシェア数」は下に1つずつずらすと良さそうです。
この場合、5/1のデータは推測に使えなくなりますが、「1つくらい学習データが減っても仕方ない」として省くか、どうしても使いたければ平均値を入れておく、など適宜対処することになります。
交互作用特徴量の作成
さて、ここからは少しテクニカルな話になってきます。
2つ以上の事象が絡み合った時に、売上に影響を及ぼす場合があります。
今回の例で言えば、晴れていても寒ければアイスは売れないし、暑くても土砂降りだと売れません。
「晴れていて、かつ気温が高い日」に圧倒的にアイスクリームの売上が上がるという可能性は存分に考えられます。
このように複数の項目が絡み合った時に結果に繋がる、と想定される場合には「交互作用特徴量」の列を作ると良い場合があります。
・・・難しそうな単語ですが、これは単純に「2つの列を掛け算した列を作る」という事です。
ここは「降水量」という数字の列があるので、ここと「気温」の数字を掛け算した列を作ってみましょう。
が、注意が必要なのは、「降水量」は小さければ小さいほど売上が上がると見込まれる値です。
「気温」とは逆ですね。
晴れていて気温が高い日に数値が大きくなって欲しいので、「降水量」の大小関係を逆転させる必要があります。
符号反転などもありますが、降水量が0だと結果が全部0になってしまうので、今回は
(100-降水量)×気温としてみましょう。
ちなみに「天気」の列を作ったので、「晴れ」=1、その他=0と見なして「天気×気温」という相互作用特徴量を作る手もあるでしょう。
多重共線性の回避
これは非常に大切で、必ずチェックして欲しい点ですが、作業順序としては「分析直前」となるのでこの位置に書きました。
機械学習の特性上、説明変数同士に相関関係があると上手く学習ができません。
AIに気持ちになってみると、「あれ、この2つってどう違うの?どっちが重要なんだろう・・・?」となり、この2つの優位性が上手く計算できず、おかしな結果を出す場合があります。
初めから人間が「この2つはほとんど一緒の情報だから、片方あればいいや」としてデータ削ってあげるとAIは正しく学習しやすくなります。
例えば、「天気」と「降水量」などは関連する項目に思えます。
では、「天気」の方に一回どいてもらいましょう。
同様に、「降水量」「気温」は「(100-降水量)×気温」という新たな項目を生み出してくれたので、こちらも一度どいてもらいます。
このように人間が頭で考えて判断して削っていく方針もありますし、実際に相関係数を計算して、相関が高い項目のうち一方を取り除くという方向でも良いでしょう。
教師なし学習による新たな特徴量の生成
これはかなりレベルの高い内容になりますが、「今あるデータから新しい特徴量を作ってしまう」という技もあります。
Excelではやりづらいので例は提示しませんが、これが効果的に働く場合もあります。
このために使われるのが機械学習の中の「教師なし学習」で、特にクラスタリングや次元削減がよく使用されます。
特徴量エンジニアリング前後での結果比較
さて、色々とやってきましたが、今一度特徴量エンジニアリングの前後のデータを見比べてみましょう。
だいぶ違っていますね。
では、試しに「日付」以外の項目を使って重回帰分析した精度を比較してみます。
だいぶ性能が上がっているようです。
(この表の見方は重回帰分析の記事にて・・・)
今回は一気に色々と変更したので、「どの対応が効いたのか」は分かりません。
本記事はあくまで手法の紹介なのでその点を細かく掘り下げはしませんが、実際に行う時は一気に色々やらずに1つずつ対応して、その都度性能の変化を見ていく方が良いでしょう。
さいごに
以上が特徴量エンジニアリングの様々な技でした。
掘り下げていけばもっとたくさんの方法はありますが、その「基本的な方針」についてはおおよそ収められたかと思っています。
是非、これらの技を覚え、適切に適用し、より精度の高い分析やAI開発を行ってみてください。