Pivotal HDP + HAWQ上で機械学習ライブラリMADlibを試してみる(2)


はじめに

Pivotal HDP + HAWQのインストールについては、
Pivotal HDP + HAWQ上で機械学習ライブラリMADlibを試してみる(1)
で記述しています。今回は、PivotalがApache MadlibとしてOSS化した機械学習ライブラリMADlibをHAWQ上にインストールし、使用してみたいと思います。

Madlib v1.9では、Pivotal HD改めHDPに対応したHAWQ 2.0に対応しました。
詳細はReleaseをご確認ください。

MADlibインストール

パッケージはここからダウンロードできます。尚、今回の環境は下記の通りです。

OS:CentOS 6.7
Ambari:2.2.2
HDP:2.4
HAWQ:2.0.0
MADlib:1.9

5/9にPivotalからgpパッケージが提供されました。
それまでは、tarで落として中に含まれていたドキュメントを参考にインストールスクリプトでインストールを行ってみましたが、バージョン不適合のエラーが出る。
無理やりフォルダ構成をいじってインストールはできたもののうまく動かず、、
深くは追っていませんが、今回はgpパッケージからインストールします。

gpパッケージをインストールします。
最後にsuccessfully installed.と出ます。

mkdir /home/gpadmin/madlib

ls -l /tmp
-rw-r--r--  1 root    root    2611033 May 19 11:24 madlib-ossv1.9_pv1.9.5_hawq2.0-rhel5-x86_64.solitairetheme8

tar -zxvf /tmp/madlib-ossv1.9_pv1.9.5_hawq2.0-rhel5-x86_64.solitairetheme8 -C /home/gpadmin/madlib/
madlib-ossv1.9_pv1.9.5_hawq2.0-rhel5-x86_64.gppkg

ls -l /home/gpadmin/madlib/
total 2680
-rw-r--r-- 1 gpadmin gpadmin 2557445 Apr 16 10:39 madlib-ossv1.9_pv1.9.5_hawq2.0-rhel5-x86_64.gppkg
-rw-r--r-- 1 gpadmin gpadmin  135534 Apr 15 02:28 open_source_license_MADlib_1.9_GA.txt
-rw-r--r-- 1 gpadmin gpadmin   44051 Apr 15 02:34 ReleaseNotes.txt

gppkg --install /home/gpadmin/madlib/madlib-ossv1.9_pv1.9.5_hawq2.0-rhel5-x86_64.gppkg
...madlib-ossv1.9_pv1.9.5_hawq2.0-rhel5-x86_64.gppkg successfully installed.

Databaseを作成し、madpackコマンドでMADlibをインストールします。
HAWQ 2.0ではドキュメントとmadpackのパスが少し異なりますが$GPHOME/madlib/bin/madpackです。
インストールが完了したら最後にMADlib 1.9 installed successfully in MADLIB schema.が出力されます。

createdb -h namenode-02 -p 5432 madlib-test

psql madlib-test
psql (8.2.15)
Type "help" for help.

/usr/local/hawq/madlib/bin/madpack install -p hawq -c gpadmin@namenode-02:5432/madlib-test
...MADlib 1.9 installed successfully in MADLIB schema.

インストール後にMADlibの動作確認を行うことができます。回帰テストを実行しているようですが、かなり時間がかかりました(泣)
どれくらいかかったかは、下記の全ミリ秒を足して頂ければと。。

