OpenText Analytics Database 旧Vertica

技術情報サイト

Analytics Database

主成分分析(PCA)を用いた次元削減

公開日:
更新日:
基本操作
機械学習
#機械学習

はじめに

機械学習において、多くの特徴量を使用することは学習時間の増加を招いたり、多重共線性の確認を難しくする可能性があります。また、データの内容を理解する際も、3次元(x,y,z)を超えると可視化が難しくなります。
これらを解決する方法として、主成分分析(PCA)が用いられることがよくあります。
VerticaはPCA関数を用いることで主成分分析(PCA)を実施できます。

PCA

コマンド構文

PCA ( 'model‑name', 'input‑relation', 'input‑columns'
     [ USING PARAMETERS [exclude_columns=['excluded‑columns']
                        [, num_components=num‑components]
                        [, scale=is‑scaled]
                        [, method='method'] ] )

パラメータ名

内容

model‑name

任意のモデル名

input‑relation

対象テーブル名

input‑columns

使用する列

exclude_columns

(オプション) input‑columnsで*(全列)と指定した場合に、対象列から除外する列

num_components

(オプション) モデルに保持するコンポーネント数。 値を指定しないと、すべてのコンポーネントが保持されます。

scale

(オプション) 列を標準化するか指定。
true:共分散行列の代わりに相関行列を使用
false:(デフォルト)

method

(オプション) PCAを計算するために使用される方法。LAPACKのみ指定可能。

データ可視化のためのPCA

例として以下のworldテーブルのデータを使用します。
このテーブルには1970年から2010年までの96カ国のGDP(gdpyyyy列)とCO2排出量(emyyyy列)、及び2011年のHDI(人間開発指数)のデータが格納されています。
データセットは96行、84列(国名、GDPが41列、CO2排出レベルが41列、2011年のHDIが1列)で構成されています。
※HDI(人間開発指数)は各国の長寿、知識、人間らしい生活水準を基にした統計値で0~1の間で表されます。

dbadmin=> SELECT * FROM world LIMIT 10;
       country        | HDI2011 |   em1970    |   em1971    |   em1972    |   em1973    |   em1974    |   em1975    |   em1976    |   em1977    |   em1978    |   em1979    |   em1980    |   em1981    |   em1982    |   em1983    |   em1984    |   em1985    |   em1986    |   em1987    |   em1988    |   em1989    |   em1990    |   em1991    |   em1992    |   em1993    |   em1994    |   em1995    |   em1996    |   em1997    |   em1998    |   em1999    |   em2000    |   em2001    |   em2002    |   em2003    |   em2004    |   em2005    |   em2006    |   em2007    |   em2008    |   em2009    |   em2010    |   gdp1970   |   gdp1971   |   gdp1972   |   gdp1973   |   gdp1974   |   gdp1975   |   gdp1976   |   gdp1977   |   gdp1978   |   gdp1979   |   gdp1980   |   gdp1981   |   gdp1982   |   gdp1983   |   gdp1984   |   gdp1985   |   gdp1986   |   gdp1987   |   gdp1988   |   gdp1989   |   gdp1990   |   gdp1991   |   gdp1992   |   gdp1993   |   gdp1994   |   gdp1995   |   gdp1996   |   gdp1997   |   gdp1998   |   gdp1999   |   gdp2000   |   gdp2001   |   gdp2002   |   gdp2003   |   gdp2004   |   gdp2005   |   gdp2006   |   gdp2007   |   gdp2008   |   gdp2009   |   gdp2010
----------------------+---------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------
 Algeria              |   0.698 | 1.096570915 | 1.317742925 |  1.94148771 | 2.545069699 | 2.055100819 |  1.99949703 | 2.368993416 | 2.454152784 | 3.547510105 | 2.505675767 | 3.535836994 | 2.388316861 | 1.953971991 | 2.534360345 | 3.317148064 | 3.293451227 | 3.352024808 | 3.594821941 | 3.492414075 |  3.24466281 |  3.11821676 | 3.141132831 | 3.097162036 | 3.035233508 | 3.111325685 |   3.3467306 | 3.354239287 | 3.015670427 | 3.608257648 | 3.060244617 | 2.879527679 | 2.720453311 | 2.889312783 | 2.899236274 | 2.762219639 | 3.257009779 | 3.113135178 | 3.312874684 | 3.328944661 | 3.564360549 | 3.480976541 | 1436.129775 | 1235.663803 | 1527.646365 | 1538.306425 |  1603.34962 | 1632.296018 | 1714.070053 | 1747.665127 | 1848.437508 |  1923.29062 | 1876.075639 | 1869.621279 | 1924.614086 | 1963.365104 | 2008.472176 |  2020.08722 | 1969.764217 | 1902.061098 | 1833.152878 | 1864.712582 | 1832.743369 | 1766.660839 | 1755.973698 | 1680.379856 | 1630.381508 | 1660.004192 | 1698.333823 | 1690.237538 |   1750.6509 | 1781.142464 | 1794.405233 |  1814.41513 | 1871.921986 | 1971.512803 | 2043.135713 | 2115.186028 | 2124.957754 | 2155.485231 | 2173.787903 | 2192.703976 | 2231.980246
 Austria              |   0.885 | 6.789261266 | 6.955570959 | 7.465386491 | 7.967406198 | 7.592675124 | 7.176575974 | 7.705231431 | 7.420290758 | 7.596517081 | 8.150411477 | 6.928431961 | 7.439421516 | 7.140653327 |  6.88872302 |  7.22362896 | 7.235239262 | 7.142606182 | 7.611914817 | 7.013105469 |  7.08932007 | 7.916028563 | 8.497443146 | 7.782808183 | 7.688675585 | 7.739535636 | 7.778174302 | 7.916498335 | 8.015418493 | 8.219538404 | 7.989368994 | 7.956563584 | 8.174472454 | 8.310385132 | 8.889629244 |  8.77880008 | 9.017237523 |   8.6494461 | 8.319711838 | 8.183160018 | 7.438353474 | 7.969244347 | 11085.10449 | 11600.22295 | 12248.95167 | 12776.99245 | 13258.09388 | 13244.96435 | 13875.87098 | 14575.16601 | 14556.24303 | 15362.14184 | 15628.11853 | 15565.82167 | 15867.50615 | 16365.68683 | 16375.10914 | 16776.39194 | 17151.57949 | 17373.35717 | 17920.57394 |  18533.4758 | 19192.07172 | 19655.36566 | 19847.22018 |  19787.9258 | 20185.41806 | 20692.25631 | 21174.05212 |  21638.4083 | 22432.91072 | 23181.69316 | 23974.18307 | 24087.35538 | 24375.11384 |  24466.7063 | 24945.04777 | 25370.46587 | 26171.69091 | 27036.48733 | 27305.92329 |  26183.9976 | 26642.99386
 Bahamas              |   0.771 |  15.1977658 | 38.71746945 | 36.49163054 | 43.37612724 | 39.91730194 | 43.70025238 | 33.51392453 | 49.30065791 | 32.79496775 | 33.64240983 | 37.93763849 | 13.00948931 | 10.27455326 | 8.959657845 | 8.070210542 | 6.440619675 | 5.906826953 | 5.848914908 |  6.22451083 | 7.736290633 | 7.615983675 | 6.831643313 | 6.746663355 | 6.284917061 | 6.123846938 |  6.01556971 | 5.881101864 | 4.749022516 | 5.779425109 | 5.699779129 | 5.604998247 | 5.203256345 |  5.15585844 | 4.893601246 | 5.475436261 | 5.005876373 | 4.695545558 | 4.705128712 | 3.131921321 | 4.854818466 | 7.186250463 | 16944.17706 | 16773.32431 | 15825.01611 | 16681.08272 | 13616.13388 | 11368.41198 | 11708.97569 | 12508.23765 | 13971.07784 | 17236.66283 | 17954.41744 | 15939.86648 | 16632.42252 |  16855.9741 | 18841.51612 |  19359.4995 | 19341.59051 | 19571.05278 | 19685.36145 |  20653.8658 | 19970.50833 | 18789.34949 | 17736.28159 | 17466.21081 | 17707.13476 | 18195.24765 | 18702.81496 | 18853.24266 | 19514.56795 | 20665.69366 | 21258.29243 |  21530.3738 | 21809.34718 | 21228.07569 | 21106.72008 | 21507.71526 | 21728.70888 | 21721.61841 | 20911.59943 | 19619.12136 | 19395.15231
 Bangladesh           |     0.5 | 0.056907689 | 0.053188188 | 0.051254824 | 0.066063807 | 0.066990094 | 0.068988152 |  0.07729859 | 0.078625581 | 0.079102003 | 0.084853644 | 0.094731427 | 0.095688393 | 0.100971081 | 0.094161354 | 0.101556559 | 0.110893668 | 0.120874661 | 0.121746414 | 0.135362306 | 0.131016623 | 0.147563998 | 0.147900019 | 0.161003196 |  0.15451725 | 0.164851634 | 0.194183266 | 0.200349627 | 0.204801701 |  0.19267111 |  0.19835736 | 0.215033394 | 0.245964373 | 0.251023286 | 0.248178278 | 0.286703397 | 0.267095016 | 0.338118365 | 0.336644963 | 0.319161002 | 0.355868066 | 0.377610209 | 282.2545184 |  262.981578 | 224.2091077 | 230.0809801 |   249.85177 | 236.1923411 | 244.4665113 | 244.6789824 | 254.5800293 | 259.0515444 | 253.7822815 |  256.250629 | 255.3386127 | 258.5983764 | 264.8234246 |  266.086821 | 269.9559196 | 272.5475672 | 271.1057719 | 271.0917122 | 280.1736837 | 282.7790405 | 290.4082118 | 297.1685013 | 302.8187236 | 311.1665705 | 318.9204692 |  329.396045 | 339.8583201 | 349.6507414 | 363.6399273 | 375.9934601 | 385.8060432 | 399.3959566 | 417.9536838 | 436.6881834 | 459.8625139 |  483.970868 | 508.5557725 | 532.0769985 |  558.062385
 Burkina Faso         |   0.331 | 0.024623366 | 0.025377216 | 0.026691801 | 0.027340417 | 0.032596535 | 0.034186579 | 0.031774981 | 0.037069988 | 0.050621707 | 0.057787472 | 0.059991873 | 0.075432817 | 0.076021874 | 0.076508059 | 0.058478732 | 0.058345019 |  0.05728905 | 0.060067645 | 0.062648517 | 0.090488787 |  0.06292009 | 0.065448613 | 0.064060039 | 0.061964886 | 0.062045167 | 0.058641218 |  0.06437916 | 0.071376274 | 0.074146362 | 0.077924752 | 0.084702482 | 0.078850092 | 0.077190403 | 0.080474192 | 0.080035373 | 0.079280882 | 0.093032044 | 0.109310102 | 0.109419171 | 0.104142692 | 0.102193772 | 136.9204136 | 136.1258478 | 136.4992068 | 134.3381165 |  142.465397 | 143.6351636 | 152.5233087 | 149.7079159 | 153.0765216 |  155.037476 | 152.6101667 | 155.3058983 | 166.0239938 | 162.4890534 | 155.6079769 | 164.5876723 | 173.1336221 | 168.2577106 | 173.3623974 | 172.4278113 | 166.8412774 | 177.1102681 |  172.745855 | 173.8908427 | 171.3942466 | 176.2585051 | 190.3320226 | 196.8145029 | 205.3897943 | 214.4962792 | 212.3753864 | 220.1479407 | 223.9952322 | 235.1460232 | 239.0119506 | 252.2147193 | 261.4805054 | 263.0149271 | 270.1248597 | 269.9706467 | 282.6969373
 Costa Rica           |   0.744 | 0.686853305 | 0.819821998 | 0.923911497 | 1.047520357 | 0.953605588 | 0.995048187 | 0.992659175 |  1.21142025 | 1.317875987 |   1.2257816 | 1.051488364 | 0.934401656 | 0.842095689 | 0.826151611 |  0.76439697 | 0.841822765 | 0.942633161 | 0.970666441 | 1.008263371 |  0.99349534 | 0.962574044 | 1.060117113 | 1.175662282 | 1.196540627 | 1.556803993 | 1.402646781 | 1.334890784 | 1.366860521 | 1.421348964 | 1.441209509 | 1.396805794 | 1.439023493 | 1.549031311 | 1.592540657 | 1.636129904 | 1.644694223 | 1.697011744 | 1.925313584 | 1.911933419 | 1.702829651 | 1.667708761 | 2371.559757 | 2471.677527 | 2612.358165 | 2749.966176 | 2835.318007 | 2825.086163 | 2905.862294 | 3082.039196 | 3187.500849 | 3254.090647 | 3189.039826 | 3031.481706 | 2733.293317 | 2734.286881 | 2824.580879 | 2776.893983 | 2859.065496 | 2974.959654 | 3008.202118 | 3079.734066 | 3119.632564 | 3121.370058 |  3325.26772 | 3486.846918 | 3564.271599 | 3613.881003 | 3555.542499 | 3660.070068 | 3869.523391 | 4088.304414 | 4068.821351 | 4026.557239 | 4061.980725 | 4241.887772 | 4344.084202 | 4521.011952 | 4836.674305 | 5137.485256 | 5196.689144 | 5066.966003 | 5226.566178
 Cote d'Ivoire        |     0.4 | 0.450851633 | 0.478475499 | 0.509996196 | 0.519147705 | 0.550610321 | 0.589413246 | 0.559345599 | 0.546579627 | 0.620308019 | 0.667197176 | 0.731954395 | 0.502594676 | 0.658148517 | 0.499768805 | 0.535647128 | 0.698058196 | 0.547496273 | 0.680107022 | 0.783229371 | 0.704199299 | 0.463103135 | 0.435325112 | 0.345519064 | 0.426355694 | 0.368365676 | 0.485901035 | 0.555227448 | 0.527558288 | 0.435283101 | 0.385789334 | 0.409528933 | 0.457333148 | 0.424062366 |  0.31277628 | 0.432179251 | 0.434198441 | 0.381753139 | 0.369090155 | 0.361896603 | 0.302618026 |  0.29407195 | 852.9255887 | 894.1228027 | 891.8858825 | 903.5532123 | 900.9366863 | 931.7505003 | 1004.893839 | 1029.964383 | 1091.200333 | 1067.713471 | 909.0070675 | 900.0737956 | 863.4311611 | 795.2365324 | 742.6592873 | 746.1494783 | 742.0833526 | 713.4016106 | 696.8595185 | 693.3078299 | 662.8675347 | 641.2072899 | 618.8025745 |  598.018497 | 584.5253864 | 608.1200345 | 637.2058658 |  656.158427 | 670.6147102 | 665.9728897 | 628.2281148 | 616.5235814 | 597.5229751 | 578.9671333 | 580.1682888 | 578.0306074 | 572.2971337 | 572.0962695 | 574.9350967 | 585.3044893 | 587.5445423
 Egypt                |   0.644 | 0.603638222 | 0.627055003 | 0.678841622 | 0.619459527 | 0.665374602 | 0.774864287 | 0.840591484 | 0.902298335 | 0.915864591 | 0.977832859 | 1.006299309 | 1.107521178 | 1.199103221 | 1.182485842 | 1.290779736 | 1.261991181 | 1.436577856 |  1.40697014 | 1.369096215 | 1.296540363 | 1.335895349 | 1.358160933 |  1.37713524 | 1.551938413 | 1.397707543 | 1.542197726 |  1.61629481 | 1.685249652 | 1.871589273 |  1.88665468 | 2.088937708 | 1.820930715 | 1.812364331 |  2.06927612 | 2.071494326 | 2.253172813 | 2.363415679 | 2.500135211 | 2.512394205 | 2.481971367 |  2.52409946 | 565.9760672 | 572.2625856 | 571.0375231 | 562.6074104 | 564.1245673 | 601.1673142 | 673.9667707 |  743.659362 | 769.0496151 | 796.9975534 | 856.6007895 | 868.0588617 | 931.6261342 |  976.887535 | 1011.738562 | 1052.846372 |  1054.88802 | 1055.697719 | 1085.777682 | 1114.513204 | 1153.684513 |  1143.81312 |  1173.21007 | 1186.805731 |  1213.50565 | 1248.732698 | 1289.080933 | 1337.008939 | 1367.342647 | 1425.764651 |  1475.84441 | 1500.522743 | 1507.929351 | 1527.274258 |  1560.38394 | 1600.321838 | 1678.954796 | 1765.869427 | 1858.858447 | 1911.964501 | 1975.550031
 El Salvador          |   0.674 | 0.382730453 | 0.393722267 | 0.426469519 | 0.487625482 | 0.476935018 | 0.498263993 | 0.511405073 |  0.51855782 | 0.531550431 | 0.522102509 | 0.458307445 |  0.38764058 |  0.36827746 | 0.391112236 | 0.325701653 | 0.397793812 | 0.393454389 | 0.477989582 |  0.47621204 |  0.49226792 | 0.490920226 | 0.596743545 | 0.623504627 | 0.696687068 | 0.782039919 | 0.920919364 | 0.845218335 | 0.986509971 | 0.988698667 | 0.963950159 | 0.966617034 | 0.996866647 | 1.008477793 | 1.090506491 | 1.055822349 | 1.066576228 | 1.126953876 | 1.130494874 | 1.067764634 | 1.051118297 | 1.008882135 | 1861.494075 | 1882.638983 | 1946.632419 |    1990.629 | 2047.066605 | 2059.498059 | 2117.436716 | 2215.468043 | 2289.138261 | 2154.459307 | 1869.277719 | 1648.011288 | 1521.744682 |  1523.92489 | 1523.853512 | 1513.302416 | 1496.867323 | 1515.347176 | 1524.364234 | 1518.811516 |  1570.04653 | 1602.018937 | 1696.185962 | 1793.288017 | 1875.000075 | 1970.700359 | 1984.250943 | 2051.604252 | 2114.407971 | 2175.120985 | 2211.022459 | 2239.118645 | 2283.020652 | 2327.644216 | 2362.747667 | 2438.143651 | 2523.523599 | 2609.089915 | 2629.937905 | 2534.805972 | 2555.887676
 France               |   0.884 | 8.647469615 | 9.037871603 | 9.320518209 | 9.937511769 | 9.530918369 | 8.480986532 | 9.543478828 | 9.035339325 | 9.466648897 | 9.862765616 | 9.378557143 | 8.398516323 | 8.029095846 | 7.725745567 |   7.3707307 | 7.250959552 |  6.93797286 | 6.755887314 | 6.626696928 | 6.920428446 | 7.035870965 | 7.508045486 | 6.941837134 | 6.776778032 |  6.41039434 | 6.798462427 | 7.029040313 | 6.511920454 | 6.992889001 | 6.319416724 | 6.190346876 | 6.495829652 | 6.370695461 | 6.439525682 | 6.437106167 | 6.427193278 | 6.232633759 | 6.087139998 | 5.999020726 |  5.71531184 | 5.753381167 | 11572.96622 | 12093.53183 | 12540.90377 | 13265.17128 | 13787.34561 | 13546.39505 | 14065.37599 | 14502.01334 | 15005.48142 | 15459.34685 | 15641.97106 | 15716.90473 | 16011.14006 | 16117.64077 |  16265.1401 | 16432.99036 | 16708.21534 | 17009.83132 | 17704.04983 | 18346.29154 | 18731.66202 | 18836.73334 | 19029.93463 | 18822.69755 | 19166.19677 | 19478.17581 | 19606.05309 | 19952.90591 | 20539.07007 | 21146.39522 | 21774.99299 | 22014.02474 | 22057.63515 | 22098.99175 | 22495.24481 | 22734.23332 | 23133.35113 | 23516.22317 | 23366.40262 | 22508.76261 | 22758.15413
(10 rows)

このデータから各国のHDI(人間開発指数)と過去のGDP/CO2排出量にどのような関係があるか分析するには可視化が便利です。しかし、次元(列)が多すぎて可視化するのは困難です。
そこでPCA関数で次元を削減します。今回は過去のGDP/CO2排出量の82次元をPCAを用いて2次元に削減します。

dbadmin=> SELECT PCA('pca_model','world','*' USING PARAMETERS exclude_columns='country, HDI2011');
                              PCA
---------------------------------------------------------------
 Finished in 1 iterations.
Accepted Rows: 96  Rejected Rows: 0
(1 row)

作成したPCAモデルを確認します。まずGET_MODEL_ATTRIBUTEコマンドで利用可能な属性(columns)を確認します。

dbadmin=> SELECT GET_MODEL_ATTRIBUTE(USING PARAMETERS model_name='pca_model');

      attr_name       |                                                                                                                                                                                                                                               attr_fields                                                                                                                                                                                                                                                | #_of_rows
----------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------
 columns              | index, name, mean, sd                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |        82
 singular_values      | index, value, explained_variance, accumulated_explained_variance                                                                                                                                                                                                                                                                                                                                                                                                                                         |        82
 principal_components | index, PC1, PC2, PC3, PC4, PC5, PC6, PC7, PC8, PC9, PC10, PC11, PC12, PC13, PC14, PC15, PC16, PC17, PC18, PC19, PC20, PC21, PC22, PC23, PC24, PC25, PC26, PC27, PC28, PC29, PC30, PC31, PC32, PC33, PC34, PC35, PC36, PC37, PC38, PC39, PC40, PC41, PC42, PC43, PC44, PC45, PC46, PC47, PC48, PC49, PC50, PC51, PC52, PC53, PC54, PC55, PC56, PC57, PC58, PC59, PC60, PC61, PC62, PC63, PC64, PC65, PC66, PC67, PC68, PC69, PC70, PC71, PC72, PC73, PC74, PC75, PC76, PC77, PC78, PC79, PC80, PC81, PC82 |        82
 counters             | counter_name, counter_value                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |         3
 call_string          | call_string                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |         1
(5 rows)

本例ではsingular_values(特異値)の内容を確認してみます。

dbadmin=> SELECT GET_MODEL_ATTRIBUTE(USING PARAMETERS model_name='pca_model', attr_name='singular_values');

 index |        value        |  explained_variance  | accumulated_explained_variance
-------+---------------------+----------------------+--------------------------------
     1 |    57302.0891112066 |    0.984897289327797 |              0.984897289327797
     2 |    6123.66739335371 |   0.0112479458977945 |              0.996145235225592
     3 |    2373.31959725629 |  0.00168951667109193 |              0.997834751896684
     4 |     1561.0057291494 | 0.000730901788784184 |              0.998565653685468
     5 |    1337.35331582116 | 0.000536466180155848 |              0.999102119865624
  ・
  ・
  ・
    81 |  0.0059175981714845 | 1.05036677012617e-14 |              0.999999999999992
    82 | 0.00531320796609876 | 8.46766486306166e-15 |                              1
(82 rows)

accumulated_explained_variance列は、2次元に縮小してもデータの分散を99%以上で維持できることを示しています。
このことから、過去のGDP/CO2排出量を各国毎に2次元でプロットすることが可能であることがわかります。

次に、このモデルを適用して次元削減を行います。モデルの適用はAPPLY_PCA関数を使用します。

APPLY_PCA ( input‑columns
                   USING PARAMETERS model_name='model‑name'
                                    [, num_components=num‑components]
                                    [, cutoff=cutoff‑value]
                                    [, match_by_pos=match‑by‑position]
                                    [, exclude_columns='excluded‑columns']
                                    [, key_columns='key‑columns'] )

パラメータ名

内容

input‑columns

PCAの対象列。複数列指定する場合は「,」カンマで区切ります。

model‑name

使用するPCAのモデル名

num_components

(オプション) 保持するコンポーネント(次元)の数。 本パラメータとcutoffを省略すると、すべてのモデルコンポーネントが保持される。

cutoff

(オプション) 1に設定すると、accumulated explained varianceの最小値が指定される。 コンポーネントは、accumulated explained varianceがこの値に達するまで実行される。

match_by_pos

(オプション) 入力列と特徴量の紐付けのルール。以下のいずれかを指定。
false:入力した列名と特徴量の名前で紐付(デフォルト)
true:列名は無視し、入力した列の順番通りに紐づけ

exclude_columns

(オプション) input‑columnsで*(全列)と指定した場合に、対象列から除外する列

key_columns

(オプション) データを一意に識別するための列名。 指定した列は出力結果に含まれる。

本例では2次元に削減した結果をtransformed_data_2compテーブルに挿入します。

dbadmin=> CREATE TABLE transformed_data_2comp AS SELECT APPLY_PCA(* USING PARAMETERS model_name='pca_model',
dbadmin(>     exclude_columns='country, HDI2011', key_columns='country, HDI2011', num_components=2) OVER(PARTITION BEST) FROM world;

出力された結果を確認すると過去のGDP/CO2排出量の82次元がcol1,col2の2次元になっていることが確認できます。

dbadmin=>  SELECT * FROM transformed_data_2comp ORDER BY HDI2011 DESC;

       country        | HDI2011 |       col1        |       col2
----------------------+---------+-------------------+-------------------
 Norway               |   0.943 |  150650.121818738 | -5172.01091070905
 Australia            |   0.929 |  75525.0865191995 |  2918.93252935131
 United States        |    0.91 |  143449.445116492 |  5459.03959714617
 Netherlands          |    0.91 |  84832.5445950833 |    2863.397378487
 Canada               |   0.908 |  85446.2166693354 |  7027.35172201218
  ・
  ・
  ・
 Burundi              |   0.316 | -41460.4401873069 | -1033.71833651184
 Niger                |   0.295 | -41172.9311079596 | -816.739753508172
(96 rows)

これにより以下のように可視化することができるようになりました。
※クリックで画像拡大



x軸はcol1、y軸はcol2でポインタは各国を表しています。またポインタの色は2011年のHDI(人間開発指数)を表しており、赤色に近いほど高いHDIの国です。上記結果から基本的にはHDIが近い国は近い位置にプロットされていることがわかります。また、右下のルクセンブルグのように他の国とは異なる傾向を示しながらも、HDIが高い国があることも可視化により容易に見つけることができます。
実際にルクセンブルクのデータを確認すると、40年間でCO2排出量を半分まで削減しているにも関わらずGDPは3倍になっています。

dbadmin=> SELECT * FROM world WHERE country='Luxembourg';
       country        | HDI2011 |   em1970    |   em1971    |   em1972    |   em1973    |   em1974    |   em1975    |   em1976    |   em1977    |   em1978    |   em1979    |   em1980    |   em1981   |   em1982    |   em1983    |   em1984    |   em1985    |   em1986    |   em1987    |   em1988   |   em1989    |   em1990    |   em1991    |   em1992    |   em1993    |  em1994   |   em1995    |   em1996    |   em1997    |   em1998    |   em1999    |   em2000    |   em2001    |   em2002    |   em2003    |   em2004    |   em2005    |   em2006    |   em2007    |   em2008    |   em2009    |   em2010    |   gdp1970   |   gdp1971   |   gdp1972   | gdp1973  |   gdp1974   |  gdp1975   |   gdp1976   |   gdp1977   |   gdp1978   |   gdp1979   |   gdp1980   |   gdp1981   |   gdp1982   |   gdp1983   |  gdp1984   |   gdp1985   |   gdp1986   |   gdp1987   |  gdp1988   |   gdp1989   |   gdp1990   |   gdp1991   |   gdp1992   |  gdp1993   |   gdp1994   |   gdp1995   |   gdp1996   |   gdp1997   |   gdp1998   |   gdp1999   |   gdp2000   |   gdp2001   |   gdp2002   |   gdp2003   |   gdp2004   |   gdp2005   |   gdp2006   |   gdp2007   |   gdp2008   |   gdp2009   |   gdp2010   
----------------------+---------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+------------+-------------+-------------+-------------+-------------+-------------+-------------+------------+-------------+-------------+-------------+-------------+-------------+-----------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+----------+-------------+------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+------------+-------------+-------------+-------------+------------+-------------+-------------+-------------+-------------+------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------+-------------
 Luxembourg           |   0.867 | 40.52765854 | 38.53339561 | 38.90755131 | 40.31769249 | 40.51907152 | 32.99383026 | 32.77516178 | 30.12848263 | 32.59730076 | 33.31629316 | 30.27715076 | 25.8695682 | 24.29767949 | 22.71965331 | 24.42438335 | 24.99663682 | 24.44995074 | 23.34643992 | 23.8896039 | 25.60323208 | 26.23822327 | 27.50796058 | 27.03239862 | 27.22843294 | 25.359794 | 20.40626028 | 20.40994056 | 18.92986451 | 17.29787528 | 17.84589187 | 18.91887548 | 20.02234311 | 21.26074214 | 22.18861555 | 24.98994577 | 25.24659319 | 24.39005182 | 22.84565937 | 22.16807969 | 20.59399388 | 21.33749008 | 17466.69322 | 17762.36885 | 18706.07015 | 20038.46 | 20612.02061 | 19048.2948 | 19434.61321 | 19705.44245 | 20471.66642 | 20902.82908 | 21003.69501 | 20826.49357 | 21044.81661 | 21668.11224 | 22985.0677 | 23581.12705 | 25819.34721 | 26666.08424 | 28713.8011 | 31222.04114 | 32473.98605 | 34811.59628 | 34977.32639 | 35960.6155 | 36829.65055 | 36836.02214 | 36888.60393 | 38592.16632 | 40589.27007 | 43416.66048 | 46453.24578 | 47059.30298 | 48473.59546 | 48685.68121 | 50096.42191 | 51927.36096 | 53628.23455 | 56285.27685 | 54881.98403 | 51678.20312 | 52222.57667 
(1 row)

機械学習モデル作成のためのPCA

次に、PCAで変換したデータを機械学習の説明変数として利用する例を紹介します。

本例ではランダムフォレスト回帰を利用して、各国の過去のGDP(gdpyyyy)とCO2排出量(emyyyy)を説明変数として学習を行い、人間開発指数(HDI2011)の値を予測します。
その際、説明変数として、一方のモデルは元の列(82列)をそのまま使用し、もう一方のモデルはPCAで5次元に削減した列(5列)を使用します。両者を比較し、次元削減を行っても予測能力に大きな差が出ないことを確認します。

事前準備

まずはworldデータを訓練データとテストデータ(8:2)に分割します。

1)訓練データフラグ列(isTrain)を追加します。

dbadmin=> ALTER TABLE world ADD COLUMN isTrain BOOL;

2)全体の80%のデータに対して訓練データフラグを立てます。

