pycaretの前処理について
pycaretでは、setupを実行することでPyCaretを初期化し、関数内で渡されたデータ・目的変数、その他すべてのパラメータを基に、pipelineを作成する。(詳しくはコチラを参照)
このsetupの際に設定できる色々な前処理まとめた
ちなみに、以下の三つの前処理はデフォルト設定で実行されるようになっている。
- 欠損値処理(Missing Value Imputation)
- カテゴリ変数の(One-Hot Encoding)
- 訓練・テストデータ分割(Train-Test Split)
(また、setup の設定や、処理後のデータはget_configで出力できる)
データの準備まで
# データを取得する
from pycaret.datasets import get_data
from pycaret.classification import *
from pycaret.regression import *
diabetes = get_data('diabetes')
# setup(前処理の指定なし)
clf = setup(data=diabetes, target = 'Class variable', silent=True, verbose=False)
# 設定の取り出し
get_config('X')
Data Preparation
欠損値処理
デフォルト:数値の場合は平均値で、カテゴリ変数の場合は定数で欠損値を補完する。
パラメータ
parameter | 説明 | type | values |
---|---|---|---|
imputation_type | 補完方法。Iterativeにすると何かしらの推定量で補完する。 | str | "simple"(default) "iterative" |
numeric_imputation | (数値データの場合の)補完する値の算出方法。 トレーニングデータセットにおけるその変数の統計量 | str | "mean"(default) "median"(中央値) "zero"(0埋め) |
categorical_imputation | カテゴリ変数の欠損値に"not_available"を代入する。 | str | "constant"(デフォルト) "mode"(最頻値) |
iterative_imputation_iters | iterationの回数。 imputation_type が iterative でない場合は無視される。 | int | 5(デフォルト) |
numeric_iterative_imputer | (数値の変数に対して)補完に使用する推定値の算出補法。 imputaion_typeが"simple"の場合には無視される | Union(str, Any) | lightgbm |
categorical_iterative_imputer | (カテゴリ変数に対して)補完に使用する推定値の算出補法。 imputaion_typeが"iterative"ではない場合には無視される。 | Union(str, Any) | lightgbm |
データ型の指定など
pycaretでは、それぞれの変数の型が自動で推定されるが、手動で設定することも可能
パラメータ
parameter | 説明 | type | values |
---|---|---|---|
numeric_features | 数値型の変数 | list of string | None(default) |
categorical_features | カテゴリ変数 | list of string | None(default) |
date_features | Datetime型の変数 モデリングには直接関係しないが、特徴量抽出の際などに利用される。 | list of string | None(default) |
ignore_features | モデリングの際に除去したい変数 | list of string | None(default) |
カテゴリ変数の取り扱い
One-Hot Encoding
PyCaretのデフォルト設定では、データセット内の全てのカテゴリ特徴をOne-hot Encodingで変換する。
One-hot Encoding は、カテゴリ変数として推定、もしくは設定された変数全てに適用される。
Ordinal Encoding
ordinal_features:dictionary, default = None
カテゴリ変数をOrdinal Encodingによって変換する。順序を持つカテゴリ変数(low, medium, high)などに有効。変数名をkey, 変換したいラベルが順序に従って記載されているリストをvalueに持つ辞書で設定する。
Example
clf1 = setup(data = employee, target = 'left', ordinal_features = {'salary' : ['low', 'medium', 'high']})
Carginal Encoding
カテゴリ変数をCarginal Encodingによって変換する。
カテゴリ変数に多くのレベルを持つ変数(カーディナリティの高い変数)の変換に有効。
high_cardinality_features: string, default = None
リストで設定された(カーディナリティの高い)変数をより少ないレベルに圧縮する。圧縮する方法はhigh_cardinality_method
で指定する。
high_cardinality_method: string, default = ‘frequency’
- frequency:特徴量の値を頻度分布に置き換えて特徴量を数値化する。
- clustering:特徴量の元の値をクラスタのラベルに置き換える。(クラスタ数はCalinski-HarabaszとSilhouette基準の組み合わせで決定される)
Example
clf1 = setup(data = income, target = 'income >50K', high_cardinality_features = ['native-country'])
Handle Unknown Levels
予測の実行時に、あるカテゴリ変数が(学習時には存在しなかった)未知の変数を含む場合、学習済みモデルに問題が生じることがある。
この問題の対策として、そのような未知のレベルに何か別のレベルを付与する方法を設定する。
handle_unknown_categorical: bool, default = True
未知の変数への取り扱い(レベル再割り当て)を実行するかどうか。
unknown_categorical_method: string, default = ‘least_frequent’
未知のラベルに対して、ラベル再割り当ての方法(least_frequent
or most_frequent
)
訓練データにおいてもっとも出現頻度の低い or 高い変数でラベルを付与する。
Example
reg1 = setup(data = insurance, target = 'charges', handle_unknown_categorical = True, unknown_categorical_method = 'most_frequent')
Target Imbalance
学習データセットにターゲットクラスの不均等分布がある場合に、このような不均衡を修正する。
fix_imbalance: bool, default = False
True の場合、fix_imbalance_method
で定義されたアルゴリズムを用いて学習データセットがリサンプリングされる。
fix_imbalance_method: obj, default = None
このパラメータは、fit_resample メソッドをサポートするimblearn の任意のアルゴリズムを設定できる。
(Noneの場合,デフォルトで SMOTE が使用される)
Exapmle
clf1 = setup(data = credit, target = 'default', fix_imbalance = True)
Remove Outliers(外れ値除去)
モデルを学習する前にデータセットから外れ値を識別して除去する。
setup 内の remove_outliersパラメータで実現できます。アウトライアの割合は、outliers_thresholdパラメータで制御する。
remove_outliers: bool, default = False
Trueに設定すると、特異値分解法を用いたPCA線形次元削減により、学習データから外れ値が除去される。
outliers_threshold: float, default = 0.05
データセットに含まれる外れ値の割合/比率を定義する。
デフォルトでは0.05が使用され、分布の末尾の両側にある値の0.025が学習データから取り除かれる。
Example
reg1 = setup(data = insurance, target = 'charges', remove_outliers = True)
Scale and Transform
Normalize(正規化)
変数の正規化方法を指定する。
デフォルトではzscoreを使用して正規化を実施している。
normalize: bool, default = False
Trueに設定すると、normalized_method
パラメータで定義された方法で特徴量が変換される。
normalize_method: string, default = ‘zscore’
正規化に使用するメソッドを指定する。
- zscore:zscoreを使用する。いわゆる標準化。$ z = \frac{(x – u)}{s}$
- minmax:0~1 にminmaxスケーリングされる。
- maxabs:各特徴の絶対値の最大値が1.0になるように、各特徴を個別に拡大・縮小変換する。データのシフトやセンタリングは行わないので、スパース性が損なわれることはない(0は0のまま)
- robust:各特徴を四分位範囲に従ってスケーリングし変換する。データセットに外れ値が含まれる場合はこの方法で良い結果が得られることが多い。
Example
clf1 = setup(data = pokemon, target = 'Legendary', normalize = True)
Feature Transform
変換されたデータが正規分布または近似正規分布で表現されるように、分布の形状を変更する。
変換には、yeo-johnson法とquantileの2つの方法がある。
transformation: bool, default = False**
True に設定すると、データをより正規化するために変数が変換される。分散を安定化させ、歪度を最小化するための最適なパラメータは、最尤法によって推定される。
transformation_method: string, default = ‘yeo-johnson’
変換の方法を定義する。デフォルトでは,変換方法はyeo-johnson
に設定されている。その他のオプションとしてquantile
変換が利用可能。
(分位値変換は非線形であり、同じスケールで測定された変数間の線形相関を歪める可能性がある)
Example
clf1 = setup(data = pokemon, target = 'Legendary', transformation = True)
Target Transformation
特徴量ではなくターゲット変数の分布の形状を変更する。
ターゲット変換にはbox-coxとyeo-johnsonの2つのメソッドがサポートされています。
transform_target: bool, default = False
transform_target_method パラメータで定義された方法でターゲット変数が変換される。
transform_target_method: string, default = ‘box-cox’
box-cox
変換ではデータが正であるこが必要だが、yeo-johnson
は正負両方のデータに適用できる。
(transform_target_methodがbox-cox
にも関わらず、ターゲット変数が負の値を含む場合、例外を回避するためにメソッドは内部的にyeo-johnson
に変更される
Example
reg1 = setup(data = diamond, target = 'Price', transform_target = True)
Feature Engineering(特徴量エンジニアリング)
Feature Interaction
既存の特徴量の交互作用によって新しい特徴量を作成する。
(この機能は特徴空間が大きいデータセットでは期待通りに動作しない可能性があることに注意)
feature_interaction: bool, default = False
True に設定すると、データセットのすべての数値変数について (a * b) の相互作用によって新しい特徴量を作成する。
feature_ratio: bool, default = False
データセット内のすべての数値変数の比率 (a / b) を計算して、新しい特徴を作成する。
interaction_threshold: bool, default = 0.01
polynomial_threshold と同様に、新しく作成された特徴量の疎な行列を相互作用によって圧縮する。
Random Forest、AdaBoost、Linear Correlation の組み合わせによる重要度が、定義された閾値のパーセンタイル内にある特徴飲みがデータセットに保持される。
Example
reg1 = setup(data = insurance, target = 'charges', feature_interaction = True, feature_ratio = True)
Polynominal Features
既存の特徴量から多項式特徴量を作成する。
polynomial_features: bool, default = False
True を指定すると、データセットの数値特徴に存在するすべての多項式の組み合わせから、 polynomial_degree
パラメータで指定した度合いで新しい特徴を作成する。
polynomial_degree: int, default = 2
特徴量を生成する多項式の次数。(例えば、入力サンプルが2次元で [ $a, b$ ] の変数がある場合、次数=2の多項式特徴量は [ $1, a, b, a^2, ab, b^2 $ ] となる。
polynomial_threshold: float, default = 0.1
生成した特徴量の疎な行列を圧縮するために使用される。Random Forest、AdaBoost、Linear Correlationの組み合わせに基づく特徴重要度が、定義された閾値のパーセンタイル内にある特徴量は、データセットに保持される。
clf1 = setup(data = juice, target = 'Purchase', polynomial_features = True)
Trigonometry Features
Polynominal Featuresと同様に、既存の特徴量からtrigonometry feature(三角関数で作成された特徴量)を生成する。
trigonometry_features: bool, default = False
True に設定すると、データセット中の全ての数値データと三角関数の組み合わせで新しい特徴量が生成される。
Example
reg1 = setup(data = insurance, target = 'charges', trigonometry_features = True)
Group Features
データセットに、ある一定の時間間隔で記録された特徴など、互いに関連性のある特徴が含まれている場合、group_featuresパラメータを使って、既存の特徴から平均、中央値、分散、標準偏差などの新しい統計特徴を作成することができる。
group_features: list or list of list, default = None
group_features
で設定された特徴量を利用して、統計的特徴量を算出して、モデリングに利用できる。
(例えば、データセットに含まれる数値データが素性が互いに関連している場合 (例えば 'Col1', 'Col2', 'Col3') 、その列名を含むリストを group_features の下に渡すとことで、それら変数全体の平均、中央値、最頻値、標準偏差といった統計情報を抽出することができる)
group_names: list, default = None
group_features
にグループ名を指定する場合、group_names
パラメータに文字列を含むリストとして渡す。
(group_names のリストの長さは group_features の長さと等しくなければならない。長さが一致しない場合や、group_names
が定義されない場合には、新しい特徴量は「group_1」,「group_2」などのように順番に命名される。
clf1 = setup(data = credit, target = 'default', group_features = ['BILL_AMT1', 'BILL_AMT2', 'BILL_AMT3'])
Bin Numeric Features
あらかじめ定義されたビン数を使って連続変数をカテゴリ値に変換する。
連続的な特徴量に一意の値が多すぎる場合や、期待される範囲外の極端な値が少ない場合に有効となる。
bin_numeric_features: list, default = None
数値データの変数名のリストが渡されると、それらはK-Meansを用いてカテゴリ特徴に変換される。
ここで、各ビン内の値は1次元k-meansクラスタの同じ最近接中心を持つ。クラスタ数は 'sturges' 法に基づいて決定される。
clf1 = setup(data = income, target = 'income >50K', bin_numeric_features = ['age'])
Combine Rare Levels
非常に多くのレベルを持つカテゴリ変数(高カーディナリティな変数)をこのような特徴を数値で表現した場合、結果として得られる行列はスパース行列となる。
combine_rare_levels
パラメータを使用することで、高いカーディナリティを持つ変数を結合することでスパースになるのを防ぐ。
combine_rare_levels: bool, default = False
True に設定すると、カテゴリ変数の中で rare_level_threshold
パラメータで定義された閾値以下のすべてのレベルが1つのレベルとして結合される。
rare_level_threshold: float, default = 0.1
レアカテゴリーが結合されるパーセンタイル分布。
(combine_rare_levels
が True に設定されているときのみ有効)
Create Clusters
データ内の既存の特徴量を抽出し、教師なし学習手法を使って新しい特徴量を作成する。
create_clusters: bool, default = False
Trueに設定すると、クラスタリングが実行され、各レコード(インスタンス)クラスターに基づいた特徴量が追加される。
クラスタ数は、Calinski-Harabasz 基準と Silhouette 基準の組み合わせで決定される。
cluster_iter: int, default = 20
クラスターを作成するために使用されるiterationの数。各iterationは、クラスタのサイズを表します。
(create_clusters パラメータが True に設定されている場合のみ有効)
reg1 = setup(data = insurance, target = 'charges', create_clusters = True)
Featrue Selection(変数選択)
Feature Selection(変数選択)
feature_selection
を使用して変数を選抜することで、オーバーフィットのリスクを減らし、精度を向上させ、学習時間を短縮することができる。
feature_selection: bool, default = False
Trueに設定すると、Random Forest、Adaboost、目的変数との線形相関など、様々な重要度の指標やテクニックを組み合わせて特徴量のサブセットが選択される。
サブセットのサイズはfeature_selection_param
に依存する。
feature_selection_threshold: float, default = 0.8
特徴選択に使用される閾値。高い値を設定すると、特徴空間が広くなる。
特にpolynomial_features
とfeature_interaction
を使用する場合は、feature_selection_threshold
は小さく方が良く、また値を変えて複数回試行することが推奨される。
Example
clf1 = setup(data = diabetes, target = 'Class variable', feature_selection = True)
Remove Multicollinearity(共線性の除去)
安定したモデルを構築するために、互いに高い相関を持つ変数(Multicollinearity|共線性を有する変数)を削除する。
remove_multicollinearity: bool, default = False
True に設定すると、multicollinearity_threshold
パラメータで定義した閾値よりも高い相互相関を持つ変数が削除される。
(2つの変数が互いに高い相関を持つ場合、目的変数との相関が低い方の素性が削除される)
multicollinearity_threshold: float, default = 0.9
相関のある特徴量を削除するために使用する閾値。(remove_multicollinearity
が True に設定されている場合のみ有効)
reg1 = setup(data = concrete, target = 'strength', remove_multicollinearity = True, multicollinearity_threshold = 0.6)
Principal Component Analysis(主成分分析)
主成分分析(PCA)によって生成した成分を使ってモデリングを行う。
pca: bool, default = False
True に設定すると、pca_method
パラメータで定義された手法により、データを低次元空間に射影する次元削減が行われる。
pca_method: string, default = ‘linear’
- linear:特異値分解(Singular Value Decomposition)を用いた線形次元削減
- kernel:RVFカーネルを使用した次元削減
- incremental:データセットが大きすぎてメモリに収まらない場合、linearの代わりに用いる
pca_components: int/float, default = 0.99
- pca_components がfloatの場合:もとのデータセットの情報のうち何%が保持されるように、PCA後のコンポーネントを保持するか。
- pca_components がintの場合:保持する特徴量(PCA後のコンポーネント)数。
Example
clf1 = setup(data = income, target = 'income >50K', pca = True, pca_components = 10)
Ignore Low Variance(分散の低い変数の除去)
分散が低く情報量が少ない変数を除去する。
ignore_low_variance: bool, default = False
Trueに設定すると、統計的に重要でない分散を持つすべてのカテゴリ変数(以下2パターン)がデータセットから削除される。
- ある特徴量に含まれるユニークな値のカウント / サンプル数 < 10
- 最も多い値のカウント / 2番目に多い値のカウント > 20倍
clf1 = setup(data = mice, target = 'class', ignore_low_variance = True)
Other setup parameters
Model Selection
データの前処理とは関係ないが、モデル選択のパラメータ設定。
パラメータ一覧
parameter | 説明 | type | values |
---|---|---|---|
train_size | 学習データの比率 | float | 0.7(default) |
test_data | 入力したテストデータを検証用のHold-out セットとして使用する。 (この場合、train_sizeの設定は無視される) | pandas.DataFrame | None(default) |
data_split_shuffle | Falseに設定すると、学習/訓練データ分割の際にシャッフルされない | bool | True(default) |
data_split_stratify | 学習/訓練データ分割の際に各ラベル層比率(stratification)を考慮する。 Trueとすると目的変数が対象となるが、リストを渡すことでstratifyの対象とする列を指定可能。 | bool or list | False(default) |
fold_strategy | クロスバリデーション(CV)の際の、foldの方法 | str or scikit-learn CV generator | stratifiedkfold(default) kfold stratifiedkfold groupkfold timeseries a custom CV generator object |
fold | クロスバリデーション(CV)の際の分割数 | int | 10(default) |
fold_shuffle | CVのシャッフルパラメータを制御するかどうか fold_strategyがkfold かstratifiedkfoldの時に有効。 | bool | False(default) |
fold_groups | クロスバリデーションに 'GroupKFold' を用いた場合のグループラベル。 学習データセットの行数(n_sample)を持つarrayか、グループラベルを含むデータセットの列名をstrで指定する。 | str or array-like | None(default) |
参考
参考HP
関連書籍