機械学習のための特徴量エンジニアリング: ノート2

以下の本を読みます。キャラクターは架空のものです。解釈の誤りは筆者に帰属します。お気付きの点がありましたらコメント等でご指摘いただけますと幸いです。

機械学習のための特徴量エンジニアリング ―その原理とPythonによる実践 (オライリー・ジャパン)

機械学習のための特徴量エンジニアリング ―その原理とPythonによる実践 (オライリー・ジャパン)

正誤表リンク: https://www.oreilly.co.jp/books/9784873118680/
前回: ノート1 / 次回: まだ
f:id:cookie-box:20190101155733p:plain:w60

5章は「カテゴリ変数の取り扱い」というタイトルですね。以前参加した Kaggle のコンペティションでも「職業」というカテゴリ特徴があって「会社役員、会社員、…」といったカテゴリ値があった気がします。83ページの Effect コーディングというのは初めて聞きました。これ、サンフランシスコのデータの予測値が w_1 + b、ニューヨークのデータの予測値が - w_1 - w_2 + b、シアトルのデータの予測値が w_2 + b になるということですか。だから切片 b が全体平均になると。

f:id:cookie-box:20190101160814p:plain:w60

正確にいうと、「サンフランシスコのデータとニューヨークのデータとシアトルのデータを等しい重みで平均した値」だと思うな。元データ中にカテゴリ値の偏りがあったら b はそのデータ全体の平均ということにはならないはず。

f:id:cookie-box:20190101155733p:plain:w60

84ページの最下部の「参照カテゴリに対する各カテゴリの相対的な影響をエンコードすることは」という箇所を読んでイメージが湧きました。ダミーコーディングにおける (e_1, e_2) は、ニューヨークを原点にとったときの各カテゴリ値の特徴量なんですね。確かに、「なぜニューヨークが原点なのか」という感じはしますね。決定木のような原点の場所がどこかということは何も関係ないモデルでは関係なさそうですが。5.2.1節の特徴量ハッシングというのは、ランダムにカテゴリ値をまとめてしまうということですよね…例 5-3 のコードでは、おそらくレビュー文章か何かの単語列(word_list)を、m 次元の数値ベクトルに変換していますね。単語毎にベクトルのどの成分をインクリメントするかは、その単語の生のハッシュ値を m で割った余りで決めています。例 5-4 の方は似ていますが、インクリメントするかデクリメントするかもまたハッシュ値で決めています。こうすると大きなバイアスが発生しない?? どういうことでしょう。

f:id:cookie-box:20190101160814p:plain:w60

ちょっと例を考えてみようか。元々単語のユニーク数が9個だったとする。この時点でじゅうぶん少ないけどあくまで例だからね。いま手元の2つの文章を、どの単語IDが何回現れるかで9次元にエンコードしたとする。仮に以下のような感じになったとする。

  • 文章X:  (0, 1, 0, 1, 1, 0, 2, 3, 0)
  • 文章Y:  (1, 1, 0, 0, 1, 0, 2, 0, 1)
これらのベクトルの内積は 6 だね。ここで、9 次元だと多すぎるから 3 次元に削減したいとなったとする。例 5-3 に基づく方法なら圧縮後の特徴ベクトルは以下だ。ここで、ハッシュ値は元々の単語IDの番号そのものとするよ。だから、上のベクトルを 3 つずつぱたぱたと折りたたむだけだね。
  • 文章X:  (0, 1, 0) + (1, 1, 0) + (2, 3, 0) = (3, 5, 0)
  • 文章Y:  (1, 1, 0) + (0, 1, 0) + (2, 0, 1) = (3, 2, 1)
他方、例 5-4 に基づく方法で圧縮するなら以下。元のベクトルの奇数番目にマイナスをかける。
  • 文章X:  (-0, 1, -0) + (1, -1, 0) + (-2, 3, -0) = (-1, 3, 0)
  • 文章Y:  (-1, 1, -0) + (0, -1, 0) + (-2, 0, -1) = (-3, 0, -1)
例 5-3 に基づく方法でも例 5-4 に基づく方法でも 9 次元のベクトルを 3 次元に圧縮できるけど、圧縮後の文章Xと文章Yの内積が前者の方法では 19、後者の方法では 3 になっている。まあどっちの方法でも圧縮前の 6 を保つことはできていないけど、前者の方法では明らかにどんな文章間も内積がインフレしそうだ。単に元のベクトルを折りたたむだけだからね。でも、文章を示す特徴量ベクトルの間の内積というのは、文章どうしがどれだけ類似しているかを示す肝心な量だから、次元を圧縮した表現にしただけで文章間がどんどん類似してしまうというのは好ましくないはずだ。後者の方法ではハッシュ値によって符号を変えることで内積が一方的に増えてしまうという事態を抑えている。もちろん次元を削減しているから元の内積を完全に保つことはできないけど。「内積の期待値が変わらない」の意味は原論文を読まないとわからないけど、おそらく上の思考実験をもっとたくさんの文章でやってみたり、あらゆるハッシュ関数でやってみたりしたら内積の平均値が保たれるんじゃないかな。