dbadmin=> UPDATE world SET isTrain = (RANDOM() < 0.8);

3)訓練データフラグがtrueのデータをtrain_dataビューに、falseのデータをtest_dataビューに分割します。

dbadmin=> CREATE VIEW train_data AS SELECT * FROM world WHERE isTrain=True;
dbadmin=> CREATE VIEW test_data AS SELECT * FROM world WHERE isTrain=False;

モデル作成

元データで学習

1)元の列(82列)をそのまま使用して学習を行い、rf1モデルを作成します。

SELECT RF_REGRESSOR('rf1','train_data','HDI2011','*' USING PARAMETERS exclude_columns='country, HDI2011, isTrain', ntree=500);

2)rf1モデルを用いてtest_dataテーブルのデータを予測し、その結果をeval_rf1_on_test_dataテーブルに保存します。

dbadmin=> CREATE TABLE eval_rf1_on_test_data AS
dbadmin->        SELECT country, 
dbadmin->               HDI2011 AS true_HDI, 
dbadmin->               predict_rf_regressor(
dbadmin->                        em1970, em1971, em1972, em1973, em1974, em1975, em1976, em1977, em1978, em1979,
dbadmin->                        em1980, em1981, em1982, em1983, em1984, em1985, em1986, em1987, em1988, em1989,
dbadmin->                        em1990, em1991, em1992, em1993, em1994, em1995, em1996, em1997, em1998, em1999,
dbadmin->                        em2000, em2001, em2002, em2003, em2004, em2005, em2006, em2007, em2008, em2009, em2010,
dbadmin->                        gdp1970, gdp1971, gdp1972, gdp1973, gdp1974, gdp1975, gdp1976, gdp1977, gdp1978, gdp1979,
dbadmin->                        gdp1980, gdp1981, gdp1982, gdp1983, gdp1984, gdp1985, gdp1986, gdp1987, gdp1988, gdp1989,
dbadmin->                        gdp1990, gdp1991, gdp1992, gdp1993, gdp1994, gdp1995, gdp1996, gdp1997, gdp1998, gdp1999,
dbadmin->                        gdp2000, gdp2001, gdp2002, gdp2003, gdp2004, gdp2005, gdp2006, gdp2007, gdp2008, gdp2009, gdp2010
dbadmin->                        USING PARAMETERS model_name='rf1') AS predicted_HDI_all_features
dbadmin->        FROM test_data;
次元削減したデータで学習

