PythonのAutoFeatを使った自動特徴量エンジニアリング
(Automatic Feature Engineering)その2(分類問題)

PythonのAutoFeatを使った自動特徴量エンジニアリング(Automatic Feature Engineering)その2(分類問題)

数理モデルを作る上で特徴量エンジニアリング(Feature Engineering)は地味に重要です。

例えば、より精度の高い予測モデルを構築したいのであれば、アルゴリズムのパラメータチューニングとともに特徴量エンジニアリング(Feature Engineering)に注力したほうがいいでしょう。

Pythonに幾つかの自動特徴量エンジニアリング(Automatic Feature Engineering)のためのパッケージがあります。

その中の1つに「AutoFeat」というものがあります。回帰問題分類問題で利用できます。

前回は、回帰問題に対し「AutoFeat」を自動特徴量エンジニアリング(Automatic Feature Engineering)のお話しをしました。「AutoFeat」のインストール方法などを含め知りたい方は、以下の前回記事を参考にして頂ければと思います。

PythonのAutoFeatを使った自動特徴量エンジニアリング(Automatic Feature Engineering)その1(回帰問題)

今回は、AutoFeatを使った「分類問題」での使用方法や手順などを簡単に説明します。

数理モデルのアルゴリズム

AutoFeat分類問題に対するアルゴリズムは、ロジスティック回帰という分類問題で最もオーソドックスなものです。

ただ、AutoFeatclass_weightというパラメータにbalancedと指定しています。分類問題のクラスの数に偏りがある場合に、クラスごとの重みを調整するどうかを指定するパラメータデフォルトは「None」(無調整)です。

分類問題のクラスとは、例えば受注を予測するモデルの場合、受注と失注がクラスです(受注クラス・失注クラス)。どちらかのクラスの数が極端に少ない場合があります。例えば、10,000件中、受注が100件で失注が9,900件の場合です。すべて失注と予測すると、正答率は99%になります。永久に受注を予測できないモデルが出来上がります。このようなことにならないようクラスごとの重みを調整し、クラスの数に偏りを緩和する必要があります。そのやり方の1つが、「class_weight=’balanced’」とすることです。他にもやり方はありますが、本題とは無関係なので割愛します。

ちなみに、AutoFeatロジスティック回帰Scikit-Learn(sklearn)のものを使っています。

データセット

今回はscikit-learnから提供されている乳がんの診断結果のデータセットを使います。

目的変数Yは、悪性クラスと良性クラスを表す以下の2値データです。

  • 悪性(=0)
  • 良性(=1)

特徴量は、以下の10変数です。

  • radius:細胞核の中心から外周までの距離
  • texture:画像のグレースケールの標準偏差
  • perimeter:細胞核周囲の長さ
  • area:細胞核の面積
  • smoothness:細胞核の直径の局所分散値
  • compactness:perimeter^2/area – 1.0で計算される値
  • concavity:輪郭の凹面度の重大度
  • concave point:輪郭の凹面部の数
  • symmetry:対称性

構築するモデル

今回は、4つのモデルを構築してみます。

特徴量X モデル構築
モデル1 元の特徴量 ロジスティック回帰
モデル2 AutoFeatで自動生成した特徴量 ロジスティック回帰
モデル3 元の特徴量 AutoML TPOTで自動構築
モデル4 AutoFeatで自動生成した特徴量 AutoML TPOTで自動構築

AutoML(自動機械学習)TPOTに関しては、以下を参考にして頂ければと思います。AutoML(自動機械学習)TPOTは、単により最適な予測モデルを自動構築するだけでなく、パイプライン全体を最適化するので、特徴量エンジニアリング(Feature Engineering)を一部自動化しています。

自動機械学習(AutoML) Web講座

モデル1と2を構築し検証する

次の2つのモデルを学習データで構築し、構築したモデルをテストデータで精度検証(accuracy:正答率)します。

  • モデル1:元の特徴量を使ったロジスティック回帰モデル
  • モデル2:AutoFeatで自動生成した特徴量を使ったロジスティック回帰モデル

 

先ず、必要なライブラリーを読み込みます。

以下、コードです。

# ライブラリーの読み込み
import pandas as pd
from autofeat import AutoFeatClassifier
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_breast_cancer
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, confusion_matrix

 

次に、データセットを読み込みます。

以下、コードです。

# データセットの読み込み
load_breast_cancer = load_breast_cancer(as_frame=True)
X = load_breast_cancer.data
y = load_breast_cancer.target

 

データセットを、学習データとテストデータに分割します。

以下、コードです。

# データセットの分割(学習データとテストデータ)
X_train, X_test, y_train, y_test = train_test_split(X,
                                                    y,
                                                    train_size=0.7,
                                                    test_size=0.3,
                                                    random_state=42)
  • 学習データ
    • 特徴量:X_train
    • 目的変数:y_train
  • テストデータ
    • 特徴量:X_test
    • 目的変数:y_test

 

AutoFeatの特徴量エンジニアリングのモデルを定義します。

以下、コードです。

# モデル定義
model = AutoFeatClassifier(verbose=1)

 

今回は分類問題なので「AutoFeatClassifier」です。

実行経過を表示させるverboseはデフォルトでは「0」(表示しない)ですが、ここでは簡易的な表示をさせるために「1」にしています。これらは何も設定しないとデフォルトの状態で実行されます。

 

では、自動特徴量エンジニアリング(Automatic Feature Engineering)を実行します。

以下、コードです。

# 特徴量生成(学習データ利用)
X_train_feature_creation = model.fit_transform(X_train, y_train)

 

以下、実行結果です。

 

