正則化

Machine Learning with PySpark

Andrew Collier

Data Scientist, Fathom Data

特徴量: 少数

少数の特徴量を持つデータセット

Machine Learning with PySpark

特徴量: 多すぎる

多数の特徴量を持つデータセット

Machine Learning with PySpark

特徴量: 選択後

多数の特徴量から選択する

Machine Learning with PySpark

損失関数(再掲)

線形回帰は MSE を最小化します。

二乗誤差平均の損失関数

Machine Learning with PySpark

正則化付きの損失関数

線形回帰は MSE を最小化します。

正則化項付きの二乗誤差平均の損失関数

係数に依存する「正則化」項を追加します。

Machine Learning with PySpark

正則化項

損失関数に追加の「正則化」項を加えます。

正則化項は {{1}} のいずれかです。

  • Lasso — 係数の絶対値
  • Ridge — 係数の二乗

Lasso と Ridge の混合(Elastic Net)も可能です。

正則化の強さはパラメータ $\lambda$ で決まります:

  • $\lambda = 0$ — 正則化なし(通常の回帰)
  • $\lambda = \infty$ — 完全な正則化(全係数が 0)
Machine Learning with PySpark

車データ再び

assembler = VectorAssembler(inputCols=[
    'mass', 'cyl', 'type_dummy', 'density_line', 'density_quad', 'density_cube'
], outputCol='features')
cars = assembler.transform(cars)
+-----------------------------------------------------------------------------+-----------+
|features                                                                     |consumption|
+-----------------------------------------------------------------------------+-----------+
|[1451.0,6.0,1.0,0.0,0.0,0.0,0.0,303.8743455497,63.63860639785,13.32745683724]|9.05       |
|[1129.0,4.0,0.0,0.0,1.0,0.0,0.0,244.2137140385,52.82580879050,11.42673778726]|6.53       |
|[1399.0,4.0,0.0,0.0,1.0,0.0,0.0,307.6753903672,67.66557958374,14.88136784335]|7.84       |
|[1147.0,4.0,0.0,1.0,0.0,0.0,0.0,264.1031545014,60.81122599620,14.00212433714]|7.84       |
+-----------------------------------------------------------------------------+-----------+
Machine Learning with PySpark

車: 線形回帰

学習データに(標準の)線形回帰モデルを適合します。

regression = LinearRegression(labelCol='consumption').fit(cars_train)
# テストデータの RMSE
0.708699086182001

係数を確認します:

regression.coefficients
DenseVector([-0.012, 0.174, -0.897, -1.445, -0.985, -1.071, -1.335, 0.189, -0.780, 1.160])
Machine Learning with PySpark

車: Ridge 回帰

# alpha = 0 | lambda = 0.1 -> Ridge
ridge = LinearRegression(labelCol='consumption', elasticNetParam=0, regParam=0.1)
ridge.fit(cars_train)
# RMSE
0.724535609745491
# Ridge の係数
DenseVector([ 0.001, 0.137, -0.395, -0.822, -0.450, -0.582, -0.806, 0.008,  0.029, 0.001])
# 線形回帰の係数
DenseVector([-0.012, 0.174, -0.897, -1.445, -0.985, -1.071, -1.335, 0.189, -0.780, 1.160])
Machine Learning with PySpark

車: Lasso 回帰

# alpha = 1 | lambda = 0.1 -> Lasso
lasso = LinearRegression(labelCol='consumption', elasticNetParam=1, regParam=0.1)
lasso.fit(cars_train)
# RMSE
0.771988667026998
# Lasso の係数
DenseVector([   0.0,   0.0,    0.0, -0.056,    0.0,    0.0,    0.0, 0.026,    0.0,   0.0])
# Ridge の係数
DenseVector([ 0.001, 0.137, -0.395, -0.822, -0.450, -0.582, -0.806, 0.008,  0.029, 0.001])
# 線形回帰の係数
DenseVector([-0.012, 0.174, -0.897, -1.445, -0.985, -1.071, -1.335, 0.189, -0.780, 1.160])
Machine Learning with PySpark

正則化 → 単純なモデル

Machine Learning with PySpark

Preparing Video For Download...