1)PCAモデルを作成します。

SELECT PCA('pca_model_on_train_data','train_data','*' USING PARAMETERS exclude_columns='country, HDI2011, isTrain');

2)作成したPCAモデルを使用して次元削減を行い、その結果をtransformed_train_dataテーブルに保存します。

dbadmin=> CREATE TABLE transformed_train_data AS
dbadmin->        SELECT APPLY_PCA(* USING PARAMETERS model_name='pca_model_on_train_data', 
dbadmin->                                            exclude_columns='country, HDI2011, isTrain', 
dbadmin->                                            key_columns='country, HDI2011', 
dbadmin->                                            num_components=5) 
dbadmin->               OVER(PARTITION BEST) 
dbadmin->        FROM train_data;

3)テストデータについても同様にPCAモデルを使用して次元削減を行い、その結果をtransformed_test_dataテーブルに保存します。

dbadmin=> CREATE TABLE transformed_test_data AS
dbadmin->        SELECT APPLY_PCA(* USING PARAMETERS model_name='pca_model_on_train_data',
dbadmin->                                                        exclude_columns='country, HDI2011, isTrain', 
dbadmin->                                                        key_columns='country, HDI2011', 
dbadmin->                                                        num_components=5) 
dbadmin->               OVER(PARTITION BEST) 
dbadmin->        FROM test_data;

