What is it, naokirin?

Juliaで機械学習入門(1)〜線形回帰〜

Julia&機械学習に入門してみます。

そこでまずは基本的な実装についてを色々やっていってみようと思います。

今回は線形回帰をやってみます。

Juliaはv1.2.0を利用しています。

Julia自体にも機械学習用のパッケージが存在しますが、今回はScikitLearnを使うことでPythonとの違いを把握しつつすすめます。

線形回帰とは

f:id:naokirin:20191005115615p:plain:w500

回帰問題の予測のためのアルゴリズムですが、説明変数と目的変数の間の関係が線形である場合に用いられる手法です。

線形の関係とは以下のような一次関数の関係であることを指します(説明変数をx、目的変数をyとしました)。

 y = w_0 x + w_1

データからどのように一次関数を推測するかというと、平均二乗誤差を計算し、最小二乗法を利用することで w_0, w_1を計算することができます。

(平均二乗誤差や最小二乗法についてはWeb上にも多数の解説があるため、省略します)

Juliaで線形回帰

JuliaとScilearnKitを利用して、線形回帰を実行してみます。

Jupyter Notebook で実行した結果を貼ります。

In [ ]: ]add ScikitLearn
In []: add Plots
In [ ]: using Plots
        X = [[8.0], [4.0], [12.0], [10.0], [11.0], [3.0], [7.0], [9.0], [6.0], [5.0]]
        y = [10.03, 3.12, 11.86, 10.81, 13.33, 2.99, 7.24, 7.75, 7.90, 4.22]
        plot(X, reshape(y, 1, size(y, 1)),marker=:circle, seriestype=:scatter, leg=false)
Out [ ]:

f:id:naokirin:20191005115647p:plain:w600

In [ ]: using ScikitLearn
        using ScikitLearn: fit!, predict
        @sk_import linear_model: LinearRegression
Out [ ]:    PyObject <class 'sklearn.linear_model.base.LinearRegression'>
In [ ]: model = LinearRegression()
        fit!(model, X, y)
Out [ ]:    PyObject LinearRegression(copy_X=True, fit_intercept=True, n_jobs=None, normalize=False)
In [ ]: println(model.intercept_)  # 切片
        println(model.coef_)  # 傾き
        y_pred = predict(model, [[0], [1]])  # 0, 1 番目の予測値
        println(y_pred)
Out [ ]:    -0.5563636363636393
            [1.1308484848484852]
            [-0.5563636363636393, 0.5744848484848459]
In [ ]: f(x) = model.coef_[1] * x + model.intercept_
        plot!(f, 2, 13)
Out [ ]:

f:id:naokirin:20191005115615p:plain:w600

線形回帰の適用範囲

線形回帰は「説明変数と目的変数の関係が線形」という前提があるため、そうでないデータに適用しても適切な結果が得られません。

有名な例としては、アンスコムの例があります。

参考: アンスコムの例 - Wikipedia

アンスコムの例のようなデータでないことは、今回のように事前に可視化することである程度確認できますし、適用後の可視化でも確認できます。