機械学習
記事内に商品プロモーションを含む場合があります

PyCaretの前処理(Preprocess)のまとめ|欠損値の補完〜特徴量エンジニアリング

tadanori

PyCaretの前処理はかなり充実しています。欠損値の補完、正規化、One-Hotエンコーディングなどに加えて、特徴量エンジニアリングやPCA特徴量の計算なども行うことが可能です。

この記事では、pycaretの前処理にフォーカスして解説します。とりあえず、特徴量エンジニアリングを行う場合にも利用できそうです。

はじめに

最近、Kaggleで検討用にPyCaretの前処理をいろいろ使ってみました。実際に使ってみると思ったよりいろいろな前処理ができることに気づいたので、この記事では、PyCaretの前処理にフォーカスを当てて説明を行いたいと思います。

前処理の記述方法

前処理はsetup関数の引数(パラメータ)として設定します。...の部分に、パラメータを追加することで、前処理を行うことが可能になります。

clf = setup(data=train, target = 'Class', .... )

setupについては、以下の記事を参考にしてください。

PyCaretの基本的な使い方についてはこちら
機械学習の初期検討を効率化|PyCaretを利用したモデル選択の自動化
機械学習の初期検討を効率化|PyCaretを利用したモデル選択の自動化

データの準備

“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'))

データ型の指定

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です
SMOTEについてはこちら
SMOTE:不均衡データをオーバーサンプリングして数を揃える手法
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です。
    quantileyeo-johnsonのどちらかを指定できます
Yeo-Johnson変換についてはこちら
データの分布を正規分布に近づける(Box-Cox変換、Yeo-Johnson変換)|予測制度向上を目指して
データの分布を正規分布に近づける(Box-Cox変換、Yeo-Johnson変換)|予測制度向上を目指して

分布の変換(目的変数)

目的変数の分布を正規分布に近くなるように変換します。regression(回帰)のみ利用できます。

  • transform_target
    データを変換する場合はTrueにします
  • transform_target_method
    データを変換するアルゴリズムを指定します。デフォルトは、yeo-johnsonです。
    quantileyeo-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で楽したい」という場合があります。前処理だけ使うというのもアリだと思います。

おすすめ書籍

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

記事URLをコピーしました