OpenText Analytics Database 旧Vertica

技術情報サイト

Analytics Database

データのサンプリングを行う

公開日:
更新日:
基本操作
機械学習
#テーブル
#機械学習

はじめに

TABLESAMPLE句を利用すると任意のテーブルやビューから、無作為にデータをサンプリングすることができます。
例えば、機械学習のためのデータを準備する際にTABLESAMPLE句を利用して、学習データ/テストデータの分割を行うことができます。

TABLESAMPLE

コマンド構文

dbadmin=> SELECT 列名 FROM 対象データ TABLESAMPLE(抽出パーセント);

利用例

例としてirisテーブルのデータを機械学習で利用するために、TABLESAMPLE句を使用して学習データとテストデータに分割します。
・学習データ:iris_studyに格納
・テストデータ:iris_testに格納

1) irisテーブルには100件のデータが格納されています。
dbadmin=> SELECT * FROM iris LIMIT 10;
 id | Sepal_Length | Sepal_Width | Petal_Length | Petal_Width | Species
----+--------------+-------------+--------------+-------------+---------
  1 |          5.1 |         3.5 |          1.4 |         0.2 | setosa
  2 |          4.9 |           3 |          1.4 |         0.2 | setosa
  3 |          4.7 |         3.2 |          1.3 |         0.2 | setosa
  4 |          4.6 |         3.1 |          1.5 |         0.2 | setosa
  5 |            5 |         3.6 |          1.4 |         0.2 | setosa
  6 |          5.4 |         3.9 |          1.7 |         0.4 | setosa
  7 |          4.6 |         3.4 |          1.4 |         0.3 | setosa
  8 |            5 |         3.4 |          1.5 |         0.2 | setosa
  9 |          4.4 |         2.9 |          1.4 |         0.2 | setosa
 10 |          4.9 |         3.1 |          1.5 |         0.1 | setosa
(10 rows)

dbadmin=> SELECT COUNT(*) FROM iris;
 COUNT
-------
   100
(1 row)

2) TABLESAMPLE句を利用してirisテーブルから70%のデータを抽出しiris_studyテーブルに格納します。
dbadmin=> CREATE TABLE iris_study AS SELECT * FROM iris TABLESAMPLE(70);

3) iris_studyテーブルに格納されていない残りのデータをiris_testテーブルに格納します。
dbadmin=> CREATE TABLE iris_test AS SELECT * FROM iris WHERE id NOT IN(SELECT id FROM iris_study);
CREATE TABLE

4) iris_studyテーブルには73件、iris_testテーブルには27件のデータが格納されました。
dbadmin=> SELECT COUNT(*) FROM iris_study;
 COUNT
-------
    73
(1 row)

dbadmin=> SELECT COUNT(*) FROM iris_test;
 COUNT
-------
    27
(1 row)

なお、TABLESAMPLE句で返される行数は指定したパーセントに対して厳密ではなくおおよその行数で、実行する度に変わります。

例)TABLESAMPLE(70)を複数回実行した場合の結果

dbadmin=> SELECT count(*) FROM iris TABLESAMPLE(70);
 count
-------
    67
(1 row)

dbadmin=> SELECT count(*) FROM iris TABLESAMPLE(70);
 count
-------
    71
(1 row)

dbadmin=> SELECT count(*) FROM iris TABLESAMPLE(70);
 count
-------
    70
(1 row)

参考情報

Sampling Data
https://my.vertica.com/docs/9.1.x/HTML/index.htm#Authoring/AnalyzingData/MachineLearning/DataPreparation/SamplingData.htm

検証バージョンについて

この記事の内容はVertica 9.1で確認しています。