/usr/local/hawq/madlib/bin/madpack install-check -s madlib -p hawq -c gpadmin@namenode-02:5432/madlib-test
madpack.py : INFO : Detected HAWQ version 2.0.
TEST CASE RESULT|Module: array_ops|array_ops.sql_in|PASS|Time: 2887 milliseconds
TEST CASE RESULT|Module: bayes|gaussian_naive_bayes.sql_in|PASS|Time: 27239 milliseconds
TEST CASE RESULT|Module: bayes|bayes.sql_in|PASS|Time: 144832 milliseconds
TEST CASE RESULT|Module: crf|crf_train_small.sql_in|PASS|Time: 66271 milliseconds
TEST CASE RESULT|Module: crf|crf_train_large.sql_in|PASS|Time: 69897 milliseconds
TEST CASE RESULT|Module: crf|crf_test_small.sql_in|PASS|Time: 75566 milliseconds
TEST CASE RESULT|Module: crf|crf_test_large.sql_in|PASS|Time: 81538 milliseconds
TEST CASE RESULT|Module: elastic_net|elastic_net_install_check.sql_in|PASS|Time: 141132 milliseconds
TEST CASE RESULT|Module: linalg|svd.sql_in|PASS|Time: 246214 milliseconds
TEST CASE RESULT|Module: linalg|matrix_ops.sql_in|PASS|Time: 144442 milliseconds
TEST CASE RESULT|Module: linalg|linalg.sql_in|PASS|Time: 4292 milliseconds
TEST CASE RESULT|Module: pmml|table_to_pmml.sql_in|PASS|Time: 67336 milliseconds
TEST CASE RESULT|Module: pmml|pmml_rf.sql_in|PASS|Time: 64269 milliseconds
TEST CASE RESULT|Module: pmml|pmml_ordinal.sql_in|PASS|Time: 23005 milliseconds
TEST CASE RESULT|Module: pmml|pmml_multinom.sql_in|PASS|Time: 15461 milliseconds
TEST CASE RESULT|Module: pmml|pmml_glm_poisson.sql_in|PASS|Time: 11261 milliseconds
TEST CASE RESULT|Module: pmml|pmml_glm_normal.sql_in|PASS|Time: 9513 milliseconds
TEST CASE RESULT|Module: pmml|pmml_glm_ig.sql_in|PASS|Time: 9905 milliseconds
TEST CASE RESULT|Module: pmml|pmml_glm_gamma.sql_in|PASS|Time: 34263 milliseconds
TEST CASE RESULT|Module: pmml|pmml_glm_binomial.sql_in|PASS|Time: 16366 milliseconds
TEST CASE RESULT|Module: pmml|pmml_dt.sql_in|PASS|Time: 17647 milliseconds
TEST CASE RESULT|Module: prob|prob.sql_in|PASS|Time: 856 milliseconds
TEST CASE RESULT|Module: sketch|support.sql_in|PASS|Time: 87 milliseconds
TEST CASE RESULT|Module: sketch|mfv.sql_in|PASS|Time: 167 milliseconds
TEST CASE RESULT|Module: sketch|fm.sql_in|PASS|Time: 7668 milliseconds
TEST CASE RESULT|Module: sketch|cm.sql_in|PASS|Time: 13737 milliseconds
TEST CASE RESULT|Module: tsa|arima_train.sql_in|PASS|Time: 111843 milliseconds
TEST CASE RESULT|Module: tsa|arima.sql_in|PASS|Time: 119091 milliseconds
TEST CASE RESULT|Module: conjugate_gradient|conj_grad.sql_in|PASS|Time: 28276 milliseconds
TEST CASE RESULT|Module: lda|lda.sql_in|PASS|Time: 110019 milliseconds
TEST CASE RESULT|Module: stats|wsr_test.sql_in|PASS|Time: 6337 milliseconds
TEST CASE RESULT|Module: stats|t_test.sql_in|PASS|Time: 7042 milliseconds
TEST CASE RESULT|Module: stats|robust_and_clustered_variance_coxph.sql_in|PASS|Time: 52745 milliseconds
TEST CASE RESULT|Module: stats|mw_test.sql_in|PASS|Time: 3351 milliseconds
TEST CASE RESULT|Module: stats|ks_test.sql_in|PASS|Time: 4142 milliseconds
TEST CASE RESULT|Module: stats|f_test.sql_in|PASS|Time: 3544 milliseconds
TEST CASE RESULT|Module: stats|cox_prop_hazards.sql_in|PASS|Time: 140258 milliseconds
TEST CASE RESULT|Module: stats|correlation.sql_in|PASS|Time: 43725 milliseconds
TEST CASE RESULT|Module: stats|chi2_test.sql_in|PASS|Time: 6348 milliseconds
TEST CASE RESULT|Module: stats|anova_test.sql_in|PASS|Time: 2638 milliseconds
TEST CASE RESULT|Module: svec_util|svec_test.sql_in|PASS|Time: 21959 milliseconds
TEST CASE RESULT|Module: svec_util|gp_sfv_sort_order.sql_in|PASS|Time: 5365 milliseconds
TEST CASE RESULT|Module: utilities|text_utilities.sql_in|PASS|Time: 10388 milliseconds
TEST CASE RESULT|Module: utilities|path.sql_in|PASS|Time: 22815 milliseconds
TEST CASE RESULT|Module: utilities|drop_madlib_temp.sql_in|PASS|Time: 2299 milliseconds
TEST CASE RESULT|Module: assoc_rules|assoc_rules.sql_in|PASS|Time: 106534 milliseconds
TEST CASE RESULT|Module: convex|lmf.sql_in|PASS|Time: 38685 milliseconds
TEST CASE RESULT|Module: glm|poisson.sql_in|PASS|Time: 49597 milliseconds
TEST CASE RESULT|Module: glm|ordinal.sql_in|PASS|Time: 36686 milliseconds
TEST CASE RESULT|Module: glm|multinom.sql_in|PASS|Time: 35888 milliseconds
TEST CASE RESULT|Module: glm|inverse_gaussian.sql_in|PASS|Time: 35434 milliseconds
TEST CASE RESULT|Module: glm|gaussian.sql_in|PASS|Time: 48369 milliseconds
TEST CASE RESULT|Module: glm|gamma.sql_in|PASS|Time: 56914 milliseconds
TEST CASE RESULT|Module: glm|binomial.sql_in|PASS|Time: 76544 milliseconds
TEST CASE RESULT|Module: linear_systems|sparse_linear_sytems.sql_in|PASS|Time: 12537 milliseconds
TEST CASE RESULT|Module: linear_systems|dense_linear_sytems.sql_in|PASS|Time: 11960 milliseconds
TEST CASE RESULT|Module: recursive_partitioning|random_forest.sql_in|PASS|Time: 773923 milliseconds
TEST CASE RESULT|Module: recursive_partitioning|decision_tree.sql_in|PASS|Time: 258150 milliseconds
TEST CASE RESULT|Module: regress|robust.sql_in|PASS|Time: 186675 milliseconds
TEST CASE RESULT|Module: regress|multilogistic.sql_in|PASS|Time: 71249 milliseconds
TEST CASE RESULT|Module: regress|marginal.sql_in|PASS|Time: 271372 milliseconds
TEST CASE RESULT|Module: regress|logistic.sql_in|PASS|Time: 128814 milliseconds
TEST CASE RESULT|Module: regress|linear.sql_in|PASS|Time: 14019 milliseconds
TEST CASE RESULT|Module: regress|clustered.sql_in|PASS|Time: 105627 milliseconds
TEST CASE RESULT|Module: sample|sample.sql_in|PASS|Time: 353 milliseconds
TEST CASE RESULT|Module: summary|summary.sql_in|PASS|Time: 26258 milliseconds
TEST CASE RESULT|Module: kmeans|kmeans.sql_in|PASS|Time: 103760 milliseconds
TEST CASE RESULT|Module: pca|pca_project.sql_in|PASS|Time: 220072 milliseconds
TEST CASE RESULT|Module: pca|pca.sql_in|PASS|Time: 1157600 milliseconds
TEST CASE RESULT|Module: validation|cross_validation.sql_in|PASS|Time: 106514 milliseconds