4)PCAで次元削減した列(5列)を使用して学習を行い、rf2モデルを作成します。

SELECT rf_regressor('rf2','transformed_train_data','HDI2011','*' USING PARAMETERS exclude_columns='country, HDI2011', ntree=500);

5)rf2モデルを用いてtransformed_test_dataテーブルのデータを予測し、その結果をeval_rf2_on_test_dataテーブルに保存します。

dbadmin=> CREATE TABLE eval_rf2_on_test_data AS
dbadmin->        SELECT country,
dbadmin->               HDI2011 AS true_HDI,
dbadmin->               predict_rf_regressor(col1, col2, col3, col4, col5
dbadmin(>                                    USING PARAMETERS model_name='rf2') AS predicted_HDI_5components
dbadmin->        FROM transformed_test_data;

予測精度の比較

実際のHDI(true_HDI)、rf1モデルの予測値(predicted_HDI_all_features)、rf2モデルの予測値(predicted_HDI_5components)を比較してみます。

dbadmin=> SELECT a.country,
dbadmin->        a.true_HDI,
dbadmin->        a.predicted_HDI_all_features,
dbadmin->        b.predicted_HDI_5components
dbadmin-> FROM eval_rf1_on_test_data AS a,
dbadmin->      eval_rf2_on_test_data AS b
dbadmin-> WHERE a.country=b.country
dbadmin-> ORDER BY a.true_HDI;

       country        | true_HDI | predicted_HDI_all_features | predicted_HDI_5components
----------------------+----------+----------------------------+---------------------------
 Burundi              |    0.316 |          0.453602253074433 |         0.502459920591421
 Liberia              |    0.329 |          0.465204531188966 |         0.645599221599036
 Mali                 |    0.359 |          0.453602253074433 |         0.502459920591421
 Malawi               |      0.4 |          0.453602253074433 |         0.502459920591421
 Cote d'Ivoire        |      0.4 |          0.475994062388975 |         0.625710767493733
 Sudan                |    0.408 |          0.453602253074433 |         0.502459920591421
 Senegal              |    0.459 |          0.454120308629989 |         0.502895099018549
 Papua New Guinea     |    0.466 |          0.493744910713526 |         0.507853026045762
 Pakistan             |    0.504 |          0.503383251036275 |         0.502459920591421
 India                |    0.547 |          0.580399201150656 |         0.502459920591421
 Morocco              |    0.582 |          0.665642120736307 |         0.585645631887124
 Honduras             |    0.625 |          0.605269590883911 |         0.570285642309769
 Philippines          |    0.644 |          0.576109998089738 |         0.626476362948508
 Turkey               |    0.699 |          0.747649753586239 |         0.719962796078666
 Costa Rica           |    0.744 |          0.738269904449996 |         0.683841472808971
 Trinidad and Tobago  |     0.76 |          0.787163068342235 |          0.76675935296072
 Uruguay              |    0.783 |          0.763458513799555 |         0.753390511660789
 Hungary              |    0.816 |          0.753604802792588 |         0.749195983000002
 Greece               |    0.861 |          0.864576040581477 |          0.78043906779403
 Luxembourg           |    0.867 |          0.879254668792156 |          0.78146287575143
 Austria              |    0.885 |          0.879125535458822 |         0.732150897302129
 Japan                |    0.901 |          0.879254668792156 |         0.770453239126421
 Netherlands          |     0.91 |          0.879254668792156 |         0.797228616163179
 United States        |     0.91 |          0.879254668792156 |         0.799275138089727
 Norway               |    0.943 |          0.879254668792156 |         0.780394500395871
(25 rows)

上記結果を可視化すると以下のようになります。
※クリックで画像拡大


rf1モデルの予測結果(黄色)とrf2モデルの予測結果(赤色)を比較してみると、次元削減を行っても大きな精度劣化は発生しないことが確認できます。つまりHDIの予測については、PCAを利用することで訓練データを大幅に削減することが可能ということがわかります。

参考情報

PCA
https://www.vertica.com/docs/9.1.x/HTML/index.htm#Authoring/SQLReferenceManual/Functions/MachineLearning/PCA.htm

APPLY_PCA
https://www.vertica.com/docs/9.1.x/HTML/index.htm#Authoring/SQLReferenceManual/Functions/MachineLearning/APPLY_PCA.htm

検証バージョンについて

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