Julia&機械学習に入門してみます。
そこでまずは基本的な実装についてを色々やっていってみようと思います。
今回は線形回帰をやってみます。
Juliaはv1.2.0を利用しています。
Julia自体にも機械学習用のパッケージが存在しますが、今回はScikitLearnを使うことでPythonとの違いを把握しつつすすめます。
線形回帰とは
回帰問題の予測のためのアルゴリズムですが、説明変数と目的変数の間の関係が線形である場合に用いられる手法です。
線形の関係とは以下のような一次関数の関係であることを指します(説明変数を、目的変数をとしました)。
データからどのように一次関数を推測するかというと、平均二乗誤差を計算し、最小二乗法を利用することでを計算することができます。
(平均二乗誤差や最小二乗法については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 [ ]:
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 [ ]:
線形回帰の適用範囲
線形回帰は「説明変数と目的変数の関係が線形」という前提があるため、そうでないデータに適用しても適切な結果が得られません。
有名な例としては、アンスコムの例があります。
アンスコムの例のようなデータでないことは、今回のように事前に可視化することである程度確認できますし、適用後の可視化でも確認できます。