Translate

#58 Section 13 回帰(2)前処理

ここからは、『setup』関数によるいくつかの前処理機能を体験していきます。 

(『#49 Section 5 分類(2)前処理』と重複する部分もありますが、このSectionから読み始める人もいるかもしれませんので、省略はしないで書きました!) 




まずは、モジュールのインポートとsetup関数の実行です。下記のスライド2を参照ください。



1行目に
# import pycaret classification and init setup

とあり、setup関数を初期化するような説明となっていますが、『init』は初期化という意味ではなく、機械学習の実験を開始するための準備作業全体を指していますから、ここではsetup関数を実行して前処理を行うという意味で理解しておきましょう。

2行目は、PyCaretのうち分類に用いるモジュール『classification』をインポートしています。このモジュールは、二項分類または多項分類に使用できます。さらに、 『setup』関数によるいくつかの前処理機能、18以上のすぐに使えるアルゴリズムと、学習済みモデルの性能を分析するためのプロットが用意されています。

ワイルドカード「*」を使うとモジュールで公開されているすべての関数や変数などがインポートされて使えるようになります。

3行目は、PyCaretの分類モジュールに含まれる『setup』関数で、欠損値処理データ分割などの前処理を行っています。

ここで、setup関数について詳しく説明します。






setup関数は、最小限、『分析するデータ名』→data、『目的変数』→target、『後で再現可能にするための擬似乱数設定』→session_idという引数が必要になります。

session_idは、無くても動きますが、毎回違う結果が出てくることがありますので固定しておきましょう。

また、その他の引数の主なものは、下記のとおりです。

『ignore_features』→無視したい特徴量のリスト
『normalize  True』→Trueに設定するとデータが正規化される
『train_size』→訓練データのサイズ、例:=0.7では70%が学習用データとして使用される
『log_data』→Trueにすると、学習およびテストデータがCSV形式で保存される

その他は@Asagumo63さんの記事『PyCaretのsetup関数の引数について』を参照してください!

「PyCaretは細かい調整ができない」と誤解されているようですが、そうではありません。ただし、回帰の全体像を把握するために、ここでは最小限の引数で進めていきます。

さて、数十秒待つと、Setup関数の出力が表示されます。出てきた結果をどう解釈するか、まとめてみました。下記の2枚をみてください!






スライド4の『Original data shape』の列数が、『Transformed data shape』、『Transformed train set shape』、『Transformed test set shape』では、3列増えています。これは、どうしてでしょうか?

実は、この前処理で、機械学習においてカテゴリ変数を数値データに変換するために『One-Hot Encoding』という手法を使っています。

多くの機械学習アルゴリズム(特に線形モデル)は、数値を入力として想定しています。カテゴリ変数をそのまま扱うと、アルゴリズムがそれらの間に順序関係があると誤って解釈してしまう可能性があります。例えば、「赤」を 1、「青」を 2、「緑」を 3 と数値に変換した場合、アルゴリズムは「緑」が「赤」よりも大きいと認識してしまいます。One-Hot Encodingは、このような順序関係の誤解を防ぎ、モデルがカテゴリ間の関係を正しく学習できるようにするために使用されます。




実際に、①One-Hot Encodingがどの列に適用されているか?、②その列のカテゴリー変数がどのようなものかを見てみると、下記のようになります。このコードは、筆者が追加しました!



①print(s.pipeline.steps[3][1].transformer.cols)
  →['region']

②data["region"].unique()
   →array(['southwest', 'southeast', 'northwest', 'northeast'], dtype=object)

One-Hot Encodingがされている列が「region」で、そのカテゴリー変数は4つですから、オリジナルデータより3つ増えます。列数が7個から10個になったというわけです。

さて、図の12に『Fold Generator StratifiedKFold』(交差検証は、StratifiedKFold/K分割交差検証を選択)とありますが、この交差検証とは一体何でしょう?

通常、機械学習モデルの訓練では、データを「訓練データ」と「テストデータ」に分割します。訓練データでモデルを学習させ、テストデータでその性能を評価します。しかし、この単一の分割方法には以下の問題点があります。

1.データ分割による偏り: テストデータセットがたまたまモデルにとって「簡単」なデータを含んでいた場合、過剰に良い性能評価が得られる可能性があります。逆に「難しい」データを含んでいた場合、過小評価される可能性があります。

2.データ量の制約: データセットが小さい場合、テストデータに割り当てられるデータがさらに少なくなり、評価の信頼性が低下します。訓練データが少なくなると、モデルの学習も不十分になる可能性があります。

3.過学習(Overfitting)の検出: モデルが訓練データに過剰に適合し、テストデータでは性能が落ちる「過学習」を見抜くことが難しくなります。

そこで、交差検証では、データセットを複数の部分集合に分割し、 それぞれの部分集合を交互にテストデータとして使用しながら、残りの部分集合でモデルを学習させます。 この過程を繰り返すことで、モデルの性能を複数回評価し、その平均値を最終的な性能指標として用います。




性能指標には、正解率(Accuracy)、適合率(Precision)、真陽性率(Recall)、F1-score等があります。それは、『Section14 回帰(3) モデルの評価・比較』で詳しく解説します。

さて、今までのコードは『関数型API』という方法(流儀)で書いてきましたが、『オブジェクト指向API』という方法でもコードを書くことができます。

公式『Tutorials』にそのコードがあるので、下記に解説します。また、その解説に出てくる用語の説明(『クラス』、『Estimator(エスティメータ)』)も下記にまとめましたが、大規模なコードを書くのではなく、今回のような短いコードの場合は、『関数型API』で十分ですので、ざっくりと目を通していきましょう。

『オブジェクト指向API』で書いたコードは、下記のようになります。









『関数型API』と『オブジェクト指向API』でのコードを併記すると、下記のようになります。





このSectionは、これで終了いたします。お疲れさまでした!











コメント