はじめに
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)参考情報
検証バージョンについて
この記事の内容はVertica 9.1で確認しています。