Python機械学習プログラミング
読み会
第10章
回帰分析 - 連続値をとる目的変数の予測
1
[第2版]
基盤 江口春紀
目次
● 線形回帰
● Housingデータセットの探索
● 最小二乗線形回帰モデルの実装
● RANSACを使ったロバスト回帰モデルの学習
● 線形モデルの性能評価
● 回帰に正則化手法を使用する
● 多項式回帰:線形回帰モデルから曲線を見い出す
2
3
線形回帰
線形回帰
● 線形回帰
● 1つ以上の特徴量と連続値の目的変数との関係をモデルとして表現すること。
● 教師あり学習のサブフィールドのうちの一つ。
4
単線形回帰
● 単線形回帰
● 単一の特徴量(説明変数x)と連続値の応答(目的変数y)との関係を
モデルとして表現すること。
5
回帰直線
残差
重線形回帰
● 説明変数が1つだけの線形回帰モデルは単回帰と呼ばれるが、
線形回帰モデルを複数の説明変数に合わせて一般化したものを
重回帰(multiple linear regression)と呼ぶ。
6
※ w0 は x0=1 としてy切片を表してる。
7
Housingデータセットの探索
Housingデータセットの探索
● Housingデータセット
● 1978年に収集された、ボストン近郊の住宅情報が含まれたデータセット。
8
データセットの重要な特性を可視化する
● 探索的データ解析(Exploratory Data Analysis: EDA)
● 機械学習モデルのトレーニングを行う前のステップ。
● 外れ値やデータの分布、各特徴量同士の関係などを視覚的に検出するのに役立つ。
9
今回はまず散布図行列を作成し、
特徴量のペアに対する相関関係を1つの平面上に可視化する
データセットの重要な特性を可視化する
● 散布図行列
10
線形にみえる
正規分布に似た
分布
相関行列を使って関係を調べる
● 相関行列の作成
● 相関行列はピアソンの積率相関係数を成分とする正方行列である。
11
・正の相関
NOX・・・窒素酸化物の濃度(pphm単位)
INDUS・・・非小売業の土地面積の割合(人口
単位)
RM・・・1戸あたりの平均部屋数
MEDV・・・住宅価格の中央値
・負の相関
LSTAT・・・低所得者の割合
MEDV・・・住宅価格の中央値
12
最小二乗線形回帰モデルの実装
最小二乗線形回帰モデルの実装
● 線形回帰
● トレーニングデータのサンプル点を通過する直線のうち、
最も適合するものを取得すること。
13
最小二乗法(線形最小二乗法)を使って、
サンプル点に対する距離の二乗を最小化するパラメータを推定する
勾配降下法を使って回帰パラメータの回帰を解く
● ADALINEの場合(第2章参照)
● コスト関数J(・)を定義して、勾配降下法(GD)や確率的勾配降下法(SGD)などの
最適化アルゴリズムを用いて、コスト関数を最小化する重みを学習する。
● ADALINEで使用するコスト関数は誤差平方和(SSE)だが、
最小二乗法(OLS)のコスト関数に等しい。
14
OLS線形回帰は単位ステップ関数のないADALINEとして解釈できる
勾配降下法を使って回帰パラメータの回帰を解く
● ADALINEから単位ステップ関数を削除した線形回帰モデル
● ADALINEでは予測するときに、
閾値を設けて1か-1のクラスラベルに
振り分けていたが、値をそのまま
出力する。
15
class LinearRegressionGD(object):
def __init__(self, eta=0.001, n_iter=20):
self.eta = eta
self.n_iter = n_iter
def fit(self, X, y):
self.w_ = np.zeros(1 + X.shape[1])
self.cost_ = []
for i in range(self.n_iter):
output = self.net_input(X)
errors = (y - output)
self.w_[1:] += self.eta * X.T.dot(errors)
self.w_[0] += self.eta * errors.sum()
cost = (errors**2).sum() / 2.0
self.cost_.append(cost)
return self
def net_input(self, X):
return np.dot(X, self.w_[1:]) + self.w_[0]
def predict(self, X):
return self.net_input(X)
勾配降下法を使って回帰パラメータの回帰を解く
● HousingデータセットのMEDVを予測するモデルのトレーニング
● 説明変数はRM(1戸あたりの平均部屋数)、目的変数はMEDV(住宅価格の中央値)を使用する。
エポック数に対するコストと、住宅価格に対する部屋数のグラフに予測した直線を
プロットした。
16
外れてしまっている
scikit-learnを使って回帰モデルの係数を推定する
● scikit-learnの回帰推定器
● 標準化していない変数に対応するLIBLINERや高度な最適化アルゴリズム、
その他のコード最適化手法を利用している。
17
from sklearn.linear_model import LinearRegression
slr = LinearRegression()
slr.fit(X, y)
y_pred = slr.predict(X)
print('Slope: %.3f' % slr.coef_[0])
print('Intercept: %.3f' % slr.intercept_)
Slope: 9.102
Intercept: -34.671
18
RANSACを使った
ロバスト回帰モデルの学習
RANSACを使ったロバスト回帰モデルの学習
● RANSAC(RANdom SAmple Consensus)
● 観測値からランダムにいくつかサンプリングした中で、パラメータを推定する処理を
繰り返し、その中で最良の推定結果を出力する方法である。
● RANSACのアルゴリズム
19
RANSACを使ったロバスト回帰モデルの学習
● RANSACモデルの学習
20
from sklearn.linear_model import RANSACRegressor
ransac = RANSACRegressor(LinearRegression(),
max_trials=100,
min_samples=50,
loss='absolute_loss',
residual_threshold=5.0,
random_state=0)
ransac.fit(X, y)
21
線形モデルの性能評価
線形モデルの性能評価
● Housingデータセットを使用した重回帰モデル
● 前々節同様、目的変数はMEDV(住宅価格の中央値)として、そのほかの特徴量を
全て学習に使用した重回帰モデルを作成する。
● 重回帰では説明変数が複数あるため
線形回帰直線をプロットすることは
できないので、残差をプロットする。
22
線形モデルの性能評価
● 他の評価指標
● 平均二乗和誤差(MSE)
トレーニングデータ:19.96
テストデータ :27.20
● 決定係数(R^2)
23
トレーニングデータ:0.765
テストデータ :0.673
24
回帰に正則化手法を使用する
回帰に正則化手法を使用する
● 正則化された線形回帰モデル
● リッジ回帰
● LASSO
● Elastic Net
25
最小二乗法の式にL2ノルムを加える。
制約をかけ、過学習を抑えることがで
きる。
最小二乗法の式にL1ノルムを加える。
特定の変数の重みが0になることがあ
るので、特徴選択にも使える。
最小二乗法の式にL1ノルムとL2ノル
ムを加える。
26
多項式回帰:
線形回帰モデルから曲線を見い出す
多項式回帰
● 多項式回帰モデル
● 多項式の項が追加された多項式回帰モデルで、dは多項式の次数である。
27
scikit-learnを使って多項式の項を追加する
● PolynomialFeatures変換器クラス
28
from sklearn.preprocessing import PolynomialFeatures
X = np.array([258.0, 270.0, 294.0,
320.0, 342.0, 368.0,
396.0, 446.0, 480.0, 586.0])¥
[:, np.newaxis]
y = np.array([236.4, 234.4, 252.8,
298.6, 314.2, 342.2,
360.8, 368.0, 391.2,
390.8])
lr = LinearRegression()
pr = LinearRegression()
quadratic = PolynomialFeatures(degree=2)
X_quad = quadratic.fit_transform(X)
MSE : 570 → 61
R^2 : 0.832 → 0.982
Housingデータセットで非線形関係をモデル化する
● 線形回帰モデルと多項式回帰モデルの比較
● 2次元と3次元の多項式を使用して、MEDV(住宅価格の中央値)と
LSTA(低所得者の割合)の関係をモデル化する。
29
Housingデータセットで非線形関係をモデル化する
● 線形回帰モデルと多項式回帰モデルの比較
● 多項式回帰モデルが必ずしも最良の選択肢ではない。
もしMEDVを対数変換して学習したら...?
30
ランダムフォレストを使って非線形関係に対処する
● 決定木回帰
● 非線形データを扱うときに特徴量を変換する必要がない。
不純度指標を用いて情報利得(IG)が最大化するように分割する。
31
MSE train: 20.620, MSE test: 40.449
R^2 train: 0.742, R^2 test: 0.552
ランダムフォレストを使って非線形関係に対処する
● ランダムフォレスト回帰
● 複数の決定木を組み合わせるアンサンブル手法で、個々の決定木よりも汎化性能が高い。
ランダム性によって外れ値にもあまり影響を受けず、パラメータのチューニングも
それほど要求されない。
● 全ての特徴量を使用して、サンプルの60%で
ランダムフォレスト回帰モデルの学習を行った。
32
MSE train: 1.642, MSE test: 11.052
R^2 train: 0.979, R^2 test: 0.878
まとめ
● 単回帰分析
● 単一の説明変数と連続値を取る目的変数との関係をモデル化する。
● ロバスト回帰モデル(RANSAC)
● 外れ値の影響を小さくして回帰係数を推定する。
● 多項式回帰
● 多項式を用いることで非線形関係をモデル化する。
● ランダムフォレスト回帰
33

