1. SAMPO/FABとsklearn-fabの主な差異
===================================
本章では、SAMPO/FABとsklearn-fabの主な差異を示します。

SAMPO/FABは、分析を行うための一連の機能（データの前処理、学習および予測の実行、モデルバリデーション、等）を独自に有しています。
一方、sklearn-fabは異種混合学習を利用するために必須のestimatorを除き、\ scikit-learn_\や\ pandas_\などのOSSライブラリを使用することを前提とした構成になっています。

ユースケース実現方法の比較
--------------------------
一般的な分析のユースケースについて、SAMPO/FABとsklearn-fabにおける実現方法は以下になります。

.. csv-table:: ユースケース実現方法の比較
  :header-rows: 1

  "ユースケース", "SAMPO/FAB", "sklearn-fab"
  "データの前処理", "
  - Feature Descriptor
  ", "OSSライブラリを使用"
  "分析手順の設計", "
  - SPD
  - SRC
  ", "
  - 使用データ選択
  - estimator選択
  - パラメーター指定
  - sklearn.pipeline.Pipeline_
  "
  "学習、予測の実行", "SAMPO API

  - run関数", "sklearn-fab API

  - fit関数
  - predict関数
  "
  "モデルバリデーション", "SAMPO API

  - ProcessResultLoaderクラス
  - save_gate_tree関数
  ", "sklearn-fab API

  - export_gate_tree_dot関数
  - estimatorのcomps_アトリビュート

  OSSライブラリを使用
  "
  "ベストモデル選択", "SAMPO API

  - session_run関数

  OSSライブラリを使用
  ", "OSSライブラリを使用"
  "モデル永続化", "SAMPO API

  - process_store
  ", "OSSライブラリを使用"

SAMPO/FAB独自機能について
~~~~~~~~~~~~~~~~~~~~~~~~~
SAMPO/FABは独自機能をもっており、以下のように、sklearn-fabには存在しないものや概念が異なるものがあります。

ASD（Attribute Schema Description）

* ASDは、分析対象データの各属性の名前やデータ型を記述したものです。
* sklearn-fabでは、学習や予測で入力するデータ(\ numpy.ndarray_\や\ pandas.DataFrame_\)のdtypeなどがASDの概念に近いものになります。そのため、sklearn-fabはASDを必要とせず、ASDの関連機能も存在しません。

SPD（SAMPO Process Description）

* SPDは、属性生成や分析を行うコンポーネントを組み合わせ、学習（または予測）を行うプロセスを記述したものです。
* sklearn.pipeline.Pipelineと同じ概念になります。

SRC（SAMPO Run Configuration）

* SRCは、実行内容（学習、または予測）の定義、使用データや属性情報の選択など、実行設定情報を記述したものです。
* sklearn-fabでは、使用データ選択が同じ概念になります。

process_store（プロセスストア）

* process_storeは、モデル、使用データ、予測結果など、分析関連の様々な情報を一括管理するものです。
* sklearn-fabでは、それらの情報を保持する仕組みは存在しないため、OSSライブラリ等を用いてユーザーが個別に管理する必要があります。

学習器の比較
------------
SAMPO/FABとsklearn-fabが有する学習器を比較したのが以下になります。sklearn-fabでは、SAMPO/FABにおいて使用頻度が高い学習器が実装されています。

