3. • Data volumes
• Level of scrutiny from courts
and regulators
• Number/types of orgs needing to
comply
• Global regulations
• Aging applications
• Litigation/investigations
Network
Management/
Data ProtectorCOBOL
40
years
新生Micro Focusグループ
30
years
24. 地理空間分析 リアルタイム分
析
テキスト分析
イベントシリー
ズ
パターンマッチ
ング
タイムシリーズ 機械学習 回帰分析
BIツール
R Java Python
USER
DEFINED
LOADS
ユーザー定義関数
C++
ODBC
JDBC
OLEDB
SQL
External tables to analyze in place
Security
User Defined Storage
ビッグデータエコシステムにおけるVerticaの位置づけ
Verticaは、高度な分析・機械学習処理を高速に実行するためのDBエンジンです
データ変換
メッセージングバス
ETL
46. 4
6
Depot Usage Percentage
0.05%
Also a link to Depot Activity:
Find out what’s happening in Depot!
データベースサイズ、デポの
全体的なデータサイズと
アクティブなコンピューティング
データサイズを表示
MC GUIのストレージ管理者画面でEonモードのデポを表示
67. データ準備:データをテーブルにロード
下記SQLを実行し、データをロードします。
copy sm_consumption FROM '/home/dbadmin/sm_consumption.csv' delimiter ',';
copy sm_weather FROM '/home/dbadmin/sm_weather.csv' delimiter ',';
copy sm_meters FROM '/home/dbadmin/sm_meters.csv' delimiter ',';
copy sm_residences FROM '/home/dbadmin/sm_residences.csv' delimiter ',';
■データベース管理ツール dbvisualizer(無償版)から
上記のクエリを実行
データベース管理ツール dbvisualizer(無償版)は、以
下のリンクからダウンロード可能です。Verticaへ接続
用のJDBCドライバーは含まれています。
https://www.dbvis.com/download/
68. データ理解:ロード済みのデータ確認
Verticaのバージョン、ノード構成を確認します。下記SQLを実行してください。
select version();
select * from nodes;
データロード状況を確認します。
--view the data
select * from sm_consumption limit 10;
select * from sm_weather limit 10;
select * from sm_meters limit 10;
select * from sm_residences;
--table count
select count(*) from sm_consumption;
select count(*) from sm_weather ;
select count(*) from sm_meters ;
select count(*) from sm_residences;
70. データ準備:外れ値の計算結果を利用し、中間加工用テーブルを生成
外れ値を計算したテーブル(sm_outliers)とオリジナルデータのテーブル(sm_consumption)を
結合し、機械学習で利用する中間加工用のテーブルをCTAS(Create Table As Select)で準備します。
create table sm_consumption_outliers as
select nextval('seq') as id, c.*, case when o.value is null then 0 else 1 end as highusage
from sm_consumption c left outer join sm_outliers o on c.meterid=o.meterid and
c.dateUTC=o.dateUTC;
外れ値で計算した結果(テーブ
ル sm_outliers )とオリジナル
データを結合し、使用が多い
データを準備
■sm_consumptionテーブル
(約120万レコード)
■sm_outliersテーブル
(約16万レコード)
■sm_consumption_outliersテーブル
(約120万レコード)
72. データ準備:k-meansで居住地をクラスリング(2)
Kmeansでクラスタリングした情報とオリジナルデータとデータ結合し、別テーブルを作成しま
す。
CREATE TABLE sm_meters_location AS
SELECT meterid, residenceType, latitude, longitude,
APPLY_KMEANS(latitude, longitude USING PARAMETERS model_name='sm_kmeans') AS locationid
FROM sm_meters;
APPLY_KMEANS関数でクラスタリングし
た情報を列として追加
■sm_metersテーブル
(1000レコード)
■sm_meters_locationテーブル
(1000レコード)
kmeansで分類したIDを
locationid列として追加
■ sm_meters_locationテーブルの情報を
Tableauで可視化
73. データ準備:時系列の違うデータの欠損値を自動補完
時系列で、異なるサンプリング間隔のデータ(sm_consumptionとsm_weatherテーブル)を結合します。
select distinct cdate, wdate, temperature, humidity
from
(SELECT c.meterid, c.dateUTC as cdate, w.dateUTC as wdate, w.temperature, w.humidity, c.value
FROM sm_consumption c left outer join sm_weather w on c.dateUTC = w.dateUTC order by cdate) a
order by 1 limit 10;
create table sm_weather_fill as
SELECT ts as dateUTC,
TS_FIRST_VALUE(temperature, 'LINEAR') temperature,
TS_FIRST_VALUE(humidity, 'LINEAR') humidity
FROM sm_weather
TIMESERIES ts AS '15 minutes' OVER (ORDER BY dateUTC);
30分間隔のデータを基に
15分と45分を線形でデータ補完
15分、45分時点の
データがNULLで欠損
15分、45分時点のデータが補完
タイムシリーズ関数(TS_FIRST_VALUE)にて、欠損したデータを比例関係でデータ補完します。
■サンプリング間隔の違いからNULLが出力 ■保管したデータと合わせて
sm_weather_fillテーブルを作成
74. データ準備:下準備したテーブル情報をフラットテーブル化(1)
機械学習で利用するデータをテーブルとして準備します。日時データを利用し特徴量エンジニ
アリング実施し、トレーニングデータとテストデータにランダムにラベリングします。
create table sm_flat_pre as
select c.id, c.meterid, r.description as metertype, l.latitude, l.longitude,
l.locationid::varchar,
dayofweek(c.dateUTC)::varchar as 'DOW',
case when month(c.dateUTC) >= 3 and month(c.dateUTC) <= 5 then 'Spring'
when month(c.dateUTC) >= 6 and month(c.dateUTC) <= 8 then 'Summer'
when month(c.dateUTC) >= 9 and month(c.dateUTC) <= 11 then 'Fall'
else 'Winter' end as 'Season',
case when hour(c.dateUTC) >= 6 and hour(c.dateUTC) <= 11 then 'Morning'
when hour(c.dateUTC) >= 12 and hour(c.dateUTC) <= 17 then 'Afternoon'
when hour(c.dateUTC) >= 18 and hour(c.dateUTC) <= 23 then 'Evening'
else 'Night' end as 'TOD’,
w.temperature, w.humidity, c.highusage, c.highusage::varchar as highusage_char, c.value,
case when random() < 0.3 then 'test' else 'train' end as part
from sm_consumption_outliers c
inner join sm_meters_location l on c.meterid = l.meterid
inner join sm_residences r on l.residenceType = r.id
inner join sm_weather_fill w on c.dateUTC = w.dateUTC;
ランダム関数を使いデータ分割
30%をテストデータ
70%をトレーニングデータ
dateUTCのタイムスタンプ情報よ
り、Season列として、四季のラ
ベリング
dateUTCのタイムスタンプ情報よ
り、TOD(Time Of Day)列として、
時間帯をラベリング
77. データ準備:One Hot Encodingでカテゴリカル変数をダミー変数に変換
カテゴリデータの特徴量をカテゴリカル変数ごとに列を作成し、数値データであるダミー変数
に変換します。
SELECT ONE_HOT_ENCODER_FIT ('sm_ohe','sm_flat_pre','metertype, locationid, DOW, Season, TOD');
ALTER TABLE sm_flat
RENAME COLUMN metertype_1 TO multi_family;
ALTER TABLE sm_flat
RENAME COLUMN metertype_2 TO single_family;
ALTER TABLE sm_flat
RENAME COLUMN locationid_1 TO loc1;
ALTER TABLE sm_flat
RENAME COLUMN locationid_2 TO loc2;
ALTER TABLE sm_flat
RENAME COLUMN locationid_3 TO loc3;
ALTER TABLE sm_flat
RENAME COLUMN locationid_4 TO loc4;
ALTER TABLE sm_flat
RENAME COLUMN locationid_5 TO loc5;
ALTER TABLE sm_flat
RENAME COLUMN dow_1 TO monday;
ALTER TABLE sm_flat
RENAME COLUMN dow_2 TO tuesday;
ALTER TABLE sm_flat
RENAME COLUMN dow_3 TO wednesday;
ALTER TABLE sm_flat
RENAME COLUMN dow_4 TO thursday;
ALTER TABLE sm_flat
RENAME COLUMN dow_5 TO friday;
ALTER TABLE sm_flat
RENAME COLUMN dow_6 TO saturday;
ALTER TABLE sm_flat
RENAME COLUMN season_1 TO spring;
ALTER TABLE sm_flat
RENAME COLUMN season_2 TO summer;
ALTER TABLE sm_flat
RENAME COLUMN season_3 TO winter;
ALTER TABLE sm_flat
RENAME COLUMN tod_1 TO evening;
ALTER TABLE sm_flat
RENAME COLUMN tod_2 TO morning;
ALTER TABLE sm_flat
RENAME COLUMN tod_3 TO night;
ダミー変数で利用している列名を読みやすい名前に変換します。
SELECT GET_MODEL_SUMMARY
(USING PARAMETERS
model_name='sm_ohe');
カテゴリデータの特徴量をカテゴリカル変
数ごとに列を作成し、数値データであるダ
ミー変数に変換します。
モデル名 分析対象のテーブル名 分析対象のカテゴリカル変数の列名
■変換するデータのサマ
リーを確認
モデル名
78. データ準備:One Hot Encodingと正規化機能でフラットテーブル化
前段で作成したOne Hot Encodingと正規化機能でデータ変換したデータをsm_flatテーブルに書き
出します。
create table sm_flat as
select APPLY_ONE_HOT_ENCODER(* USING PARAMETERS model_name='sm_ohe')
FROM
(SELECT APPLY_NORMALIZE (* USING PARAMETERS model_name = 'sm_normfit') FROM sm_flat_pre) a;
モデル名
モデル名 分析対象のテーブル名humidity, temperatureを正規化
Sm_oheで指定した列ごとに変換
機械学習のモデリングで使用するデータ加工したテーブル sm_flatを確認します。
select * from sm_flat limit 20;
数値範囲が異なる湿度と
温度が正規化された
カテゴリカル変数がダ
ミー変数に変換された
84. モデリング:R言語ライブラリをモデリングで利用する手順
Rファイルを設置し、Rライブラリを利用してモデリングを実行します。R言語記述したファイ
ルをVerticaノード配下に配置し、以下のクエリを実行します。
CREATE library rflib AS '/home/dbadmin/rf_udf.R' LANGUAGE 'R';
CREATE transform FUNCTION rf_build_udf AS LANGUAGE 'R' name 'rf_build_factory' library rflib;
CREATE transform FUNCTION rf_score_udf AS LANGUAGE 'R' name 'rf_score_factory' library rflib;
--run rf_build_udf
SELECT
rf_build_udf("highusage_char", "metertype", "locationid", "Season", "DOW", "TOD", "temperature", "humidity"
using parameters append_date=1, model_name='my_rf_model', model_folder='/home/dbadmin')
over ()
FROM sm_flat_train;
create table sm_pred_rfudx as SELECT
rf_score_udf("id", "highusage_char", "metertype", "locationid", "Season", "DOW", "TOD",
"temperature", "humidity"
using parameters model='/home/dbadmin/my_rf_model-2018-09-20-11-17-52.rda')
over ()
FROM sm_flat;
登録したR言語で記述したユーザ定義拡張機能(UDx)を以下のクエリで実行します。
テーブルsm_flatのデータを使用し、R言語のモデルにて予測した結果をテーブルsm_pred_rfudx
にCTASで出力します。
上記で作成したモデル作成のUDx モデル作成で利用する列名トレーニング用データ
上記で出力したモデルファイル
Rモデルのファイル出力先
モデルを利用した予測のUDx予測対象のデータ
85. 評価:グリッドサーチの結果を一覧表示(予測精度の比較)(1)
CREATE TABLE sm_flat_pred AS
(SELECT a.*,
PREDICT_linear_REG(multi_family, single_family, loc1, loc2, loc3, loc4, loc5, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday,
winter, Summer, spring, night, morning, Evening, temperature, humidity
USING PARAMETERS model_name='sm_linear') as lin_reg_pred,
PREDICT_SVM_REGRESSOR(multi_family, single_family, loc1, loc2, loc3, loc4, loc5, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday,
winter, Summer, spring, night, morning, Evening, temperature, humidity
USING PARAMETERS model_name='sm_svm_reg') as svm_reg_pred,
predict_rf_regressor(metertype, locationid, DOW, Season, TOD, temperature, humidity
USING PARAMETERS model_name='sm_rf_reg') as rf_reg_pred,
PREDICT_LOGISTIC_REG(multi_family, single_family, loc1, loc2, loc3, loc4, loc5, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday,
winter, Summer, spring, night, morning, Evening, temperature, humidity
USING PARAMETERS model_name='sm_logistic', type='probability') AS log_reg_prob,
PREDICT_LOGISTIC_REG(multi_family, single_family, loc1, loc2, loc3, loc4, loc5, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday,
winter, Summer, spring, night, morning, Evening, temperature, humidity
USING PARAMETERS model_name='sm_logistic', type = 'response') AS log_reg_pred,
PREDICT_LOGISTIC_REG(multi_family, single_family, loc1, loc2, loc3, loc4, loc5, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday,
winter, Summer, spring, night, morning, Evening, temperature, humidity
USING PARAMETERS model_name='sm_logistic', cutoff='0.15') AS log_reg_pred15 ,
PREDICT_NAIVE_BAYES (multi_family, single_family, loc1, loc2, loc3, loc4, loc5, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday,
winter, Summer, spring, night, morning, Evening, temperature, humidity
USING PARAMETERS model_name = 'sm_nb',type = 'probability', class='1')::float AS nb_prob,
PREDICT_NAIVE_BAYES (multi_family, single_family, loc1, loc2, loc3, loc4, loc5, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday,
winter, Summer, spring, night, morning, Evening, temperature, humidity
USING PARAMETERS model_name = 'sm_nb',type = 'response') AS nb_pred,
case when PREDICT_NAIVE_BAYES (multi_family, single_family, loc1, loc2, loc3, loc4, loc5, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday,
winter, Summer, spring, night, morning, Evening, temperature, humidity
USING PARAMETERS model_name = 'sm_nb',type = 'probability', class='1')::float > 0.15 then 1 else 0 end AS nb_pred15,
PREDICT_RF_CLASSIFIER (metertype, locationid, DOW, Season, TOD, temperature, humidity
USING PARAMETERS model_name = 'sm_rf',type = 'probability', class='1')::float AS rf_class_prob,
PREDICT_RF_CLASSIFIER (metertype, locationid, DOW, Season, TOD, temperature, humidity
USING PARAMETERS model_name = 'sm_rf',type = 'response') AS rf_class_pred,
case when PREDICT_RF_CLASSIFIER (metertype, locationid, DOW, Season, TOD, temperature, humidity
USING PARAMETERS model_name = 'sm_rf',type = 'probability', class='1')::float > 0.15 then 1 else 0 end AS rf_class_pred15,
case when b.pred = '0' then 1 - b.maxprob else b.maxprob end as r_rf_class_prob,
case when b.pred = '1' or (b.pred = '0' and b.maxprob <= 0.85) then 1 else 0 end as r_rf_class_pred15
FROM sm_flat a inner join sm_pred_rfudx b on a.id = b.id);
作成した機械学習モデルを使用して、フラットテーブルsm_flatに予測結果を列として追加し、
ます。テーブルsm_flat_predに出力します。
87. 評価:モデルの精度評価
MSE, 決定係数(R-squared)ROCテーブル、混合行列(Confusion Matrix)で精度を比
較します。
--MSE
select MSE (value, lin_reg_pred) over() from sm_flat_pred where part = 'test';
--決定係数(R-squared)
select corr(value, lin_reg_pred)^2 as r_square from sm_flat_pred where part = 'test';
--ROCテーブル
SELECT ROC(obs::int, prob::float USING PARAMETERS num_bins=20) OVER()
FROM (SELECT highusage AS obs, log_reg_prob as prob FROM sm_flat_pred where part='test') a;
--混合行列 confusion matrix
SELECT CONFUSION_MATRIX(obs::int, pred::int USING PARAMETERS num_classes=2) OVER()
FROM (SELECT highusage AS obs, log_reg_pred15 as pred FROM sm_flat_pred where part = 'test') AS
prediction_output;
88. 評価:モデルの精度評価 ROC曲線からAUCを算出
CREATE TABLE AUC_comp
(
model varchar(50),
AUC float
);
--logistic
insert into AUC_comp
select 'logistic' as model,
sum((true_positive_rate+prev_tpr)*(prev_fpr - false_positive_rate)/2) as AUC from
(
select lag(true_positive_rate) over (order by false_positive_rate desc) as prev_tpr,
lag(false_positive_rate) over (order by false_positive_rate desc) as prev_fpr,
* from
(
select false_positive_rate, avg(true_positive_rate) as true_positive_rate from
(
SELECT ROC(obs::int, prob::float USING PARAMETERS num_bins=1000) OVER()
FROM (SELECT highusage AS obs, log_reg_prob as prob FROM sm_flat_pred where
part='test') AS prediction_output
) q1 group by false_positive_rate
) q2
) q3;
--naive bayes
insert into AUC_comp
select 'nb' as model,
sum((true_positive_rate+prev_tpr)*(prev_fpr - false_positive_rate)/2) as AUC from
(
select lag(true_positive_rate) over (order by false_positive_rate desc) as prev_tpr,
lag(false_positive_rate) over (order by false_positive_rate desc) as prev_fpr,
* from
(
select false_positive_rate, avg(true_positive_rate) as true_positive_rate from
(
SELECT ROC(obs::int, prob::float USING PARAMETERS num_bins=1000) OVER()
FROM (SELECT highusage AS obs, nb_prob as prob FROM sm_flat_pred where
part='test') AS prediction_output
) q1 group by false_positive_rate
) q2
) q3;
--random forest
insert into AUC_comp
select 'rf' as model,
sum((true_positive_rate+prev_tpr)*(prev_fpr - false_positive_rate)/2) as AUC from
(
select lag(true_positive_rate) over (order by false_positive_rate desc) as prev_tpr,
lag(false_positive_rate) over (order by false_positive_rate desc) as prev_fpr,
* from
(
select false_positive_rate, avg(true_positive_rate) as true_positive_rate from
(
SELECT ROC(obs::int, prob::float USING PARAMETERS num_bins=1000) OVER()
FROM (SELECT highusage AS obs, rf_class_prob as prob FROM sm_flat_pred where
part='test') AS prediction_output
) q1 group by false_positive_rate
) q2
) q3;
--random forest from R
insert into AUC_comp
select 'rfudx' as model,
sum((true_positive_rate+prev_tpr)*(prev_fpr - false_positive_rate)/2) as AUC from
(
select lag(true_positive_rate) over (order by false_positive_rate desc) as prev_tpr,
lag(false_positive_rate) over (order by false_positive_rate desc) as prev_fpr,
* from
(
select false_positive_rate, avg(true_positive_rate) as true_positive_rate from
(
SELECT ROC(obs::int, prob::float USING PARAMETERS num_bins=1000) OVER()
FROM (SELECT highusage AS obs, r_rf_class_prob as prob FROM sm_flat_pred where
part='test') AS prediction_output
) q1 group by false_positive_rate
) q2
) q3;
--compare all models
select * from AUC_comp order by AUC desc;
以下のクエリを実行し、AUCを計算します。各アルゴリズムでAUCが表示されます。
89. モデル管理:便利なモデル管理機能
モデルのファイルへエクスポート
SELECT EXPORT_MODELS ('/home/dbadmin/mlmodels', 'public.*’);
モデルをファイルからインポート
SELECT IMPORT_MODELS ('/home/dbadmin/mlmodels*' USING PARAMETERS new_schema='public’);
古いバージョンのモデルをアップグレード
SELECT UPGRADE_MODEL(USING PARAMETERS model_name = 'myLogisticRegModel');
SELECT UPGRADE_MODEL();
モデルのメタ情報を変更
ALTER MODEL mymodel RENAME to mykmeansmodel;
ALTER MODEL mykmeansmodel OWNER TO user1;
ALTER MODEL mykmeansmodel SET SCHEMA public;