Python機械学習プログラミング 第4章

Contents
  1. 概要
  2. 資料
  3. 環境
  4. メモ
  5. 4.1 欠測データへの対処
  6. 4.2 カテゴリデータの処理
  7. 4.3 データセットをトレーニングデータセットとテストデータセットに分割する
  8. 4.4 特徴量の尺度を揃える
  9. 4.5 有益な特徴量の選択
  10. 4.6 ランダムフォレストで特徴量の重要度にアクセスする
  11. Python機械学習プログラミング
  12. 機械学習勉強会について

概要

Python 機械学習プログラミングの学習メモです。 勉強会用の資料があるのでこちらでは資料に載らなかったメモ等を。

今回は、第 4 章データ前処理 - よりよいトレーニングセットの構築

前回: nownab.log | Python機械学習プログラミング 第3章

資料

環境

本書の各バージョンは結構古いので、できるだけ新しいバージョンを使うようにしている。

  • Python 3.6.4
  • scikit-learn 0.19.1
  • matplotlib 2.1.1

メモ

4.1 欠測データへの対処

4.1.1 欠測値を持つサンプル / 特徴量を取り除く

4.1.2 欠測値を補完する

4.1.3 scikit-learnの推定器API

4.2 カテゴリデータの処理

4.2.1 順序特徴量のマッピング

4.2.2 クラスラベルのエンコーディング

enumerate1は組み込み関数で、Ruby の Enumerator#with_index2と同じような感じっぽい。

LabelEncoder クラスの inverse_transform メソッドを使うと次の Deprecation Warning が発生した。

DeprecationWarning: The truth value of an empty array is ambiguous. Returning False, but in future this will result in an error. Use `array.size > 0` to check that an array is not empty.
  if diff:

どうやらバグらしく master ブランチでは修正が入っているがリリースはされていない。3

4.2.3 名義特徴量での one-hot エンコーディング

4.3 データセットをトレーニングデータセットとテストデータセットに分割する

4.4 特徴量の尺度を揃える

多くの機械学習アルゴリズムは正規化より標準化の方が実用的らしい。ほう。

重みを小さな乱数で初期化するから標準化の方がいいって説明はよくわからんが、正規化は外れ値の影響を受けやすいってのはなんとなくわかる。

4.5 有益な特徴量の選択

4.5.1 L1正則化による疎な解

4.5.2 逐次特徴選択アルゴリズム

indices は index の複数形!!!今まで indexes って書いてた 😇

Python は組み込み関数が多かったりしてややこしい。

>>> dim = 5
>>> tuple(range(5))
(0, 1, 2, 3, 4)

4.6 ランダムフォレストで特徴量の重要度にアクセスする

argxxx 系の関数は便利だなー。スライスへの理解が深まった。456

>>> import numpy as np
>>> arr = np.array([1, 3, 5, 4, 2])
>>> np.argsort(arr)
array([0, 4, 1, 3, 2])
>>> arr[::-1]
array([2, 4, 5, 3, 1])
>>> arr[::0]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: slice step cannot be zero
>>> arr[::1]
array([1, 3, 5, 4, 2])
>>> arr[::2]
array([1, 5, 2])
>>> arr[::3]
array([1, 4])
>>> arr[::5]
array([1])
>>> arr[::6]
array([1])
>>> arr[::-1]
array([2, 4, 5, 3, 1])
>>> arr[::-2]
array([2, 5, 1])

文字列の書式指定がよくわからなかったので調べた。ドキュメント にも書いてない。

print("%2d) %-*s %f" % (f + 1, 30, feat_labels[indices[f]], importances[indices[f]]))

特に %-*s の部分と、% の個数と値の数があってない部分。

どうやら、次の 2 つのコードは同じ意味らしい。

"%-*s" % (30, "hoge")
"%-30s" % ("hoge")

で、% の直後のハイフンは左詰めという意味らしい。

>>> "%-*s" % (30, "hoge")
'hoge                          '
>>> "%-30s" % ("hoge")
'hoge                          '
>>> "%*s" % (30, "hoge")
'                          hoge'

Bash の printf でもできた。ほー、知らなかった。

$ printf "%-*s@\n" 30 hoge
hoge                          @
$ printf "%*s@\n" 30 hoge
                          hoge@
$ printf "%-*d@\n" 30 1
1                             @
$ printf "%*d@\n" 30 1
                             1@
$ printf "%*d@\n" 20 1
                   1@

transform メソッドないやんけ!と思ったら注釈に書いてあった。

from sklearn.feature_selection import SelectFromModel

sfm = SelectFromModel(rf, prefit=True, threshold=0.15)
X_selected = sfm.transform(X_train)
print(X_selected.shape)

Python機械学習プログラミング

Python機械学習プログラミング 達人データサイエンティストによる理論と実践 (impress top gear)

機械学習勉強会について

社内で毎週開催している。本書は輪読形式でまわしているが、題材によって形式は柔軟に変えている。 毎週読む範囲を決めて資料にまとめて発表するという感じでやっている。

また、勉強会で書いたコードや疑問点などをまとめるために GitHub のレポジトリを活用している。 Wondershake/machine-learning-study: 機械学習勉強会

Footnotes

  1. https://docs.python.jp/3/library/functions.html#enumerate ↩

  2. https://docs.ruby-lang.org/ja/latest/class/Enumerator.html#I_WITH_INDEX ↩

  3. [MRG + 1] Fix ValueError in LabelEncoder when using inverse_transform on unseen labels by newey01c · Pull Request #9816 · scikit-learn/scikit-learn ↩

  4. https://docs.python.jp/3/library/functions.html#slice ↩

  5. https://docs.python.jp/3/glossary.html#term-slice ↩

  6. https://docs.python.jp/3/library/stdtypes.html#common-sequence-operationsここの注釈が一番くわしい ↩