自動生成した特徴量は、X_train_feature_creationに格納しています。確認してみます。

以下、コードです。

X_train_feature_creation #確認用

 

以下、実行結果です。

 

どのような特徴量が自動生成されたのかが分かると思います。

一覧で出してみます。

以下、コードです。

X_train_feature_creation.columns #生成された特徴量X

 

以下、実行結果です。

 

数を確認してみます。

以下、コードです。

print("number of features in X_train:",  #元の特徴量Xの数
      X_train.shape[1])                                   
print("number of features in X_train_feature_creation:", 
      X_train_feature_creation.shape[1]) #新しい特徴量Xの数

 

以下、実行結果です。

 

元の特徴量は30個でしたが、AutoFeatによる特徴量の自動生成で9個の特徴量が新たに追加され、結果的に39個の特徴量になりました。

 

この自動生成した特徴量と同じ特徴量のテストデータを作ります。X_test_feature_creationに格納します。

以下、コードです。

# テストデータの特徴量生成
X_test_feature_creation = model.transform(X_test)

 

元の特徴量のデータセット(X_trainとy_train)と新たな特徴量のデータセット(X_train_feature_creationとy_train)で、ロジスティック回帰モデルを構築してみます。

以下、コードです。

# モデル構築
## model_1
model_1 = LogisticRegression(class_weight='balanced')
model_1.fit(X_train,y_train)
## model_2
model_2 = LogisticRegression(class_weight='balanced')
model_2.fit(X_train_feature_creation, y_train)

 

では、テストデータを使いそれぞれのモデルの精度(accuracy:正答率)を比較してみたいと思います。

以下、コードです。

# 評価(accuracy, confusion matrix)
print("model_1 accuracy:%.4f" % accuracy_score(y_test,
      model_1.predict(X_test)) )
print(confusion_matrix(y_pred=model_1.predict(X_test),
      y_true=y_test))
print("model_2 accuracy:%.4f" % accuracy_score(y_test,
      model_2.predict(X_test_feature_creation)))
print(confusion_matrix(y_pred=model_2.predict(X_test_feature_creation),
      y_true=y_test))

 

以下、実行結果です。

 

model_1の「モデル1:元の特徴量を使ったロジスティック回帰モデル」です。accuracy(正答率)は97.08%です。

この段階で、非常に高精度です。特徴量の自動生成の成果はどうでしょうか?

model_2の「モデル2:AutoFeatで自動生成した特徴量を使ったロジスティック回帰モデル」の精度も高く、accuracy(正答率)は97.66%です。

 

AutoML(自動機械学習)TPOTでモデル構築(モデル3と4)

おまけの意味合いが強いですが、次の2つのモデルを学習データで構築し、構築したモデルをテストデータで精度検証(accuracy:正答率)します。

  • モデル3:元の特徴量を使いAutoML(自動機械学習)TPOTで自動構築したモデル
  • モデル4:AutoFeatで自動生成した特徴量を使ってAutoML(自動機械学習)TPOTで自動構築したモデル

どうなるでしょうか?

 

先ず、モデル3です。元の特徴量を使いモデルを自動構築します。

以下、コードです。

# 必要なライブラリの読み込み
from tpot import TPOTClassifier

# POTClassifierの設定
tpot = TPOTClassifier(scoring='accuracy',
                      generations=5,
                      population_size=50,
                      verbosity=2,
                      n_jobs=-1)

# モデル構築
tpot.fit(X_train, y_train)

# 評価(accuracy, confusion matrix)
print("accuracy: %.4f" % accuracy_score(y_test, tpot.predict(X_test)))
print(confusion_matrix(y_pred=tpot.predict(X_test),y_true=y_test))

 

以下、実行結果です。

 

下のほうにaccuracy(正答率)があります。98.83%です。かなりいいですね。

 

次に、モデル4です。AutoFeatで自動生成した特徴量を使ってモデルを自動構築します。

以下、コードです。

# POTClassifierの設定
tpot2 = TPOTClassifier(scoring='accuracy',
                       generations=5,
                       population_size=50,
                       verbosity=2,
                       n_jobs=-1)

# モデル構築
tpot2.fit(X_train_feature_creation, y_train)

# 評価(accuracy, confusion matrix)
print("accuracy: %.4f" % accuracy_score(y_test, tpot2.predict(X_test_feature_creation)))
print(confusion_matrix(y_pred=tpot2.predict(X_test_feature_creation),y_true=y_test))

 

以下、実行結果です。

 

下のほうにaccuracy(正答率)があります。98.25%です。かなりいいですね。

正直、AutoML(自動機械学習)TPOTでモデル構築するなら、事前に特徴量を自動生成しなくてもよさそうですね(断言はできませんが……)。

 

まとめると、今回は次にようになりました。

特徴量X モデル構築 accuracy
(正答率)
モデル1 元の特徴量 ロジスティック回帰 97.08%
モデル2 AutoFeatで自動生成した特徴量 ロジスティック回帰 97.66%
モデル3 元の特徴量 AutoML TPOTで自動構築 98.83%
モデル4 AutoFeatで自動生成した特徴量 AutoML TPOTで自動構築 98.25%

 

次回

前回分類問題で、今回は回帰問題でした。

人によっては、特徴量選択の機能だけ使いたい、という方もいるかもしれません。次回は、特徴量選択の機能だけ使う場合のやり方について、簡単に説明します。

PythonのAutoFeatを使った自動特徴量エンジニアリング(Automatic Feature Engineering)その3(特徴量選択だけ使う)

PythonのAutoFeatを使った自動特徴量エンジニアリング(Automatic Feature Engineering)その1(回帰問題)