MADlib動作確認

UCIの機械学習データセットをHAWQに食わせて動作確認を行います。今回は、「Air Quality Data Set」を使用することにします。約10,000行ほどのデータセットで各列の説明は下記の通りです。

0 Date (DD/MM/YYYY)
1 Time (HH.MM.SS)
2 True hourly averaged concentration CO in mg/m^3 (reference analyzer)
3 PT08.S1 (tin oxide) hourly averaged sensor response (nominally CO targeted)
4 True hourly averaged overall Non Metanic HydroCarbons concentration in microg/m^3 (reference analyzer)
5 True hourly averaged Benzene concentration in microg/m^3 (reference analyzer)
6 PT08.S2 (titania) hourly averaged sensor response (nominally NMHC targeted)
7 True hourly averaged NOx concentration in ppb (reference analyzer)
8 PT08.S3 (tungsten oxide) hourly averaged sensor response (nominally NOx targeted)
9 True hourly averaged NO2 concentration in microg/m^3 (reference analyzer)
10 PT08.S4 (tungsten oxide) hourly averaged sensor response (nominally NO2 targeted)
11 PT08.S5 (indium oxide) hourly averaged sensor response (nominally O3 targeted)
12 Temperature in °C
13 Relative Humidity (%)
14 AH Absolute Humidity

