u++の備忘録

小数点以下を取り出す特徴量エンジニアリングの解釈と実装

Couseraの「How to Win a Data Science Competition: Learn from Top Kagglers」*1などで紹介されている特徴量エンジニアリングのアイディアの一つとして「数値データの小数点以下を取り出す」という技法があります。

本記事では簡単な解釈を述べ、Pythonによる実装も紹介します。「kaggle その2 Advent Calendar 2019」の8日目の記事です*2

数値データの小数点以下を取り出す

小数点以下を含む数値系のカラムに適用できる特徴量エンジニアリングです。次の図の「TransactionAmt」から「TransactionAmtDecimalPoint」を取り出すような処理を意図しています。

f:id:upura:20191204170200p:plain

解釈

Couseraの動画*3では「人間の認知やコンピュータとの違いを表現できる」といった説明がなされています。

例えば、価格の場合「$3.00」と「$2.98」だと、後者の方がお買い得だと感じる人も多いでしょう。人間とコンピュータとの違いで言うと、動画ではオークションやSNSの事例が出ています。オークションでは人間は切りの良い数字を使いやすいがコンピュータはそうではない、SNSでは厳密に1秒ごとに記事を読むのは人間ではなくbotである、などという解釈です。

動画で登場しなかった例で言うと、KaggleのTitanicコンペでも小数点以下を含む数値が登場します*4。年齢が推定値の場合など、「Age」は小数点以下を含むようです。このようなデータの仕様を表現する目的で、小数点以下を取り出す特徴量エンジニアリングが使える場合もあると思います。

age: Age is fractional if less than 1. If the age is estimated, is it in the form of xx.5

その他に「Statoil/C-CORE Iceberg Classifier Challenge」コンペ*5でも類似の事例がありました*6*7

主催者側が自動生成によってデータを水増し(data augmentation)をしていたのですが、各画像が水増しされて生み出されたデータかどうか、入射角の数値の小数点以下の桁数を確認すれば判別できるという情報でした。

実装

Pythonでの実装は、標準ライブラリのmathに含まれるmodf()*8*9を利用するのが手軽だと思います。

train_transaction['TransactionAmtDecimalPoint'] = [math.modf(v)[0] for v in train_transaction['TransactionAmt']]

一連の処理の流れは、KaggleのNotebook*10で公開しています。

おわりに

本記事では「数値データの小数点以下を取り出す」という特徴量エンジニアリングの簡単な解釈を述べ、Pythonによる実装も紹介しました。