.. csv-table:: 学習器の比較
  :header-rows: 1

  "予測種別", "門関数", "予測式", "SAMPO/FAB", "sklearn-fab"
  "回帰", "単変数", "線形", "FABHMEBernGateLinearRg Component", "SklearnFABBernGateLinearRegressor"
  "回帰", "単変数", "非線形", "FABHMEBernGateBSplineRg Component", "なし"
  "回帰", "多変数", "線形", "FABHMELogitGateLinearRg Component", "なし"
  "回帰", "多変数", "非線形", "FABHMELogitGateBSplineRg Component", "なし"
  "分類（単クラス）", "単変数", "線形", "FABHMEBernGateLinearCl Component", "SklearnFABBernGateLinearClassifier"
  "分類（単クラス）", "単変数", "非線形", "FABHMEBernGateBSplineCl Component", "なし"
  "分類（単クラス）", "多変数", "線形", "FABHMELogitGateLinearCl Component", "なし"
  "分類（単クラス）", "多変数", "非線形", "FABHMELogitGateBSplineCl Component", "なし"
  "分類（多クラス）", "単変数", "線形", "FABHMEBernGateLinearMultiCl Component", "SklearnFABBernGateSoftmaxClassifier"

学習器に与えるパラメーターの比較
--------------------------------
SAMPO/FABとsklearn-fabについて、学習器に与えるパラメーターの差異を比較したのが以下になります。差異として、\ **名称が異なるパラメーター**\と\ **いずれかのみに存在するパラメーター**\があります。
以下では、SAMPO/FABを基準として、sklearn-fabではパラメーターがどのように変更されたかを示します。

.. csv-table:: パラメーターの比較（回帰、単変数門、線形の学習器）
  :header-rows: 1

  "変更点", "FABHMEBernGateLinearRg Component", "SklearnFABBernGateLinearRegressor", "備考"
  "名称および指定方法の変更", "gate_features", "gate_feature_ids", "※1"
  "名称および指定方法の変更", "comp_features", "comp_feature_ids", "※1"
  "名称および指定方法の変更", "comp_mandatory_features", "comp_mandatory_feature_ids", "※1"
  "名称および指定方法の変更", "comp_positive_features", "comp_positive_feature_ids", "※1"
  "名称および指定方法の変更", "comp_negative_features", "comp_negative_feature_ids", "※1"
  "削除", "standardize_target", "", "※2"

.. csv-table:: パラメーターの比較（分類、単変数門、線形の学習器）
  :header-rows: 1

  "変更点", "FABHMEBernGateLinearCl Component", "SklearnFABBernGateLinearClassifier", "備考"
  "名称および指定方法の変更", "gate_features", "gate_feature_ids", "※1"
  "名称および指定方法の変更", "comp_features", "comp_feature_ids", "※1"
  "名称および指定方法の変更", "comp_mandatory_features", "comp_mandatory_feature_ids", "※1"
  "名称および指定方法の変更", "comp_positive_features", "comp_positive_feature_ids", "※1"
  "名称および指定方法の変更", "comp_negative_features", "comp_negative_feature_ids", "※1"
  "削除", "positive_label", "", ""

.. csv-table:: パラメーターの比較（分類（多クラス）、単変数門、線形の学習器）
  :header-rows: 1

  "変更点", "FABHMEBernGateLinearMultiCl Component", "SklearnFABBernGateSoftmaxClassifier", "備考"
  "名称および指定方法の変更", "gate_features", "gate_feature_ids", "※1"
  "名称および指定方法の変更", "comp_features", "comp_feature_ids", "※1"
  "名称および指定方法の変更", "comp_mandatory_features", "comp_mandatory_feature_ids", "※1"

※1: 学習器パラメーターは、それぞれ以下のように指定します。
  SAMPO/FAB

  * SAMPO/FABのFAB componentに対し、SPDのOperatorsやMatching Functions等を使用して属性名を指定

  sklearn-fab

  * sklearn-fabのestimatorに対し、学習実行時に属性のIDをリスト形式で指定

※2: standardize_target
  sklearn-fabでは、ユーザーが必要に応じて、目的変数を標準化します。

.. _scikit-learn: https://scikit-learn.org/stable/
.. _pandas: https://pandas.pydata.org/
.. _sklearn.pipeline.Pipeline: https://scikit-learn.org/stable/modules/generated/sklearn.pipeline.Pipeline.html
.. _numpy.ndarray: https://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.html
.. _pandas.DataFrame: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.html
