機械学習のパイプラインを簡素化するPython向けパッケージ「Pipefitter」

0

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の公開内容を参照してください。

Share

About Author

Makoto Unemi (畝見 真)

ビジネスディベロップメントグループ

データ分析によりビジネス価値を創造する「ビジネス・アナリティクス」を日本市場に浸透させる活動に長年従事し、金融・製造・通信業を中心に数多くのアナリティクス・プロジェクトの提案に参画。 現在はAIプラットフォームなど新たなテクノロジーの活用に特化した提案を担当している。 ディープラーニングや機械学習などのAIテクノロジーや大規模分析基盤アーキテクチャについての豊富な知見、経験を持つ。 新たなテクノロジーでも分かりやすく解説するプレゼンテーションには定評があり、満足度の高い講演を年間、数多く行っている。

Leave A Reply

Back to Top