SASでは、Python向けパッケージ/ライブラリとして、機械学習のパイプラインの実装を簡素化する「Pipefitter」を提供しています。
SASの「Pipefitter」パッケージは、SAS Viyaまたは、SAS v9の反復可能なワークフローの一つの段階として、データ変換とモデルフィッティング向けパイプラインを開発するためのPython APIを提供します。
このパッケージを使用すると、SASでデータを操作して、次のような処理を実装できます:
・欠損値補完
・デシジョンツリー、ニューラルネットワーク、およびその他の機械学習テクニックを使用したパラメータ推定値の適合
・ハイパーパラメータチューニングを使用したモデル選択の高速化
・スコアリングとモデル評価
「Pipefitter」のもう一つの重要な特徴は、SASが提供する他の2つのPythonパッケージの能力に基づいていることです。
SWAT:
SAS Viyaプラットフォームのインメモリー分析エンジンであるSAS Cloud Analytic Services(CAS)を活用し様々なデータ操作や分析を可能にするPython向けパッケージ
SASPy:
SAS9.4の機能を活用し、分析、データ操作、および視覚化を行うためのPython向けパッケージ
ロジスティック回帰でのパラメータ推定などのパイプライン処理は、SASPyを介してSAS 9で、SWATを介してCASで同じように実行されるように設計されています。
以下は、タイタニック号の乗船者データに基づくパイプラインの例です。
まず、KaggleのサイトからPandas DataFrameにデータをダウンロードします。
In [1]: import pandas as pd In [2]: train = pd.read_csv('http://s3.amazonaws.com/assets.datacamp.com/course/Kaggle/train.csv') In [3]: train.head() Out[3]: PassengerId Survived Pclass \ 0 1 0 3 1 2 1 1 2 3 1 3 3 4 1 1 4 5 0 3 Name Sex Age SibSp \ 0 Braund, Mr. Owen Harris male 22.0 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 2 Heikkinen, Miss. Laina female 26.0 0 3 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 4 Allen, Mr. William Henry male 35.0 0 Parch Ticket Fare Cabin Embarked 0 0 A/5 21171 7.2500 NaN S 1 0 PC 17599 71.2833 C85 C 2 0 STON/O2. 3101282 7.9250 NaN S 3 0 113803 53.1000 C123 S 4 0 373450 8.0500 NaN S |
欠損値を含む数値列と文字列の両方があります。 パイプラインでは、2つのデータ変換処理から開始して、欠損している数値に平均値を、欠損する文字列には最も一般的な値で埋めることができます。
In [4]: from pipefitter.transformer import Imputer In [5]: meanimp = Imputer(value=Imputer.MEAN) In [6]: modeimp = Imputer(value=Imputer.MODE) |
以下のステートメントでは、上記2つの変換処理をパイプラインに組み込み、その中身を表示しています。
In [7]: from pipefitter.pipeline import Pipeline In [8]: pipe = Pipeline([meanimp, modeimp]) In [9]: pipe Out[9]: Pipeline([Imputer(MEAN), Imputer(MODE)]) |
パイプラインの最後に、パラメータ推定の処理を加えます。乗船者生存判定にDecision Treeのモデルを使用することができ、ターゲット変数などの必要な値を設定します。
In [10]: from pipefitter.estimator import DecisionTree In [11]: dtree = DecisionTree(target='Survived', ....: inputs=['Sex', 'Age', 'Fare'], ....: nominals=['Sex', 'Survived']) ....: In [12]: dtree Out[12]: DecisionTree(alpha=0.0, cf_level=0.25, criterion=None, inputs=['Sex', 'Age', 'Fare'], leaf_size=5, max_branches=2, max_depth=6, n_bins=20, nominals=['Sex', 'Survived'], prune=False, target='Survived', var_importance=False) |
「Decision Tree」以外に、「DecisionForest」, 「GBTree」, 「LogisticRegression」を使用することができます。
上記Decision Treeの処理をパイプラインに追加します。
In [13]: pipe.stages.append(dtree) In [14]: for stage in pipe: ....: print(stage, "\n") ....: Imputer(MEAN) Imputer(MODE) DecisionTree(alpha=0.0, cf_level=0.25, criterion=None, inputs=['Sex', 'Age', 'Fare'], leaf_size=5, max_branches=2, max_depth=6, n_bins=20, nominals=['Sex', 'Survived'], prune=False, target='Survived', var_importance=False) |
パイプラインが完成したので、トレーニングデータを追加します。
以下はSAS Viya(CAS)を活用する例です。
まず、SWATパッケージをインポートし、セッションを作成します。
In [22]: import swat In [23]: casconn = swat.CAS(host, port, userid, password) |
Pipefitterで作成したパイプラインをSAS ViyaのインメモリエンジンCASで処理させるためには、分析対象のデータをインメモリーにCASテーブルとして作成する必要があります。
冒頭、Pandas DataFrameに取り込んだデータをCASにアップロードします。
In [24]: train_ct = casconn.upload_frame(train, casout=dict(name="train_ct", replace=True)) NOTE: Cloud Analytic Services made the uploaded file available as table TRAIN_CT in caslib CASUSER(kesmit). NOTE: The table TRAIN_CT has been created in caslib CASUSER(kesmit) from binary data uploaded to Cloud Analytic Services. In [25]: train_ct.info() CASTable('TRAIN_CT', caslib='CASUSER(kesmit)') Data columns (total 12 columns): N Miss Type PassengerId 891 False double Survived 891 False double Pclass 891 False double Name 891 False varchar Sex 891 False varchar Age 714 True double SibSp 891 False double Parch 891 False double Ticket 891 False varchar Fare 891 False double Cabin 204 True varchar Embarked 889 True varchar dtypes: double(7), varchar(5) data size: 157030 vardata size: 35854 memory usage: 157128 |
info()ファンクションの結果として、欠損を含んだ変数が含まれていることが示されています。
この欠損は、fit()メソッドでモデルのトレーニング実行時に補完されることになります。
このメソッドはPipelinemodelオブジェクトを返します。
In [26]: pipeline_model = pipe.fit(train_ct) In [27]: for stage in pipeline_model: ....: print(stage, "\n") ....: Imputer(MEAN) Imputer(MODE) DecisionTreeModel(alpha=0.0, cf_level=0.25, criterion=None, inputs=['Sex', 'Age', 'Fare'], leaf_size=5, max_branches=2, max_depth=6, n_bins=20, nominals=['Sex', 'Survived'], prune=False, target='Survived', var_importance=False) |
Score()メソッドを実行し、モデル評価結果を表示します。
In [28]: pipeline_model.score(train_ct) Out[28]: Target Survived Level CLASS Var _DT_P_ NBins 100 NObsUsed 891 TargetCount 891 TargetMiss 0 PredCount 891 PredMiss 0 Event 0 EventCount 549 NonEventCount 342 EventMiss 0 AreaUnderROCCurve 0.846851 CRCut 0.47 ClassificationCutOff 0.5 KS 0.572908 KSCutOff 0.54 MisClassificationRate 19.9776 Name: DecisionTree, dtype: object |
「Pipefitter」の詳細に関しては、Githubの公開内容を参照してください。