【入門者向け】scikit-learn(Generalized Linear Models & Nearest Neighbors)|Python入門 #15

f:id:lib-arts:20191003162137p:plain

#1ではPythonを用いたFizzBuzzのコーディングについてまとめました。

 入門者の方に読んでみていただいたところ、少し難しかったようなので、#2〜#10ではPythonの基本文法をそれぞれもう少し丁寧に解説を行ないました。

【入門者向け】Pythonの基礎文法① 四則演算・文字列|Python入門 #2 - lib-arts’s diary

【入門者向け】Pythonの基礎文法② リスト・タプル・辞書|Python入門 #3 - lib-arts’s diary

【入門者向け】Pythonの基礎文法③ 制御構文(if、for)|Python入門 #4 - lib-arts’s diary

【入門者向け】Pythonの関数の実装|Python入門 #6 - lib-arts’s diary

【入門者向け】クラスの概要とPythonにおける実装|Python入門 #7 - lib-arts’s diary

【入門者向け】Pythonにおけるクラスの継承とオブジェクト指向|Python入門 #8 - lib-arts’s diary

次にPythonを使用する際によく用いるライブラリを見ていければということで、#11〜#13ではNumPyについて確認を行いました。

【入門者向け】NumPy①(概要と最低限知っておくと便利な機能)|Python入門 #11 - lib-arts’s diary

NumPyについては一区切りついたので、#14からは機械学習の簡単なアルゴリズムを組む際によく用いるライブラリであるscikit-learnについて取り扱っていきます。#14ではscikit-learnの概要と簡単な動作確認について行いました。

【入門者向け】scikit-learn(概要と簡単な動作確認)|Python入門 #14 - lib-arts’s diary

#15ではscikit-learnのUser Guideより、主要な機能としてGeneralized Linear ModelsとNearest Neighborsを取り扱っていきます。

User guide: contents — scikit-learn 0.21.3 documentation

以下目次になります。
1. Generalized Linear Models
2. Nearest Neighbors
3. まとめ


1. Generalized Linear Models
1節ではGeneralized Linear Modelsについて取り扱います。

1.1. Generalized Linear Models — scikit-learn 0.21.3 documentation

上記ページを参考に進めていきます。#14でも少々取り扱ったので、最初の単回帰分析(Simple Linear Regression)は図のみにして飛ばします。

f:id:lib-arts:20191003171301p:plain

f:id:lib-arts:20191003171742p:plain

上記ではreg.fitを用いて学習を行なっていますが、これはscikit-learn全般にわたってこのような仕様であると把握しておくと良いです。
次に、Ridge Regressionについて見ていきます。Ridge Regressionは学習の際に計算する係数(coefficients)の絶対値が大きくなり過ぎないように2次のペナルティ項を用いて正則化(regularization)を行なった手法になります。
説明ばかり見ていても難しいので、下記を実際に動かしてみましょう。

from sklearn import linear_model

reg1 = linear_model.LinearRegression()
reg1.fit([[0], [0.5], [1]], [0, 5, 12])
reg2 = linear_model.Ridge(alpha=.5)
reg2.fit([[0], [0.5], [1]], [0, 5, 12])

print(reg1.coef_)
print(reg1.intercept_)
print(reg2.coef_)
print(reg2.intercept_)

上記の実行結果は下記のようになります。

f:id:lib-arts:20191012235747p:plain

結果を確認すると、LinearRegressionよりもRidgeRegressionの方が係数を小さく抑えられていることがわかります。また、下記を実行することで結果を図示することが可能です。

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-1,2,0.1)
y1 = x*reg1.coef_[0]+reg1.intercept_
y2 = x*reg2.coef_[0]+reg2.intercept_

plt.plot(x,y1,color="orange")
plt.plot(x,y2,color="green")
plt.scatter([0,0.5,1],[0,5,12])
plt.show()

実行結果は下記のようになります。

f:id:lib-arts:20191012235819p:plain

Ridge回帰の方が通常のLinearRegressionよりも傾きが抑えられていることがわかります。変数が一つの問題でRidge回帰について考えてもそこまで効果はないかもしれませんが、多くの変数が与えられている時(多変量解析)や多項式で考える際(多項式近似)は一つの変数の影響を受け過ぎないようにするためにRidge回帰的な正則化の考え方は知っておくと良いです。

 

2. Nearest Neighbors
2節ではNearest Neighbor法について取り扱っていきます。Nearest Neighbor法は近いサンプルにしたがって分類を行う手法です。こちらも説明が長くなるとややこしいので早速動かしてみましょう。

from sklearn.neighbors import NearestNeighbors
import numpy as np
X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
nbrs = NearestNeighbors(n_neighbors=2, algorithm='ball_tree').fit(X)
distances, indices = nbrs.kneighbors(X)

print(indices)
print(distances)

実行結果は下記のようになります。

f:id:lib-arts:20191013001754p:plain

六つのサンプルを実際に座標軸上にプロットするとわかるのですが、0と1のサンプルは相互に近く、2は1に近く、3と4は相互に近く、5は4に近いためindicesの出力は上記のようになります。distancesは一番近いサンプルとの距離をユークリッド距離で計算しています。
また、下記を実行することで、最も近いサンプルをそれぞれのサンプルをノードとみなした有向グラフの隣接行列を得ることができます。

nbrs.kneighbors_graph(X).toarray()

実行結果は下記のようになります。

f:id:lib-arts:20191013002447p:plain
上記において、x行y列の数字が1であれば、x番目のノード(サンプル)の一番近い点がyであることを表しています。例えば3は2に最も近いので3行2列の数字が1になっています。


3. まとめ
#15ではscikit-learnのUser Guideより、主要な機能としてGeneralized Linear ModelsとNearest Neighborsを取り扱いました。
#16でも引き続きscikit-learnのUser Guideより主要な機能を紹介していきます。