# [筆記] 機器學習 過度擬合問題 ( overfitting )
### 過度擬合 ( overfitting ) 與擬合不足 ( underfitting )

* 過度擬合 ( 右圖 )
* 特徵量過多,資料量過少
* 解決方法 :
1. 降低特徵量
* 人工檢查,保留較重要的特徵量
* 也有演算法 ( model selection algorithm ) 可以選擇何為較重要的特徵值
2. 正規化
* 可以保留所有的特徵量,但減少 θⱼ 的大小
* 當擁有需多有用的特徵量時,正規化是很有效的使所有特徵量都會有貢獻
* 擬合不足 ( 左圖 )
* 特徵量過少
### 正規化 ( Regularization )
#### 代價函數
原理 : 將 θⱼ 乘上較大的係數,可以使 θⱼ 大幅下降,降低一些特徵值的影響力
* 例如 :

* `θ₃`、`θ₄` 會大幅下降,甚至可以忽略
* `θ₀ + θ₁x + θ₂x² + θ₃x³ + θ₄x⁴` → `θ₀ + θ₁x + θ₂x²`

* 正規化後的代價函數
* λ 為正規化參數,如果過大會因為 θⱼ ( j ≠ 0 ) 全都趨近於 0 導致 underfitting
#### 正規化線性回歸 ( Regularized Linear Regression )

* 先將 `θ₀` 分離出來,因為正規化不須懲罰 `θ₀`
* 再加上正規化算式

* 將 `θⱼ` 提出來
* 此為正規化線性回歸
```Octave=
function [J, grad] = linearRegCostFunction(theta, X, y, lambda)
m = length(y);
J = 0;
grad = zeros(size(theta));
h = X * theta;
sqrErrors = (h - y) .^ 2;
shift_theta = theta(2:size(theta));
theta_reg = [0;shift_theta];
J = (1 / (2 * m)) * sum(sqrErrors) + (lambda / (2 * m)) * theta_reg' * theta_reg;
grad = (1 / m) * (X' * (h - y) + (lambda * theta_reg));
end
```
* 在 Octave 上的正規化線性回歸函式
#### 正規化正規方程 ( Regularized Normal Equation )

* 因為正規化不須懲罰 `θ₀`,所以最左上角為 0
* `λ⋅L` 可以使原本不可逆的 `XᵀX` 變成可逆的 `XᵀX + λ⋅L`
#### 正規化邏輯回歸 ( Regularized Logistic Regression )

* 邏輯回歸的代價函數正規化
* 梯度下降的方法跟正規化線性回歸大同小異
```Octave=
function [J, grad] = costFunctionReg(theta, X, y, lambda)
m = length(y);
J = 0;
grad = zeros(size(theta));
h = sigmoid(X * theta);
shift_theta = theta(2:size(theta));
theta_reg = [0;shift_theta];
predictions = - y' * log(h);
con_predictions = (1 - y)' * log(1 - h);
J = (1 / m) * (predictions - con_predictions) + (lambda / (2 * m)) * theta_reg' * theta_reg;
grad = (1 / m) * (X' * (h - y) + (lambda * theta_reg));
end
```
* 在 Octave 上的正規化邏輯回歸函式
###### tags: `筆記` `機器學習` `過度擬合問題`