2019-03-27

「機械学習のための特徴量エンジニアリング」を読んだ

読んだので感想を書きます。ホクソエムの皆様による翻訳です。

機械学習のための特徴量エンジニアリング
――その原理とPythonによる実践
Alice Zheng (著), Amanda Casari (著), 株式会社ホクソエム (翻訳)

電子版は O'reilly Japanのサイトで購入できます。

感想

あたりまえの事をあたりまえにやれるレベルまでスッと引き上げてくれる感じ。画像データの章は飛ばして読んだのですが、ScailngやOne-Hot-Encodingといった頻出テクニックは一通り書いてあるので、これから機械学習やるという人には良さそう。手法の紹介だけでなく、One-Hot-Encodingは冗長表現なので係数が一意に定まらなくなる話やリーク(leakage)の話があるのは親切。

文章による解説とPythonコードが併記されているのは嬉しい。そして原著のコードで非効率な所は容赦なく書き換えているのはホクソエム陣の意気込みを感じた。GitHubにnotebookが公開されているので、コードはこちらが読み易い。PandasでNew Line Delimited JSONフォーマットが読める事や、列の一致していないDataFrame同士をconcatして縦に積めるのは知らなかった。

9章のレコメンドアルゴリズムを題材に特徴量エンジニアリングを実践する構成は面白い、しかしコードが本の終盤になるにつれ雑になり、意図を読み取るのに苦労する条件式が頻発するのはなんだかなーと。あと numpy.array のデータサイズを求めるのに getsizeof を使うのは間違っているような。

# データ型を変えるとそれぞれのデータサイズがどのくらい変わるか確認する
>>> print('Our pandas Series, in bytes: ', getsizeof(fos_features))
>>> print('Our hashed numpy array, in bytes: ', getsizeof(X_fos))
Our pandas Series, in bytes:  2530632380
Our hashed numpy array, in bytes:  112

型の変更により、データがずっと小さくなったことがわかります。

抜粋:: Alice Zheng  “機械学習のための特徴量エンジニアリング”。 iBooks
疎行列だとしても非ゼロ要素が112個以上あるから112バイトにはならないし、numpyのIssueを見るとnumpy.arrayは getsizeof での呼び出しをサポートしていない雰囲気がある。手元で実行すると以下の通り。


正誤表は見つからず。

最後に

途中で不覚にも笑ってしまいました。
“[†8] 訳注: 日本にもTedのような人がいます。タカヤナギ=サンです。彼はデータサイエンスの走る百科事典です。そして業界イベントで頻繁に講演をしていて、日本酒や素敵な人が好きです。 彼に日本酒を買って話してかけてみて下さい。後悔しないと思いますが、彼が泥酔している時には後悔するかもしれません。”

抜粋:: Alice Zheng  “機械学習のための特徴量エンジニアリング”。 iBooks
そして9章のコードを手元のマシンで動かすとメモリが足りなくてJupyter Notebookのカーネルが落ちてしまうため、メモリ増設の機運が高まりました。現在は32GByteのメモリを積んでるのですが、どれだけあれば足りるのだろう……

このエントリーをはてなブックマークに追加