[第2版]Python機械学習プログラミング 第10章

Editor's Notes

  • #3 IMDb: Internet Movie Database
  • #6 重みw0はy切片を表し、w1は説明変数の係数を表す。 この重みを調整することで説明変数に対する目的変数を予測することができる。 残差:予測値の誤差
  • #7 特徴量が2つであれば2次元の超平面として表すことが可能だが、 3つ以上の特徴量になるとうまく可視化する方法がない。
  • #9 CRIM・・・犯罪発生率(人口単位) ZN・・・25,000平方フィート以上の住宅区画の割合 INDUS・・・非小売業の土地面積の割合(人口単位) CHAS・・・チャールズ川沿いかどうか(1:Yes、0:No) NOX・・・窒素酸化物の濃度(pphm単位) RM・・・1戸あたりの平均部屋数 AGE・・・1940年よりも前に建てられた家屋の割合 DIS・・・ボストンの主な5つの雇用圏までの重み付きの郷里 RAD・・・幹線道路へのアクセス指数 TAX・・・10,000ドルあたりの所得税率 PTRATIO・・・教師あたりの生徒の数(人口単位) B・・・アフリカ系アメリカ人居住者の割合(人口単位) LSTAT・・・低所得者の割合 MEDV・・・住宅価格の中央値
  • #11 データセットから5つの特徴量についてプロット LSTAT・・・低所得者の割合 INDUS・・・非小売業の土地面積の割合(人口単位) NOX・・・窒素酸化物の濃度(pphm単位) RM・・・1戸あたりの平均部屋数 MEDV・・・住宅価格の中央値
  • #12 σxはxの標準偏差を、σyはyの標準偏差を、σxyはxとyの共分散を表す 物質が燃焼するときにも一酸化窒素や二酸化窒素などが発生する。 NOX・・・窒素酸化物の濃度(pphm単位) INDUS・・・非小売業の土地面積の割合(人口単位) LSTAT・・・低所得者の割合 MEDV・・・住宅価格の中央値 RM・・・1戸あたりの平均部屋数 MEDV・・・住宅価格の中央値
  • #17 5epochsから収束している。 部屋数だけでは住宅価格を説明しきれていない。
  • #18 標準化していない変数を学習した例
  • #20 ロバスト回帰分析:外れ値の影響を小さくして回帰係数を推定する方法 求めたパラメータ、プラスマイナスRANSACの許容範囲内にあるデータ数だけそのパラメータに投票する。
  • #21 イテレーション数:max_trials ランダムに選ぶサンプルの最小値:min_samples 学習直線に対するサンプル点の縦の距離の絶対値を計算:'absolute_loss' 許容する直線からの距離:residual_threshold RANSACを使用するとこのデータの外れ値の影響は抑えられるが、
  • #23 残差:実際の値と予測された値の差 0から大きく離れているものは外れ値
  • #24 SSE: 誤差平方和 SST: 総平方和(平均からの差の二乗和) MSEをスケーリングしたものといえる R^2は0~1に収まり、1だと最もモデルがフィットしているといえる(その時MSE=0)
  • #26 λが増えると正則化が強まる 正則化については、4章参照 全てscikit-learnに実装されているので使うことができる。
  • #29 決定係数(R^2)
  • #30 次数をあげると過学習の可能性は高まる
  • #31 MEDV・・・住宅価格の中央値 データをよく見ることが大事
  • #33 結果をみると過学習気味である