sklearn-fabの基本的な使用方法¶

本ノートブックでは、sklearn-fabの基本的な使用方法を紹介します。
使用方法として、以下の3点について説明します。

  • 学習用データを入力し、モデルを作成する
    2. モデルの作成をご覧ください

  • テスト用データを入力し、モデルのバリデーションを実施する
    3. モデルのバリデーションをご覧ください

  • 予測用データを入力し、予測を実施する
    4. 予測の実施をご覧ください

1. データ準備¶

データ観察¶

まず、学習およびテストに使用するデータを確認します。
本ノートブックでは、ボストンの住宅価格を示すデータを使用します。
データの詳細については、以下をご覧ください(本ハンズオンでは、標準化済みのデータを使用します)。
Boston house prices dataset

In [ ]:
import pandas as pd

data = pd.read_csv('./data/train_data.csv')
data.head()

上記のデータについて、

  • カテゴリ変数が存在しない
  • 全ての変数が標準化済み

という理由により、そのまま使用します。

データの分割¶

次に、上記のデータを学習用とテスト用に分割します。
学習用として多めに確保するため、データを7:3の割合で、学習用:テスト用に分割します。

In [ ]:
from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(data.iloc[:, 1:], data.iloc[:, 0],
                                                    train_size=0.7, random_state=100, shuffle=True)

2. モデルの作成¶

ここでは、学習用のデータを使用し、モデルを作成します。
目的変数house_priceは連続値であるため、回帰用のestimatorである「SklearnFABBernGateLinearRegressor」を使用します。
学習を行う際に、estimatorには以下のパラメーターを指定することができます。
(パラメーターは、学習結果に作用します。)

  • random_seed
    estimatorで使用される乱数シードです。

  • tree_depth
    門木の深さを設定するパラメーターです。

  • shrink_threshold
    門木の枝刈りの閾値を設定するパラメーターです。

    パラメーターの詳細は、「sklearn-fab Reference」および「FAB Reference」をご覧ください。

また、loggingモジュールを使用することで、学習の進捗状況を確認することができます。
学習が進んだ(stepが増加した)際の、予測式数(num_comps)と情報量基準(FIC)の変化を確認できます。

In [ ]:
import logging
from sklearn_fab import SklearnFABBernGateLinearRegressor

# 学習の進捗を確認する準備
logging.basicConfig(level=logging.INFO)

rg = SklearnFABBernGateLinearRegressor(random_seed=0, tree_depth=3, shrink_threshold=2.0)
rg.fit(X_train, y_train)

3. モデルのバリデーション¶

予測精度の確認¶

作成したモデルを評価するため、予測精度を確認します。
まず、テスト用のデータを使用し、予測を実施します。

In [ ]:
y_predict = rg.predict(X_test)

予測値(Predict Value)と、データの実績値(Actual Value)の関係を調べるため、グラフを作成します。
各サンプル毎に比較するため、散布図で確認します。

In [ ]:
import matplotlib.pyplot as plt
%matplotlib inline

plot_min = int(min(y_test.min(), y_predict.min())) - 3
plot_max = int(max(y_test.max(), y_predict.max())) + 2
plt.scatter(y_test, y_predict)
plt.plot(range(plot_min, plot_max + 1), range(plot_min, plot_max + 1), color='darkgray')
plt.xlim(plot_min, plot_max)
plt.ylim(plot_min, plot_max)
plt.xlabel('Actual Value')
plt.ylabel('Predict Value')
plt.gca().set_aspect('equal', adjustable='box')
plt.show()

散布図から、予測値と実績値には相関関係があり、値の一致を示す灰色の実線に沿っていることから、適切に予測が実行されたことがわかります。

散布図による比較だけでなく、定量的な評価も必要となるため、以下で行います。
評価指標として、MSE(Mean Square Error: 平均二乗誤差)を選定し、任意に定めた目標値(desired_mse)を満足するかを確認します。

In [ ]:
from sklearn.metrics import mean_squared_error

desired_mse = 10
test_mse = mean_squared_error(y_test, y_predict)
test_mse
In [ ]:
test_mse <= desired_mse

上記の結果が、Trueであれば目標達成になります。
Falseであればモデルの改善を実施したり、目標見直し等を行うことになります。

門木の可視化¶

モデルがもつ門木を可視化し、確認します。
可視化により、以下を確認することができます。

  • どのような条件(門関数)により、予測式を使い分けているか
  • 各門関数や予測式に割り当てられるサンプル数はどれくらいか
In [ ]:
from IPython.display import display, Image
from sklearn_fab.utils import export_gate_tree_dot

dot = export_gate_tree_dot(rg, X=X_train)
display(Image(dot.create_png()))

上図はモデルの門木構造を示しており、四角には門関数(分岐条件)が書かれています。
楕円には予測式の番号が表示されており、該当する予測式が使用されていることを示しています。
(componentは予測式と同義です。)
sample countはその門関数(または予測式)が適用されるサンプル数を表しています。

予測式の可視化¶

モデルがもつ予測式情報にアクセスし、可視化することができます。
門関数で条件分岐された後、どのような予測式により予測が実行されるのかを知ることができます。

In [ ]:
import numpy as np

# 可視化のために、DataFrame形式で予測式を表現
columns = np.append(rg.feature_names_, ['bias'])
prediction_formulas = [np.append(comp.weights, comp.bias) for comp in rg.comps_]
pf_df = pd.DataFrame(prediction_formulas, columns=columns,
                     index=['component #' + str(i) for i in rg.comp_ids_])

# 係数が0ではない説明変数のみを抽出し、表示
relevant_feature_indices = pf_df.sum(axis=0) != 0
pf_df = pf_df.T[relevant_feature_indices]
pf_df.plot(kind='barh', figsize=(12, 6), stacked=True)
plt.show()

上記の図では、各予測式について、目的変数に対する各説明変数の係数を表しています。

ここでは、それらの係数に加えて、
・bias:予測式の切片
を新たな変数として含んでいます。

これらの値が正となっている場合、それに比例して住宅価格が高くなることを示しています。
一方、これらの値が負となっている場合、それに比例して住宅価格が低くなります。

実際には、データサイエンティストが門木と予測式を確認し、

  • 適切な説明変数が門関数に使用されているか
  • 予測式の係数やbiasが適切な値になっているか

などを業務知識とデータから判断します。
それらの結果が問題なく、かつ予測精度も目標を満たすことで、作成したモデルが使えるものかを結論付けることになります。
モデルが使えるものだと判断できれば、実際に予測用データを使用し、目的変数を予測することになります。

4. 予測の実施¶

最後に、予測用データに対する予測を実行します。
まず、データを確認します。

In [ ]:
predict_data = pd.read_csv('./data/predict_data.csv')
predict_data.head()

以下で予測を実行し、house_priceを求めます。

In [ ]:
predict_data['house_price'] = rg.predict(predict_data.iloc[:, 1:])
predict_data.head()

予測用データを使って、house_priceが予測されることを確認できました。
なお、house_priceをはじめとする各変数は標準化された値であるため、通常はこの後に逆標準化した値を求めます。