Vantageで機械学習モデルのトレーニングを行う方法

著者 [Adam Tworkiewicz](adam.tworkiewicz@teradata.com)
最終更新日 2021年9月12日

:::note warn
警告
本記事はTeradata Corporationのサイト[Getting Started](https://quickstarts.teradata.com/index.html#getting-access-to-vantage)に掲載された内容を抄訳したものです。掲載内容の正確性・完全性・信頼性・最新性を保証するものではございません。正確な内容については、原本をご参照下さい。
また、修正が必要な箇所や、ご要望についてはコメントをよろしくお願いします。
:::

# 概要
機械学習モデルのアイデアを素早く検証したい場合があります。
・モデルの種類は決まっているますがまだMLパイプラインで運用する気はない。
・思い描いた関係が存在するかどうかをテストしたい。
・本番環境であっても、MLopsで常に再学習する必要がない。
そのような場合は、Vantageアナリティクス・ライブラリとそれがサポートする複数のMLモデルタイプを使用することができます。

# 前提条件
Teradata Vantageインスタンスにアクセスする必要があります。

::: note info
Vantageの新しいインスタンスが必要な場合は、[Google Cloud](https://qiita.com/ykswi/items/10a382de5fa5a4a42c50)、[Azure](https://qiita.com/ykswi/items/2c30aa1f5413b16c838c)、[AWS](https://qiita.com/ykswi/items/fba559149ad568678d58)のクラウドにVantage Expressという無料版をデプロイメントすることができます。また、[VMware](https://qiita.com/ykswi/items/ebe1d854c38db9bb0f51)、[VirtualBox](https://qiita.com/ykswi/items/ffadaa375add309f2075)、または[UTM](https://qiita.com/ykswi/items/94995954ae723185c2f7)を使用して、ローカルマシン上でVantage Expressを実行することもできます。
:::

# Vantageアナリティクス・ライブラリのインストール
Vantageで機械学習をサポートするには、Vantageアナリティクス・ライブラリが必要です。このセクションでは、VantageにVantageアナリティクス・ライブラリをインストールし、いくつかのサンプルデータをロードします。

①	Vantageアナリティクス・ライブラリはrpmファイルとして配布されます。[Teradata Downloads](https://downloads.teradata.com/download/database/analytics-library) にアクセスし、Vantageアナリティクス・ライブラリのrpmをローカルマシンにダウンロードします。

②	そのファイルをVantageインストールにアップロードします。Vantage Express をローカルで実行する場合、多くの方法があります。

□[VirtualBox on Vantage Express](https://quickstarts.teradata.com/getting.started.vbox.html)をインストールした場合、ファイルをVMのデスクトップにドラッグ＆ドロップすることができます。また、ポート**4422**に接続して**scp**を使用することもできます。

```:CopyrpmFile
scp -P 4422 ~/Downloads/VAL-2.0.0.3-1.x86_64.rpm root@localhost:/root/Desktop
```

□VMwareを使用していてドラッグ＆ドロップが有効になっている場合は、ファイルを仮想マシンのデスクトップにドラッグ＆ドロップすることができるはずです。

□VantageノードにSSHでアクセスできる場合は、scpコマンドを使ってバイナリをアップロードすることができます。

```:sshtoVantage
scp ~/Downloads/VAL-2.0.0.3-1.x86_64.rpm root@vantage.server.name:/tmp/
```
③	ここでVantageアナリティクス・ライブラリの関数とプロシージャがインストールされる新しいデータベースを作成します。Vantageアナリティクス・ライブラリをSYSLIBなどのグローバルな場所にインストールすることもできますが、特定のデータベースにインストールすることで何か問題が発生した場合にやり直すことが容易になります。VALというデータベースを作成し、ユーザーに適切なパーミッションを与えましょう。
データベース名とユーザーIDを利用している環境に合わせてください。

```sql:CreateDatabase.sql
CREATE DATABASE val
AS PERMANENT = 60e6, -- 60MB
    SPOOL = 120e6; -- 120MB

GRANT CREATE FUNCTION ON val to dbc;
GRANT ALTER FUNCTION ON val to dbc;
GRANT EXECUTE PROCEDURE on SQLJ.REMOVE_JAR to dbc;
GRANT EXECUTE PROCEDURE on SQLJ.INSTALL_JAR to dbc;
GRANT EXECUTE PROCEDURE on SQLJ.REPLACE_JAR to dbc;
GRANT CREATE EXTERNAL PROCEDURE ON val to dbc;
```

④	仮想マシンでターミナルを開きインストール作業を開始します。必要に応じてrpmのパスを変更してください。

```:Runrpm
rpm -Uvh --nodeps ~/Desktop/VAL-2.0.0.3-1.x86_64.rpm
```

⑤	インストールウィザードは、ホスト名、ユーザID、およびパスワードの入力を要求します。Vantage Expressの仮想マシン上でインストールを実行する場合、値は次のとおりです。

□ホスト名：localhost
□ユーザID：dbc
□パスワード：dbc
□アカウント文字列：空白のまま、ENTERキーを押します。
□BTEQまたはFASTLOADコマンド：空白のまま、ENTERキーを押します。

⑥	ウィザードはVantageアナリティクス・ライブラリのどの部分をインストールするかを選択するよう求めます。まず、**td_analyze**プロシージャ、つまりオプション1のインストールから始めたいと思います。オプション1を選択するとスクリプトは**td_analyze**がインストールされるデータベース名の入力を要求します。**val**を入力し、ENTERキーを押します。

⑦	ウィザードの途中でオプション5、すなわち**Tutorial Tables**をインストールします。これらは、サンプルモデルを構築するために使用するデータを含むサンプルテーブルです。


# サンプルデータ
VAL とサンプルテーブルがロードされたので、データを調査してみましょう。これは架空のデータセットで、銀行の顧客 (1,000行程度)、口座 (10,000行程度)、取引 (100,000行程度) からなっています。これらは互いに次のような関係になっています。

![画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742714/5c23b605-5fd2-b393-e49b-67f7a8dc5cdf.png)

ここからは表中のクレジットカードに関連しないすべての変数に基づいて銀行の顧客がクレジットカードで持っている毎月の平均残高を予測するモデルを構築できるかどうかを試します。

# 線形回帰モデルを作成する
まずは、上記の3つのテーブルを結合したワイドテーブル（Analytic Data Set、ADS）を作成しましょう。

::: note info
以下のクエリーの実行にはVantageアナリティクス・ライブラリがインストールされているDatabaseのCREATE TABLE権限を持っている必要があります。
:::

```sql:CreateTableADS.sql
-- Switch to val database.
DATABASE val;

-- Create the ADS.
CREATE TABLE VAL_ADS AS (
    SELECT
        T1.cust_id  AS cust_id
       ,MIN(T1.income) AS tot_income
       ,MIN(T1.age) AS tot_age
       ,MIN(T1.years_with_bank) AS tot_cust_years
       ,MIN(T1.nbr_children) AS tot_children
       ,CASE WHEN MIN(T1.marital_status) = 1 THEN 1 ELSE 0 END AS single_ind
       ,CASE WHEN MIN(T1.gender) = 'F' THEN 1 ELSE 0 END AS female_ind
       ,CASE WHEN MIN(T1.marital_status) = 2 THEN 1 ELSE 0 END AS married_ind
       ,CASE WHEN MIN(T1.marital_status) = 3 THEN 1 ELSE 0 END AS separated_ind
       ,MAX(CASE WHEN T1.state_code = 'CA' THEN 1 ELSE 0 END) AS ca_resident_ind
       ,MAX(CASE WHEN T1.state_code = 'NY' THEN 1 ELSE 0 END) AS ny_resident_ind
       ,MAX(CASE WHEN T1.state_code = 'TX' THEN 1 ELSE 0 END) AS tx_resident_ind
       ,MAX(CASE WHEN T1.state_code = 'IL' THEN 1 ELSE 0 END) AS il_resident_ind
       ,MAX(CASE WHEN T1.state_code = 'AZ' THEN 1 ELSE 0 END) AS az_resident_ind
       ,MAX(CASE WHEN T1.state_code = 'OH' THEN 1 ELSE 0 END) AS oh_resident_ind
       ,MAX(CASE WHEN T2.acct_type = 'CK' THEN 1 ELSE 0 END) AS ck_acct_ind
       ,MAX(CASE WHEN T2.acct_type = 'SV' THEN 1 ELSE 0 END) AS sv_acct_ind
       ,MAX(CASE WHEN T2.acct_type = 'CC' THEN 1 ELSE 0 END) AS cc_acct_ind
       ,AVG(CASE WHEN T2.acct_type = 'CK' THEN T2.starting_balance+T2.ending_balance ELSE 0 END) AS ck_avg_bal
       ,AVG(CASE WHEN T2.acct_type = 'SV' THEN T2.starting_balance+T2.ending_balance ELSE 0 END) AS sv_avg_bal
       ,AVG(CASE WHEN T2.acct_type = 'CC' THEN T2.starting_balance+T2.ending_balance ELSE 0 END) AS cc_avg_bal
       ,AVG(CASE WHEN T2.acct_type = 'CK' THEN T3.principal_amt+T3.interest_amt ELSE 0 END) AS ck_avg_tran_amt
       ,AVG(CASE WHEN T2.acct_type = 'SV' THEN T3.principal_amt+T3.interest_amt ELSE 0 END) AS sv_avg_tran_amt
       ,AVG(CASE WHEN T2.acct_type = 'CC' THEN T3.principal_amt+T3.interest_amt ELSE 0 END) AS cc_avg_tran_amt
       ,COUNT(CASE WHEN ((EXTRACT(MONTH FROM T3.tran_date) + 2) / 3) = 1 THEN T3.tran_id ELSE NULL END) AS q1_trans_cnt
       ,COUNT(CASE WHEN ((EXTRACT(MONTH FROM T3.tran_date) + 2) / 3) = 2 THEN T3.tran_id ELSE NULL END) AS q2_trans_cnt
       ,COUNT(CASE WHEN ((EXTRACT(MONTH FROM T3.tran_date) + 2) / 3) = 3 THEN T3.tran_id ELSE NULL END) AS q3_trans_cnt
       ,COUNT(CASE WHEN ((EXTRACT(MONTH FROM T3.tran_date) + 2) / 3) = 4 THEN T3.tran_id ELSE NULL END) AS q4_trans_cnt
    FROM Customer AS T1
        LEFT OUTER JOIN Accounts AS T2
            ON T1.cust_id = T2.cust_id
        LEFT OUTER JOIN Transactions AS T3
            ON T2.acct_nbr = T3.acct_nbr
GROUP BY T1.cust_id) WITH DATA UNIQUE PRIMARY INDEX (cust_id);
```

データセットからパラメータを取得して、クレジットカードの月次残高を予測する線形回帰モデルを構築します。


**td_analyze** を呼び出して、線形モデルを作成します。入力はテーブル **VAL_ADS** にあり、複数の列で構成されています。従属変数は**cc_avg_bal**です。モデルは、**LINEAR_REGRESSION_DEMO**というテーブルとして**val**データベースに書き込まれます。

```sql:RunLinear.sql
call td_analyze('linear',
  'database=val;
  tablename=VAL_ADS;
  columns=tot_age,tot_income,tot_cust_years,tot_children,single_ind,female_ind,married_ind,separated_ind,ck_acct_ind,sv_acct_ind,sv_avg_bal,ck_avg_bal,ca_resident_ind,ny_resident_ind,tx_resident_ind,il_resident_ind,az_resident_ind,oh_resident_ind;
  dependent=cc_avg_bal;
  outputdatabase=val;
  outputtablename=linear_regression_demo');
```

このプロシージャではいくつかの出力テーブルが作成されます。この時点でテーブルの中身を確認する必要はありません。それでは新しく作成されたモデルを使ってどのようにスコアリングを行うかを見てみましょう。

# スコアリング

このモデルを使って、予測を行い、スコアを評価しましょう。これを行うには、**linearscore**パラメータを指定して**td_analyze**を呼び出します。
入力テーブル(**VAL_ADS**)、モデルテーブル(prefix **linear_regression_demo**)を指定し、**val**データベースのターゲットテーブル(**linear_regression_score**)を作成しています。

```sql:RunLinearscore.sql
call td_analyze('linearscore',
  'database=val;
  tablename=VAL_ADS;
  modeldatabase=val;
  modeltablename=linear_regression_demo;
  outputdatabase=val;
  outputtablename=linear_regression_score;
  predicted=estimate;
  retain=cc_avg_bal;
  scoringmethod=scoreandevaluate;');
```

その結果、実際のバランス、予測されたバランス、そしてこの2つの差を含む **linear_regression_score** テーブルが得られます。
結果のサンプルを見てみましょう。

```sql:SelectLinearRegressionScore.sql
SELECT * FROM linear_regression_score SAMPLE 10;
```

このクエリーで結果が得られるでしょう。

|cust_id|cc_avg_bal|estimate|Residual|
|-------:|------------------:|------------------:|-------------------:|
|1362498|0.0|284.7057772484358|-284.7057772484358|
|1362828|1184.35|463.74177458594215|720.6082254140578|
|1362839|2933.135802469136|982.9240031182255|1950.2117993509103|
|1362986|500.9148148148148|881.4116539412856|-380.4968391264708|
|1362511|235.85941489361701|294.35369563202846|-58.494280738411426|
|1363134|0.0|430.27950420065997|-430.27950420065997|
|1363481|0.0|411.2359958542745|-411.2359958542745|
|1362644|209.3304347826087|279.75770904482033|-70.42727426221163|
|1363141|0.0|550.1681921045503|-550.1681921045503|
|1363290|0.0|120.35348558871233|-120.35348558871233|

# まとめ
今回のクイックスタートでは、SQLで機械学習モデルを作成する方法について学びました。方法としては、Vantageアナリティクス・ライブラリを使用しました。線形回帰モデルを構築しそのモデルを使用して予測を実行することがSQLのみで行うことができました。

＃さらに詳しく
　・[Vantage Analytics Library User Guide](https://docs.teradata.com/r/DqJoLxuCtoR947URt1aH0w/root)

#### Teradata Vantageへのお問合せ
[Teradata Vantage へのお問合せ](https://www.teradata.jp/About-Us/Contact)