01.5.3
パターンマッチで列を選択
暦 を含む列だけ標準化したい」のように列を名前の規則で選ぶとき、列名を 1 つずつ書き並べる代わりに make_column_selector(pattern="暦") を使います。pattern は正規表現で列名に照合され、sample.csv では 和暦 と 西暦 の 2 列だけが選ばれて StandardScaler の対象になります。選ばれなかった 元号・人口総数・町名 は make_column_transformer の既定 remainder="drop" によって出力から落ちるので、変換後の表は 2 列になります。読み終えると、列が増えたり並び順が変わったりしても壊れない前処理の指定が書けるようになります。直感 #
アンケートの表に Q1_満足度, Q2_満足度, … と同じ接尾辞の列が 30 本あるとき、["Q1_満足度", "Q2_満足度", …] と手で列挙すると、列が 1 本増えただけで指定が漏れます。make_column_selector は「名前がこの正規表現に一致する列」という規則で列を選ぶので、fit_transform を呼んだ時点の列名を見て毎回選び直してくれます。このページでは pattern="暦" という最小の例で、5 列の表から 和暦 と 西暦 の 2 列だけが選ばれる様子を確かめます。
サンプルデータ #
町ごとの人口を年ごとに記録した sample.csv を読み込みます。元号 と 町名 が文字列、和暦・西暦・人口総数 が数値で、列名はすべて日本語です。
| |
| 元号 | 和暦 | 西暦 | 人口総数 | 町名 | |
|---|---|---|---|---|---|
| 0 | 大正 | 9.0 | 1920.0 | 394748 | A町 |
| 1 | 大正 | 9.0 | 1920.0 | 31421 | B町 |
| 2 | 大正 | 9.0 | 1920.0 | 226993 | C町 |
| 3 | 大正 | 9.0 | 1920.0 | 253689 | D町 |
| 4 | 大正 | 9.0 | 1920.0 | 288602 | E町 |
sklearn.compose.make_column_selector #
sklearn.compose.make_column_selector
を使用します。次のコードは pattern="暦" で列名に「暦」を含む列を選び、その列だけに StandardScaler を掛けて平均 0・分散 1 に揃えます。出力は選ばれた 2 列だけの配列になります。
| |
| 0 | 1 | |
|---|---|---|
| 0 | -0.946623 | -1.665466 |
| 1 | -0.946623 | -1.665466 |
| 2 | -0.946623 | -1.665466 |
| 3 | -0.946623 | -1.665466 |
| 4 | -0.946623 | -1.665466 |
実行結果の読み方 #
変換後の表が 2 列だけなのは、pattern="暦" に一致した 和暦 と 西暦 だけが出力され、他の 3 列が remainder="drop" で捨てられたからです。先頭 5 行は同じ 1920 年のデータなので値も同じで、和暦 の -0.946623 は「9 年が全体の平均より約 0.95 標準偏差だけ小さい」と読みます。西暦 の -1.665466 の方が絶対値が大きいのは、1920 年がデータの最初の年で、西暦の分布の端にあるためです。
使いどころと落とし穴 #
pattern は部分一致なので、"暦" は 旧暦 や 暦年 にも一致します。狙った列だけに絞りたいときは "^(和暦|西暦)$" のように全体一致で書くか、dtype_include を組み合わせます。make_column_selector はコールバックとして保存され、fit のたびに列名を見直すので、学習時になかった列がテスト時に増えると変換後の列数が変わり、下流のモデルで ValueError になります。学習時と推論時で列の集合が同じことを ct.transformers_ で確認する習慣をつけてください。