読者です 読者をやめる 読者になる 読者になる

データ・サイエンティストは可視化の夢を見るか?

Does Data Scientist Dream of Visualization?

駆け足で進んでみる

前掲書の第 8 章 “Support Vector Machine (SVM)”、第 9 章 “An Example -- Meteorological Data”、第 10 章 “Embedding the JavaScript D3 Library in IPython notebook” まで進みました。 

 

先ず第 8 章は『サポート・ヴェクター・マシーン』によるデータの『分類』と要約していいでしょう。SVM の中身の勉強は別の書籍に譲り、此処ではまず概観を掴むことに専念します。

 

例題として、とある点列(x[ ])を与えて、それを Support Vector Classification (SVC) を使って分類していきます。このとき 'Linear' (線形)、'Poly'非線形)、'Radial Basis Function (RBF)' (放射基底関数)の 3 種のカーネルの使用が例示されています。

 

 

(此処にわたしの Jupyter の notebook (.ipynb) を貼ることは簡単ですが、やはり読者の皆さんがみずから手で打ち込んだほうが脳味噌への定着が良さそうなので、とりあえず計算結果グラフを中心に貼って説明します。それぞれのコマンドについては多くを割愛します。原典に当たってください。)

 

 

この例題では以下のような点列 x[ ] とそれぞれに基づいたグループ分け y を定義します。

x = np.array([[1,3],[1,2],[1,1.5],[1.5,2],[2,3],[2.5,1.5],[2,1],[3,1],[3,2],[3.5,1],[3.5,3]])

y = [0]*6+[1]*5   # 色分けのルール

 x[ ] を 2 次元座標に見立てて 

plt.scatter( x[ :, 0 ], x[ :, 1 ], c=y, s=50, alpha=0.9 )

 とすると以下のグラフが描画されます。y の値に従って赤と青に塗り分けられた点群が御覧になれるかと思います。

f:id:renpoo:20160825173435p:plain

 

さて、このような点群を SVC で分類してみます。先ず、カーネル線形を選んでやってみます。

svc = svm.SVC( kernel='linear' ).fit( x, y ) 

 此の結果を描画すると、

f:id:renpoo:20160825173827p:plain

見事に直線の境界線で赤と青の点群が分類されました。誤認識は青 1 個だけですね。

 

おなじ線形の SVC でも定数 C (デフォルト値は 1.0)の設定によって正則化(regularization)』してやると、

svc = svm.SVC( kernel='linear', C=1 ).fit( x, y )

f:id:renpoo:20160825174559p:plain

 点線の境界線に囲まれた点群(二重丸)だけ考慮に入れて SVC が分類してくれます。

 

でも、これでは前記のものと違いが分かりにくいです。そこで C 値を小さくしてみます。

svc = svm.SVC( kernel='linear', C=0.1 ).fit( x, y )

f:id:renpoo:20160825174902p:plain

そうすると逆に点線で描かれた境界線のあいだの幅が広がり、考慮に入れられる点群が増えました。誤認識は赤 1 個と青 1 個それぞれですね。先程とは中央の識別線(明るい緑)の位置や傾きが変化していることが見比べることで分かります。

 

さて、SVC による分類を非線形多項式(次数 = 3)にしてみたらどうなるでしょうか?

svc = svm.SVC( kernel='poly', C=1.0, degree=3 ).fit( x, y )

此の結果が以下のグラフです。全然、分類の様子が変わってきました。

f:id:renpoo:20160825175819p:plain

 

さらに、放射基底関数を選んで SVC を実行すると……、

svc = svm.SVC( kernel='rbf', C=1.0, gamma=3 ).fit( x, y )  

f:id:renpoo:20160825180126p:plain

きちんと赤・青それぞれの点群を分類してくれました。

見事なものですね。

 

 

さて同様の SVC で統計分析では有名な『フィッシャーのアヤメ』データを分類してみたらどうなるでしょうか? 以下に結果グラフのみ列挙します。

 

線形:

f:id:renpoo:20160825180821p:plain

 

非線形

f:id:renpoo:20160825180827p:plain

 

放射基底関数:

f:id:renpoo:20160825180833p:plain

 

それぞれ特色が出ていますが、実際の統計分析ではこういった複数のモデルによる計算結果を比較して、その場でふさわしいと判断した予測モデルを(暫定的に)選んで分析を進めていくのかと思ってます。

 

 

此の SVM回帰分析に使ったらどうなるでしょうか?

scikit-learn の『糖尿病』データセットに対して「線形(:青)」「非線形(2 次)(:赤)」「非線形(3 次)(:緑)」それぞれの回帰分析をしてみた結果のグラフを示します。

f:id:renpoo:20160825181525p:plain

成る程、このようにして回帰モデルを導き出し今後の予測に使っていくのですね。

 

 

第 9 章はイタリアの気象データをもとに

“What influence might the presence of the sea have on the climate of a locality?” (海が存在することによって、どのような影響が地域の気象に与えられるか?)

 という仮説を確かめよう、というものです。ところが此の気象データを提供していた http://openweathermap.org からのヒストリカル・データのダウンロードが有料化されてしまいました。ちょっと、こんな例題だけのために有料会員(月極 $150-)として登録するのも躊躇してしまいます(此処の API を使って、なにかの Web サーヴィスを立ち上げるなら別でしょう)。

当然のことですが、此の例題についての説明は本書に詳しく載っています。それをよく読んで、同様の試みを日本の気象庁のデータなどから試してみるといいかと思います。

 

さらに第 10 章 “Embedding the JavaScript D3 Library in IPython notebook” についても。此の章は、統計データに従って地図を塗り分ける例題を扱っています。ところがそのデータをもらってきたい『アメリカ合衆国国勢調査局(http://www.census.gov)』にアクセスができません。DNS が URL を解決できないのです。何故だか分かりませんが、自宅ネット環境の所為だろうとは思います(追記:モヴァイル・ルーターからアクセスしたら辿り着けました)。

 

さっと最終章である第11章まで残りのページを眺めてみたのですが、もう本書から得られる知識は十分に得た感触があるので、次の本に行きます。