f:id:cookie-box:20190101155733p:plain:w60

確かに bag-of-words ではコサイン類似度などで類似度が測られるのでしたっけ。次元を圧縮したいからといって内積が保たれない表現にしてしまっては台無しですね。元々の bag-of-words は「意味が近い文章どうしは距離が近くなっている」がゆえに文章を表現する特徴量たりえたのですから。意味が近くない文章どうしでなくても距離が近い表現など、適切な特徴量とはいえません。5.2.2 節は、カテゴリ毎の何かの最小値や最大値などでもよいのでしょうかね。94ページの最小カウントスケッチというのは? これはレアではないカテゴリも含めて d 種類の m 値へのマッピングを用意するということでしょうか。そして最小値を正式に採用する? うーん、やり方はわかるんですが、ハッシュ関数d 個にすると結局何がよかったのかとかなぜ最大値などではなく最小値をとるのかとかよくわかりません…。

f:id:cookie-box:20190101160814p:plain:w60

Count-Min Sketch の原論文の [Cormode & Muthukrishnan, 2005] というのはおそらく以下の記事にリンクがあるものだね。

上の文書の3ページに書いてある手続きは本の94ページと全く一緒だ(絵も似ているね)。d \times w のテーブルに合計 N のカウントを加えるなら、この手続きによるアイテム i のカウントの推定値は  1 - (1/2)^{d} 以上の確率で誤差  2N/w 以内になるらしい。理由は簡単だね。1つの行にのみ着目すると、アイテム i が入っているマスに他のアイテムのカウントがどれだけ混入するか(誤差)の期待値は N/w だ。となると、マルコフの不等式より、誤差が  2N /w 以上になる確率は  1/2 以下だ。これが d 行あるから、全ての行で誤差が  2N /w 以上になる確率は  (1/2)^d になる。

f:id:cookie-box:20190101155733p:plain:w60

そうか、「余計なアイテムのカウントが一番小さいマスを選びたいのだ」という気持ちであれば最小値を選ばなければなりませんね。統計量が何かのカウントであるとは限らないと思いますが。

f:id:cookie-box:20190101160814p:plain:w60

d \times w のマスがあるならそれを一行に展開して1つのハッシュ関数のみつかうのでは駄目なのか、って気もするけど、それだとあるアイテムたちはとても誤差が大きく、あるアイテムたちは誤差がないという偏りが出そう。d 種類のハッシュ関数をつかうことで最悪のアイテムでも誤差が少ないというようにできる。

f:id:cookie-box:20190101155733p:plain:w60

95ページの一番下の段落はどういう意味でしょうか。「任意のデータ点の有無によって統計量の分布がほぼ変わらない」?

f:id:cookie-box:20190101160814p:plain:w60

音楽を推薦するモデルをつくるのに、アーティストを特徴量にしたいけど、アーティストはきっと多いからそのままカテゴリ値として扱いたくない。だから、「レディー・ガガ」というカテゴリ値の変わりに「レディー・ガガの曲の再生回数の全ユーザ合計」のような連続値にしたい。けど、1人だけ異様にレディー・ガガの曲を再生しているユーザがいたらよくない。任意のユーザを抜いたとしても、あらゆるアーティストの再生回数合計の分布が変わらない必要がある、ということかな…いや、任意のアーティストを抜いても分布が変わらない、かもしれないかな…もしレディー・ガガだけ再生回数が断トツで多かったら、どのユーザにもレディー・ガガばかり推薦されることになっちゃいそうだし…。

f:id:cookie-box:20190101155733p:plain:w60

そんなに再生回数が多かったらもう万人にレディー・ガガを推薦しておけばよくないですか?

f:id:cookie-box:20190101160814p:plain:w60

個々のユーザの嗜好を予測しようとして??

f:id:cookie-box:20190101155733p:plain:w60

6章に入りますね。 特異値分解ですか…以前に特異スペクトル変換法で扱いましたね。

式 6-6 から式 6-7 はこうですね。
 \displaystyle (x_1^\top w)^2 + \cdots + (x_N^\top w)^2 = \left( \begin{array}{c} x_1^\top w \\ \vdots \\ x_N^\top w \end{array} \right)^\top \left( \begin{array}{c} x_1^\top w \\ \vdots \\ x_N^\top w \end{array} \right) = \left( X w \right)^\top \left( X w \right) = w^\top X^\top X w
w^\top w = 1 の制約のもとで Xw の長さを最大にするには、wX の最大の特異値によって引き延ばされる向きを向いていなければなりませんね。…せっかく次元削減できたのに、110~111ページで計算コストが高いだの色々言われていますね…。111ページに、この手法の実用場面として「時系列の異常検出」と言及されていますね。112ページで、ZCA は「相関関係を取り除くことができ」「画像のより面白い構造を見つけ出すことに集中」ってどんな画像になるんでしょう?

f:id:cookie-box:20190101160814p:plain:w60

以下に ZCA をやっている記事があったよ。一番下の方に画像があるね。

つづきは後で