NI BLOG

ネイチャーインサイト株式会社の情報発信ブログ
SASに関する技術情報など

2019/12/02 SAS関連

PythonからSAS Viyaを使用して機械学習モデルを構築

PythonからSAS Viyaを使用して機械学習モデルを構築

弊社にもようやくSAS Viyaがインストールされましたので、色々触ってみました。

SAS Viyaとは

SAS Viyaとは、複雑な分析(機械学習、ディープラーニング、人工知能)の
高速性・正確性・信頼性をより一層高めるために開発された、
クラウド対応のインメモリ・アナリティクス・エンジンです。

昨今、分析のデータ量は大きくなり、機械学習の処理も複雑化しているため、
ローカルマシンではマシンスペックに合わせた処理にしなくてはなりません。

SAS Viyaではクラウドベースであるので処理が早く、
メモリもあまり気にする必要がありません。

さらに、SAS Viyaでは様々な言語(Python、R、Java、Lua)から
使用することができ、SASを触ったことがない方でも
簡単に使用することができます。

今回は、PythonからSAS Viyaで機械学習モデルを構築します。

Python から SAS Viyaに接続する

まずはPythonからSAS Viyaに接続しましょう。
なお、フォルダ構成は以下を想定しております。

sasviya
 ├─sasviya.ipynb
 ├─config
 │  └─setting.ini
 └─data
   └─UCI_Credit_Card.csv
setting.iniは以下のようなファイルです。
[DEFAULT]
URL = <SAS ViyaのURL>/cas-shared-default-http/
ID = <ユーザーID>
PASSWORD = <パスワード>
UCI_Credit_Card.csvは以下のKaggleのUCI Credit Cardのデータを使用しています。
https://www.kaggle.com/uciml/default-of-credit-card-clients-dataset (KaggleURL)
https://archive.ics.uci.edu/ml/datasets/default+of+credit+card+clients (元データURL)

また、pythonモジュールの「swat」を使用しますので、
先にpip installしておきましょう。

以上の環境を構築したら、sasviya.ipynbにコードを書いていきましょう。
まずは必要なモジュールをインポートします。
import swat
import pandas as pd
import matplotlib.pyplot as plt
from configparser import ConfigParser

pd.options.display.max_columns = None
pd.options.display.float_format = '{:.2f}'.format

config = ConfigParser()
config.read('./config/setting.ini')
以下のコードでSAS Viyaとのセッションを確立します。
sess = swat.CAS(config['DEFAULT']['URL'],8080,config['DEFAULT']['ID'], config['DEFAULT']['PASSWORD'])
sess.serverstatus()

データの可視化

この章では、SAS Viyaのデータの中身を確認していきます。

まずはローカルファイルのUCI_Credit_Card.csvをCASサーバにアップロードします。

castbl = sess.upload_file(data='./data/UCI_Credit_Card.csv',
casout=dict(name='CreditCard',
caslib='casuser', replace=True))
※CASとはSAS Cloud Analytic Servicesの略で、SASにデータ管理と分析の実行環境を提供します。

SAS Viyaのデータはほとんどのpandasのメソッドが使用できます。
つまり、SASコードを知らなくてもデータの可視化ができてしまいます。
# データの中身を確認
castbl.head()

# データの変数情報を確認
castbl.info()

# ヒストグラムを表示
castbl.hist(figsize=[15,15])
plt.show()

ほかにもpandasと同様の書き方で、様々な可視化をすることができます。

モデルの構築

SAS Viyaではアクションセットを使用してモデルを構築します。
アクションセットとはBase SASのプロシジャやPythonのモジュールみたいなもので、
使用する際に宣言する必要があります。
今回は、勾配ブースティングを使用するためのアクションセット「decisionTree」と、
データを分割するためのアクションセット「sampling」を読み込みます。

#アクションセットのロード
sess.loadactionset("decisionTree")
sess.loadactionset("sampling")
データを分割し、trainデータとvalidデータにします。
SAS Viyaではテーブルの変数「_partind_」に0と1を振り分けます。
# データの分割
sess.sampling.stratified(
table={"name":"CREDITCARD", "groupBy":"default.payment.next.month"},
output={"casOut":{"name":"CREDITCARD_part", "replace":True}, "copyVars":"ALL"},
samppct=70,
partind=True
)
sess.CASTable("CREDITCARD_part").head(5)

次に学習を行います。
ハイパーパラメータを設定し、trainデータを使用して学習します。
今回使用した変数は「PAY_0」、「PAY_2」、「LIMIT_BAL」、「AGE」です。

# 勾配ブースティング学習
sess.decisionTree.gbtreeTrain(
table={
"name":"CREDITCARD_part",
"where":"strip(put(_partind_, best.))='1'"
},
inputs=["PAY_0", "PAY_2","LIMIT_BAL", "AGE"],
target="default.payment.next.month",
nTree=100,
nBins=20,
maxLevel=6,
varImp=True,
missing="USEINSEARCH",
casOut={"name":"gb_model", "replace":True}
)
作成したモデルを、validデータに適用します。
# 勾配ブースティングスコアリング
score = sess.decisionTree.dtreeScore(
table={
"name":"CREDITCARD_part",
"where":"strip(put(_partind_, best.))='0'"
},
modelTable={"name":"gb_model"},
casOut={"name":"_scored_tree", "replace":True},
copyVars={"ID","default.payment.next.month"}
)
scored_tree = sess.CASTable("_scored_tree")
scored_tree.head()

赤枠で囲ったところが予測確率です。

スコアリングしたデータをローカルに保存するには以下のようにします。

scored_tree = sess.CASTable("_scored_tree")
scored_tree[["ID","_GBT_PredMean_"]].to_csv("./data/UCI_Credit_Card_pred.csv",index=False)

ここまでで、モデルの学習からスコアリングまでできました。
SAS ViyaはPythonと似たコードでモデルを構築することができますね。

モデルの評価

データ分析を行うのであれば、必ずモデルに対する評価を行わなければなりません。
SAS Viyaでは、もちろん評価を行うことができます。
今回はアクションセットの「percentile」を使用して、評価指標であるAUCを算出します。

sess.loadactionset("percentile")
pred = sess.percentile.assess(table = {"name": "_scored_tree"},
inputs = [{"name": "_GBT_PredMean_"}],
response = "default.payment.next.month",
event = "1"
)
以下のコードを書くことで、簡単にAUCを算出することができます。
auc=pred["ROCInfo"]["C"].drop_duplicates()[0]
print("AUC=",auc)
実行結果は「AUC= 0.74407341961023」です。

さらに、ROC曲線も描くことができます。
%matplotlib inline
plt.figure(figsize = (8,6), dpi = 100)
plt.plot(pred.ROCInfo["FPR"], pred.ROCInfo["Sensitivity"])
plt.plot([0,1], [0,1], "k--")
plt.grid(True)
plt.title("ROC Curve : AUC={:.4f}".format(auc))
plt.show()

ROC曲線まで簡単に描けるのは素晴らしいですね!

まとめ

今回はPythonからSAS Viyaを使用して機械学習モデルを構築しました。
SAS ViyaではほかにもCross Validationや、ディープラーニング、テキストマイニング等
様々なタスクを行うことができます。

今後もSAS Viyaについてのブログを発信していけたらなと思います。

コメント

※投稿されたコメントは、管理者によって承認された後に掲載されます。