ハムスの部屋

研究職のハムスターが調べたり体験したことを記録していきます。

【学習記録】通常最小二乗法での回帰【回帰の基本】

化学業界でも各社で機械学習の適用が進んでおり、私はその中でもマテリアルズインフォマティクス(MI)と呼ばれる手法に着目しています。

MIをざっくり説明すると、未知の物質の性能を原料や製造法、過去のデータベースなどの情報からから予測する方法です。

従来は研究者の経験と勘から良さそうだと思ったものについて実験することが多かったのですが、かなり時間がかかってしまいます。そのため、計算手法を用いることでより効率的に新規材料の開発を進めることが期待されています。

機械学習にはいくつか出来ることがありますが、当面は数値を予測する回帰手法の学習を進めます。

この知識が投資先の選定にも活用できれば良いな、とも思っています。

今回の記事では最も基本的な回帰手法の一つである、最小二乗法による回帰を紹介します。

必要に応じて式を載せたりもしますが、詳細な説明はしません。

概要と使い方に重きを置きます。

線形モデルについて

結果の解釈がしやすく計算量も少なめというメリットがあり、実用的に広く用いられる手法です。

入力特徴量 xの線形関数を用いて予測するものです。

一般的な予測式は
y = a_1 x_1 + a_2 x_2 + ・・・ + a_p x_p + b
となります。

各特徴量の線形結合で表せるようにaとbを調整するってことですね。

ちなみに変数が一つの場合は
y = ax + b
という見慣れた一次関数の式になります。

f:id:hamus_interest:20200323215952p:plain
一次元の線形回帰

最小二乗法とは

この手法は既にご存知の方も多いかもしれません。

機械学習の分野では線形回帰、または通常最小二乗法(Ordinary least squares: OSL)などと呼ばれます。

回帰式から予測したyの値と真のyの値との差を二乗したものの平均が最小となるようにaとbを調整します。より精度の高い予想が出来るようにチューニングするということですね。

通常最小二乗法(OLS)の特徴

とりあえず使う分には式の理解とかは雰囲気だけで良いと思います。大事なのはアルゴリズムの特徴です。

OLSのメリットは以下の2点と考えます。

  1. 計算が早い

  2. 解釈しやすい

1 についてはビッグデータを扱うような場合でデータ数が数十万などの場合は複雑な手法だと計算に時間がかかりすぎて適用が困難な場合があります。計算の早さは条件検討の早さにもつながりますし、意外と重要です。

2 ですが特徴量の線形結合で結果が出てくるので、係数の大きな特徴量は予測に大きな影響を与えることなどが容易に理解できます。実験条件の考察にも力を発揮できそうですね。また、係数がどうしてその大きさになっているかは解釈が難しい場合が多いです。

一方で、デメリットもあります。

  1. 予測精度が低め

  2. ハイパーパラメータが設定できない

1 は特徴量の線形結合で結果を予測しなければならないという強い制約があるので、仕方ない面もあります。  やはり精度だけ見るともっと高級な手法はいくつもあります。

2 は見落としがちですが、OLSには設定できるパラメータがありません。  主観的な情報が入らないメリットもありますが、予測モデルの複雑さを制御する手法がないことと同義にもなります。  一般的には説明変数が少ないと適合不足しやすく、多いと過剰適合しやすい傾向があります。

使い方

Pythonでのコードと合わせて使い方をみてみましょう。

データは身長と体重のデータを適当に作ったものを使いましょう。割と線形ぽくなるようにしています。

#データの作成と散布図
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline

height = np.array([150, 152, 155, 155, 160, 161, 165, 177, 180, 185])
weight = np.array([40, 41, 40, 46, 50, 52, 55, 68, 77, 82])
df = pd.DataFrame({"身長": height, "体重": weight})

plt.scatter(df["身長"], df["体重"])

f:id:hamus_interest:20200323230629p:plain
身長と体重のプロット


y = ax + b
の形でよく表現できそうですね!

これをOLSで学習させてどんな式が得られたのか確認してみましょう!

from sklearn.linear_model import LinearRegression

X = np.array(df["身長"]).reshape(-1, 1)
y = np.array(df["体重"]).reshape(-1, 1)
lr = LinearRegression().fit(X, y)  #OLSで学習

#計算した係数(重み)
print(lr.coef_)  #array([[1.22740316]])

#計算した切片
print(lr.intercept_)  #array([-146.19411765])

上記のようにpython LinearRegression()で学習し、結果をpython lr.coef_python lr.intercept_で係数と切片を確認できます。

今回の場合は
y = 1.23x - 146
という感じの回帰直線が得られました。

未知の身長(X)に対して適用することで体重が予測できますね!

まとめ

今回は機械学習の中でも最も基本的な通常最小二乗方について説明しました。

かなり長くなってしまいましたが、他の手法や気を付けるべき点などについても記事を書いていきたいと思います。

実践的な内容もどんどん更新していきたいと思っています。

長文でしたが、ここまでお付き合いいただいてありがとうございました!