PyCaretの前処理チートシート(欠損値補完から特徴量エンジニアリングまで)
PyCaretは機械学習を自動化するツールですが、実は前処理(Preprocess)はかなり充実しています。PyCaretは、欠損値の補完、One-Hotエンコーディング、正規化、スケール変換、特徴量エンジニアリング、特徴量選択、PCA特徴量計算など、多岐にわたる前処理を備えています。本記事では、PyCaretの前処理機能をまとめた「チートシート」として、実際の使い方やポイントを解説します。
はじめに
機械学習の初手として、PyCaretを頻繁に利用しています。PyCaretは自動モデル作成機能などが注目されがちですが、実はその前処理機能も非常に充実しています。
この記事では、PyCaretの前処理機能に焦点を当て、要点や手法を簡潔にまとめた参考資料を目指して作成しました。
PyCaretの「前処理チートシート」として活用してください。
前処理・特徴量エンジニアリングに関しては以下の記事も参考にしてください
前処理の追加の方法
前処理はsetup
関数の引数(パラメータ)として設定します。...
の部分に、パラメータを追加することで、前処理を行うことが可能になります。
clf = setup(data=train, target = 'Class', .... )
setupについては、以下の記事を参考にしてください。
前処理はsetup
関数のパラメータで追加します。以下、前処理と追加するためのパラメータやオプションについて解説します。
データの準備
“Data Preparation”に分類される前処理になります。
欠損値
データに含まれる欠損値を、どのように処理するかを指定できます。
imputation_type
補完のタイプを指定します。"simple"
,"iterative"
,None
が指定できます。Noneの場合は、欠損値の補完は行われません。"simple"
の場合は、mean
などの統計値で補完されます。iteative
の場合は、推定器を利用した推定値で補完されます(推定器はnumeric_iterative_imputer
で指定numeric_imputation
数値の列の補完方法を指定"drop"
欠損値を含む行を削除"mean"
,"median"
,"mode"
平均値、中央値、最頻値を代入"knn"
K近傍法を使用して決定- int or float 指定した数値を代入
categorical_imputation
カテゴリ列の補完方法を指定"drop"
欠損値を含む行を削除"mode"
最頻値を代入- str 指定された文字列を代入
iterative_imputation_iters
imputation_type
が"iterative"
の場合の反復数を指定numeric_iterative_imputer
imputation_type
が"iterative"
の場合の数値列の推定器を指定。デフォルトはlightgbm
categorical_iterative_imputer
imputation_type
が"iterative"
の場合のカテゴリ列の推定器を指定。デフォルトはlightgbm
設定例
# load dataset
from pycaret.datasets import get_data
hepatitis = get_data('hepatitis')
# init setup
from pycaret.classification import *
clf1 = setup(data = hepatitis, target = 'Class', imputation_type="iterative")
display(get_config('X'))
display(get_config('X_transformed'))
前処理を追加する場合、setupの引数の上記のようにパラメータを追加します。
データ型の指定
PyCaretでは自動的に各列のデータ型を検出しますが、指定することも可能です。データ型の指定は、データ型を明示的に指定する場合に利用します
numeric_features
数値列とする列を指定します(列名のリスト)categorical_features
カテゴリ列とする列を指定します(列名のリスト)date_features
日付列とする列を指定します(列名のリスト)create_date_columns
データセットの特徴から、日付に対応する列を作成しますtext_features
テキスト列とする列を指定します(列名のリスト)text_features_method
テキスト列の特徴量を埋め込む方法を指定します。デフォルトは"tf-idf"
です。"bow"
(Bag of Words)を選ぶことも可能です。
注意:テキスト埋め込みはメモリを大量に消費する可能性がありますignore_features
特徴量として使わない列を指定します。例えば、ユニークに割り振られたIDなどを無視したい場合に利用します(列名のリスト)keep_features
前処理により除外されないようにする列を指定します(列名のリスト)
create_date_columns
は使ったことがないので挙動がイマイチ不明です。
設定例
# load dataset
from pycaret.datasets import get_data
hepatitis = get_data('hepatitis')
# init setup
from pycaret.classification import *
clf1 = setup(data = hepatitis, target = 'Class', categorical_features = ['SEX'])
display(get_config('X'))
display(get_config('X_transformed'))
カテゴリ変数をOne-Hotエンコード
カテゴリ列を、One-Hotエンコードする場合の指定です
max_encoding_ohe
カテゴリ数が設定値以下の場合、One-Hotエンコーディングされます。デフォルトは25です。なお、2クラスの場合は、0, 1にエンコーディングされます。coding_method
エンコーダーを指定します。デフォルトは、category_encoders.leave_one_out.LeaveOneOutEncoder
です。
カテゴリ変数をOrdinalエンコード
カテゴリ列をOrginalエンコードする場合の指定です。
ordinal_features
ordinalエンコードする列を指定します(列名のリスト)。ordinalエンコードするのに向いているのは、例えば、low, middle, highのような順番のある特徴量です。
設定例
# load dataset
from pycaret.datasets import get_data
employee = get_data('employee')
# init setup
from pycaret.classification import *
clf1 = setup(data = employee[['salary', 'left']], target = 'left', ordinal_features = {'salary' : ['low', 'medium', 'high']})
display(get_config('X'))
display(get_config('X_transformed'))
公式ドキュメント通りに設定するのですが、私の環境おではOne-hotエンコーディングされてしまいます。max_encoding_ohe
を2にすると動作しますが、それはそれで問題・・・バージョンの問題?
ターゲットの不均衡を補正
目的変数の分布が不均衡を補正する場合に指定します
fix_imbalance
不均衡を補正するためにリサンプリングを行う場合は、True
を設定しますfix_imbalance_method
補正するためのアルゴリズムを指定します。デフォルトはSMOTE
です
外れ値除去
外れ値を除去する場合に指定します
remove_outliers
外れ値除去を行う場合にはTrue
に設定しますoutliers_method
外れ値除去のアルゴリズムを指定します。以下を設定できます"iforest"
sklearn の IsolationForest を使用"ee"
sklearn の EllipticEnvelope を使用"lof"
sklearn の LocalOutlierFactor を使用
outliers_threshold
外れ値除去の閾値を設定します。デフォルトは0.05です
スケール変換
“Scale and Transform”に分類される機能です
Normalize
正規化を行う場合に指定します
normalize
正規化を行うかどうかを指定するパラメータです。Trueにすると正規化されますnormalize_method
正規化のアルゴリズムを指定します"z-score"
z = (x – u)/sを計算します。uは平均、sは偏差です"minmax"
0~1の範囲になるようにスケーリングします"maxabs"
最大絶対値が1.0になるようにスケーリングします"robust"
四分位範囲に従ってスケーリングします。外れ値に強い
設定例
# load dataset
from pycaret.datasets import get_data
pokemon = get_data('pokemon')
# init setup
from pycaret.classification import *
clf1 = setup(data = pokemon, target = 'Legendary', normalize = True)
display(get_config('X'))
display(get_config('X_transformed'))
カテゴリ変数も正規化されてしまうのが少し気になります・・・
分布の変換(説明変数)
説明変数の特徴量の分布が正規分布に近くなるように変換したい場合に指定します
transformation
データを変換する場合はTrue
にしますtransformation_method
データを変換するアルゴリズムを指定します。デフォルトは、yeo-johnson
です。quantile
とyeo-johnson
のどちらかを指定できます
分布の変換(目的変数)
目的変数の分布を正規分布に近くなるように変換します。regression
(回帰)のみ利用できます。
transform_target
データを変換する場合はTrue
にしますtransform_target_method
データを変換するアルゴリズムを指定します。デフォルトは、yeo-johnson
です。quantile
とyeo-johnson
のどちらかを指定できます
特徴量エンジニアリング
特徴量エンジニアリングに関するパラメータです。新しい特徴量を作成できます。
x*y, x/yみたいな特徴量も作れたみたいですが、現在のバージョンでは作れなくなっているみたいです
多項式特徴量の追加
多項式特徴を追加したい場合に設定します。多項式特徴とは、a列とb列がある場合a^2, a*b, b^2などになります。
polynomial_features
多項式特徴量を追加する場合、True
に設定しますpolynomial_degree
多項式特徴の次数を設定します。デフォルトは2(2次)です
グループ特徴量の追加
データセットの列に相互に関連する特徴が含まれている場合に、グループの平均、中央値、分散、標準偏差などを新しい特徴量として追加します。
group_features
グループ特徴量を追加する場合に設定します(列名のリスト)group_names
追加する特徴量の名前を指定する場合に設定します(追加する列名のリスト)
グループ特徴量を使うケースとしては、1月〜12月の販売数などが列として並んでいる場合に、月の平均などを特徴量として追加したい場合などです。
Bin Numeric特徴量の追加
特徴量を範囲で区切ってカテゴリ値に変換したい場合などに指定します。例えば、「年齢」をグループに分けてカテゴリ化したい場合などに使います。グループはK平均法で決定します。
bin_numeric_features
指定された特徴量を範囲で区切ってカテゴリ特徴量に変換します(列名のリスト)
特徴量選択
特徴量の選択
特徴量を選択する場合に指定します
feature_selection
特徴量の選択をする場合、True
を設定しますfeature_selection_method
特徴量の選択アルゴリズムを指定します"univariate"
sklearn の SelectKBest を使用"classic"
SelectFromModel を使用"sequential"
SequentialFeatureSelector
feature_selection_estimator
特徴量の重要性を決定するために使う推論器を指定します。デオフォルトはlightgbm
です。n_features_to_select
選択する特徴量の最大数を設定します。1未満の場合は選択する割合、1以上の場合は選択する個数になります
類似した特徴量を除外
相関が高い特徴量を除外します。一部の推論器では非常に有効です
remove_multicollinearity
multicollinearity_thresholdで設定された相関より高い相関を持つ特徴量を削除します(1つは残します)multicollinearity_threshold
削除するかどうかの閾値を設定します。デフォルトは0.9です。
PCA特徴量
主成分分析(PCA)特徴量による削減を行います
- pca
PCA特徴量を利用する場合はTrue
を設定します - pca_method
PCAを適用するアルゴリズムを指定します- “linear” 特異値分解を使用
- “kernel” RBF カーネルを使用
- “incremental” linearに似ているが大規模データセットで効率的(?)
- pca_components
選択する特徴量の最大数を設定します。1未満の場合は選択する割合、1以上の場合は選択する個数になります。"mle"
を指定した場合は、MLEを使用して決定
低分散の特徴量を除外
偏りが大きく、分散の小さい特徴量を削除したい場合に指定する
low_variance_threshold
設定された閾値より低い分散を持つ特徴量を削除する。0の場合は0以外の分散の特徴量を全て保持。デフォルトはNone
分散が0ということは、全ての行が同じ値の列ということになります。推論の役に立たないのは直感的にわかるかと思います
番外(PyCaretで前処理だけ行わせる)
テクニックとして、PyCaretのsetupを使ってデータの前処理だけ行うことも可能です。
PyCaretのsetupで変換した結果は、get_config(取り出したいパラメータ)
で取り出すことができます。
パラメータ名 | 説明 |
"X" | 説明変数 |
"X_transformed" | 前処理後の説明変数 |
"y" | 目的変数 |
"y_transformed" | 前処理後の目的変数 |
別のデータに前処理をしたい場合には、以下のような感じでいけると思います。
pre = get_config('pipeline')
X_trans = pre.transform(X)
まとめ
「PyCaretに組み込めないモデルを使いたいけど、前処理だけはPyCaretで楽したい」という場合があります。前処理だけ使うというのもアリだと思います。