まずは、テーブルを作成してデータを投入します。csv形式のファイルを取り込んでいます。

CREATE TABLE air (CO double precision,
 PT08_S1 double precision,
 NMHC double precision,
 C6H6 double precision,
 PT08_S2 double precision,
 NOx double precision,
 PT08_S3 double precision,
 NO2 double precision,
 PT08_S4 double precision,
 PT08_S5 double precision,
 T double precision,
 RH double precision,
 AH double precision);
CREATE TABLE

COPY air FROM '/tmp/AirQualityUCI.csv' with CSV;
COPY 9357

SELECT * FROM air LIMIT 1 OFFSET 0;
 co  | pt08_s1 | nmhc | c6h6 | pt08_s2 | nox | pt08_s3 | no2 | pt08_s4 | pt08_s5 | t  | rh |  ah
-----+---------+------+------+---------+-----+---------+-----+---------+---------+----+----+------
 2.2 |  1375.5 |   80 | 9.23 |  948.25 | 172 |    1092 | 122 | 1583.75 | 1203.25 | 11 | 60 | 0.79
(1 row)

Linear Regressionを用いることが正しいかは別にして、Linear Regressionを試してみます。t(温度)にco,nox,no2がどう影響するかという仮定で行います。Linear Regressionには、madlib.linregr_trainを呼び出します。

air・・・ソーステーブル
air_linregr・・・アウトテーブル
t・・・y=ax+bにおけるyにあたる部分(依存する値)
ARRAY・・・y=ax+bのxにあたる部分(依存しない値)
'ARRAY[1, co, nox, no2]'の「1」はbにあたる部分です。1に係数がかかることで切片が導かれます。

SELECT madlib.linregr_train( 'air', 
'air_linregr',
't',
'ARRAY[1, co, nox, no2]'
)

\x ON
Expanded display is on.

SELECT * FROM air_linregr;
coef                     | {13.0016775320249,-0.0173860412316063,-0.0355744722295093,0.037472718672319}
r2                       | 0.0222459268535918
std_err                  | {0.686781796848607,0.00768313997991878,0.0029807558139089,0.00693296719744697}
t_stats                  | {18.9313077191109,-2.26288226910453,-11.9347153710178,5.40500446707986}
p_values                 | {1.82557330928406e-78,0.0236657782777995,1.34481072616316e-32,6.64011183810558e-08}
condition_no             | 515.362323749482
num_rows_processed       | 9357
num_missing_rows_skipped | 0
variance_covariance      | {{0.471669236482602,0.00334335525948873,-0.000573673035786418,-0.00112618871539455},{0.00334335525948873,5.90306399510263e-05,1.17703542489199e-06,-2.61889194380323e-05},{-0.000573673035786418,1.17703542489199e-06,8.88490522215174e-06,-1.5207399576609e-05},{-0.00112618871539455,-2.61889194380322e-05,-1.5207399576609e-05,4.80660341608757e-05}}

coefの結果を見るとco,nox,no2を変数とすれば下記のイメージかと。
t = 13 - 0.017*co - 0.035*nox + 0.037*no2

簡単な動作確認までですが、スケーラブルな機械学習ライブラリではありますが
他にも機械学習ライブラリがある中でどういった用途が向いているか要整理。
お詳しい方教えて頂けると助かります。