はじめに
機械学習において、多くの特徴量を使用することは学習時間の増加を招いたり、多重共線性の確認を難しくする可能性があります。また、データの内容を理解する際も、3次元(x,y,z)を超えると可視化が難しくなります。これらを解決する方法として、主成分分析(PCA)が用いられることがよくあります。
VerticaはPCA関数を用いることで主成分分析(PCA)を実施できます。
PCA
コマンド構文
1 2 3 4 5 |
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の間で表されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
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次元に削減します。
1 2 3 4 5 6 |
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)を確認します。
1 2 3 4 5 6 7 8 9 10 |
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(特異値)の内容を確認してみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
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関数を使用します。
1 2 3 4 5 6 7 |
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テーブルに挿入します。
1 2 |
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次元になっていることが確認できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
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倍になっています。
1 2 3 4 5 |
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)を追加します。
1 |
dbadmin=> ALTER TABLE world ADD COLUMN isTrain BOOL; |
2)全体の80%のデータに対して訓練データフラグを立てます。
1 |
dbadmin=> UPDATE world SET isTrain = (RANDOM() < 0.8); |
3)訓練データフラグがtrueのデータをtrain_dataビューに、falseのデータをtest_dataビューに分割します。
1 2 |
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モデルを作成します。
1 |
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テーブルに保存します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
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モデルを作成します。
1 |
SELECT PCA('pca_model_on_train_data','train_data','*' USING PARAMETERS exclude_columns='country, HDI2011, isTrain'); |
2)作成したPCAモデルを使用して次元削減を行い、その結果をtransformed_train_dataテーブルに保存します。
1 2 3 4 5 6 7 |
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テーブルに保存します。
1 2 3 4 5 6 7 |
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モデルを作成します。
1 |
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テーブルに保存します。
1 2 3 4 5 6 |
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)を比較してみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
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を利用することで訓練データを大幅に削減することが可能ということがわかります。
参考情報
PCAhttps://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で確認しています。- 投稿タグ
- 機械学習, machile learning, 次元削減