特徴量エンジニアリング#
AutoGluon において、どのような特徴量エンジニアリングが行われているかを紹介する。逆にいうと、ここに記載されていないエンジニアリングが必要な場合は各自で事前に行う必要があるということになる。
See also
[参照] 本節は、AutoGluon Tabular - Feature Engineering をベースにしている。
カラムの型の特定#
まず初めにインプットテーブルのそれぞれのカラムの型の特定を行う。そして型ごとに分離して最適な特徴量エンジニアリングを行っていくことになる。
Feature Type |
Example Values |
---|---|
boolean |
A, B |
numerical |
1.3, 2.0, -1.6 |
categorical |
Red, Blue, Yellow |
datetime |
1/31/2021, Mar-31 |
text |
Mary had a little lamb |
上のテーブルは、カラムの値に応じて型を特定してくれている例となっている。それぞれの型の特定ルールは以下になる。
Boolean Columns#
カラム内に2種類の値しか存在しない場合、Boolean
とみなされる。
Numeric Columns#
カラムの多くの値が float または int として識別されると Numeric
とみなされる。現在のところ、 Numeric
カラムがカテゴリカルであるかどうかのテストは行わないため、Categorical
として扱いたい場合には各自で前処理が必要になる。
Categorical columns#
Categorical
カラムは、後述する Text
以外の一般的な文字列を持つカラムが該当する。ただ、 Categorical
と扱われるものの中には、連続値(Numerical
)として扱った方が良いパフォーマンスが出る場合があり、その場合は各自で前処理が必要になる。
Text columns#
まず、ほとんどの行がユニークな記述であることをチェックする。ユニークであり、かつほとんどの行で複数の別々の単語が検出された場合、その行は Text
カラムと識別される。
Datetime columns#
Datetime
カラムは、Pandasの datetime に変換しようとすることで検出される。Pandas は幅広い datetime フォーマットを検出してくれる。カラム内の多くの値が正常に変換された場合、それらは datetime カラムとなる。現在のところ、純粋な数値(例えば 20210530)と思われる datetime は正しく検出されない。また NaN 値はカラムの平均値に設定される。
自動的適用される特徴量エンジニアリング#
特定されたカラムの型ごとに、以下の特両々エンジニアリングが行われる。
Numerical Columns#
現在、Numerical カラムに対する特徴量エンジニアリングは行っていない。
Categorical Columns#
多くのモデルは Categorical
カラムの値を整数として符号化する必要があるため、各カテゴリ値は単調増加する整数にマッピングされる。
Text Columns#
すべてのテキスト行を連結した上で N-gram(N文字単位の文字列片)を抽出し(デフォルトでは単なる文字列片ではなく個々の単語に分割してくれる)、各単語ごとに1つのカラムを追加する。これらの列はそのテキスト行がその単語を何個含んでいるかの数が入る(含んでいなければ0)。
加えて、単語数、文字数、大文字の割合など、いくつかの付加的な数値特徴が計算されて付与される。
Datetime Columns#
Datetime
として認識されたカラムは、いくつかの特徴に変換される:
timestamp として nanoseconds (second * 1,000,000,000) までの数値の値に変換する。
[年、月、日、曜日] にそれぞれ分解し、これらも特徴量として保持しておく。
Important
欠損値、無効な値、時間の意味で範囲外となる値は、すべての有効な値に基づく平均値に変換されることになる。
Example#
以下の様な値を持った A-E 列カラムに対して、AutoGluon による特徴量エンジニアリングが行われたとする。
A |
B |
C |
D |
E |
---|---|---|---|---|
-0.545774 |
0 |
2000-01-01 |
y |
ghi ef ghi ghi |
-0.468674 |
0 |
2000-01-02 |
x |
ghi d d jkl |
1.76796 |
0 |
1999-12-31 |
v |
ghi jkl jkl ef |
-0.118771 |
1 |
2000-01-01 |
y |
jkl ef d ghi |
0.630196 |
0 |
1999-12-31 |
w |
abc ef ghi ef |
… |
.. |
… |
.. |
… |
-1.182318 |
-1 |
2000-01-01 |
v |
abc ef d jkl |
0.562761 |
0 |
2000-01-01 |
v |
jkl abc ef ghi |
-0.79727 |
0 |
2000-01-01 |
w |
jkl jkl d ef |
0.502741 |
0 |
1999-12-31 |
y |
jkl ghi d abc |
2.056356 |
0 |
1999-12-30 |
w |
ef d abc d |
この時、結果は以下のようになる。
A |
B |
D |
E |
C |
C.year |
C.month |
C.day |
C.dayofweek |
E.char_count |
E.symbol_ratio. |
nlp.abc |
nlp.ef |
nlp.ghi |
nlp.jkl |
nlp.total |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
-0.545774 |
0 |
3 |
NaN |
9.46685E+17 |
2000 |
1 |
1 |
5 |
5 |
1 |
0 |
1 |
3 |
0 |
2 |
-0.468674 |
0 |
2 |
NaN |
9.46771E+17 |
2000 |
1 |
2 |
6 |
2 |
4 |
0 |
0 |
1 |
1 |
2 |
1.76796 |
0 |
0 |
NaN |
9.46598E+17 |
1999 |
12 |
31 |
4 |
5 |
1 |
0 |
1 |
1 |
2 |
3 |
-0.118771 |
1 |
3 |
NaN |
9.46685E+17 |
2000 |
1 |
1 |
5 |
3 |
3 |
0 |
1 |
1 |
1 |
3 |
0.630196 |
0 |
1 |
NaN |
9.46598E+17 |
1999 |
12 |
31 |
4 |
4 |
2 |
1 |
2 |
1 |
0 |
3 |
… |
… |
… |
… |
… |
… |
… |
… |
… |
… |
… |
… |
… |
… |
… |
… |
-1.182318 |
-1 |
0 |
0 |
9.46685E+17 |
2000 |
1 |
1 |
5 |
3 |
3 |
1 |
1 |
0 |
1 |
3 |
0.562761 |
0 |
0 |
8 |
9.46685E+17 |
2000 |
1 |
1 |
5 |
5 |
1 |
1 |
1 |
1 |
1 |
4 |
-0.79727 |
0 |
1 |
NaN |
9.46685E+17 |
2000 |
1 |
1 |
5 |
3 |
3 |
0 |
1 |
0 |
2 |
2 |
0.502741 |
0 |
3 |
NaN |
9.46598E+17 |
1999 |
12 |
31 |
4 |
4 |
2 |
1 |
0 |
1 |
1 |
3 |
2.056356 |
0 |
1 |
NaN |
9.46512E+17 |
1999 |
12 |
30 |
3 |
1 |
5 |
1 |
1 |
0 |
0 |
2 |
Numerical
(float, integer) カラムである ‘A’ カラムと ‘B’ カラムは何も変わっていない。Datetime
カラムである ‘C’ はナノ秒の timestamp に変換されたと同時に、[year, month, day, dayofweek] カラムが拡張されて付与されている。Categorical
である ‘D’ は数値に 1:1 にマッピングされている。(多くのモデルはNumerical
カラムしか受け付けないため。)自由記述の
Text
カラムはすべてのテキストを連結した上で単語に分解し、nlp.abc
カラムのように、そのテキスト行におけるその単語(abc)の登場頻度が入る多数のカラムが付与されている。加えて、char_count
やnlp.total
のようなサマリ情報を持ったカラムが付与されていることがわかる。
日本語テキストにおける前処理の必要性#
前述の、Text
カラムにおける N-gram は space-separated のテキストを前提にしているため、日本語のテキストにはうまく対応できていないことになる。幸い、TD においては Hivemall tokenizer functions が SQL エディタで Hive を選択することで使用できる(Hivemall がサポートされている)ため、こちらにて前処理したデータを用いるようにしよう。
tokenize_ja
または tokenize_ja_neologd
関数の出力は配列型となるため、concat_ws にてスペース区切りの文字列に結合することを忘れないように。以下が例である。
tokenize_ja
関数は Kuromoji 辞書を用いるのに対し、tokenize_ja_neologd
関数は NEologd 辞書を用いている。ウェブ上の多くのリソースから抽出された新しい語彙を含む、MeCabのためのカスタマイズされたシステム辞書となっている。
SELECT CONCAT_WS(' ', TOKENIZE_JA('彼女はペンパイナッポーアッポーペンと恋ダンスを踊った。'))
-- 彼女 ペンパイナッポーアッポーペン 恋 ダンス 踊る
SELECT CONCAT_WS(' ', TOKENIZE_JA_NEOLOGD('彼女はペンパイナッポーアッポーペンと恋ダンスを踊った。'))
-- 彼女 ペンパイナッポーアッポーペン 恋ダンス 踊る
Missing Value Handling#
欠損値の扱いはカラムの型によって異なってくる。以下の例を通して説明していく。
A |
B |
C |
D |
E |
---|---|---|---|---|
NaN |
NaN |
NaN |
NaN |
NaN |
-0.468674 |
0 |
2000-01-02 |
x |
ghi d d jkl |
1.76796 |
0 |
1999-12-31 |
v |
ghi jkl jkl ef |
-0.118771 |
1 |
2000-01-01 |
y |
jkl ef d ghi |
0.630196 |
0 |
1999-12-31 |
w |
abc ef ghi ef |
すべてのカラムにおいて NaN である行が存在した時、特徴量エンジニアリングによってどう対処されるかを確認してみよう。欠損値処理された結果は以下のようになる。
A |
B |
D |
E |
C |
C.year |
C.month |
C.day |
C.dayofweek |
E.char_count |
E.word_count |
E.symbol_ratio. |
nlp.abc |
nlp.ef |
nlp.ghi |
nlp.jkl |
nlp.total |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
NaN |
NaN |
NaN |
NaN |
946687418181818240 |
2000 |
1 |
1 |
5 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
-0.468674 |
1 |
2 |
NaN |
9.46771E+17 |
2000 |
1 |
2 |
6 |
3 |
1 |
5 |
0 |
0 |
1 |
1 |
2 |
1.76796 |
1 |
0 |
NaN |
9.46598E+17 |
1999 |
12 |
31 |
4 |
6 |
1 |
2 |
0 |
1 |
1 |
2 |
3 |
-0.118771 |
2 |
3 |
NaN |
9.46685E+17 |
2000 |
1 |
1 |
5 |
4 |
1 |
4 |
0 |
1 |
1 |
1 |
3 |
0.630196 |
1 |
1 |
NaN |
9.46598E+17 |
1999 |
12 |
31 |
4 |
5 |
1 |
3 |
1 |
2 |
1 |
0 |
3 |
… |
… |
… |
… |
… |
… |
… |
… |
… |
… |
… |
… |
… |
… |
… |
… |
… |
-1.182318 |
0 |
0 |
0 |
9.46685E+17 |
2000 |
1 |
1 |
5 |
4 |
1 |
4 |
1 |
1 |
0 |
1 |
3 |
0.562761 |
1 |
0 |
8 |
9.46685E+17 |
2000 |
1 |
1 |
5 |
6 |
1 |
2 |
1 |
1 |
1 |
1 |
4 |
-0.79727 |
1 |
1 |
NaN |
9.46685E+17 |
2000 |
1 |
1 |
5 |
4 |
1 |
4 |
0 |
1 |
0 |
2 |
2 |
0.502741 |
1 |
3 |
NaN |
9.46598E+17 |
1999 |
12 |
31 |
4 |
5 |
1 |
3 |
1 |
0 |
1 |
1 |
3 |
2.056356 |
1 |
1 |
NaN |
9.46512E+17 |
1999 |
12 |
30 |
3 |
2 |
1 |
6 |
1 |
1 |
0 |
0 |
2 |
Numerical
およびCategorical
カラムにおいてはそのまま NaN として扱われている。Datetime
カラムは、有効な値による平均値が変わりに入ることになる。Text
カラムは、すべての単語の登場頻度が 0 となる形で扱われる。