逻辑回归python正则化 选择参数_吴恩达机器学习笔记(三)——正则化(Regularization)...
1.過擬合的問題(Over-fitting)
如果我們有非常多的特征,我們通過學習得到的假設可能能夠非常好地適應訓練集(代價函數可能幾乎為0),但是可能會不能推廣到新的數據。
(1)下圖是一個回歸問題的例子:第一個模型是一個線性模型,欠擬合,不能很好地適應我們的訓練集
第三個模型是一個四次方的模型,過于強調擬合原始數據,而丟失了算法的本質:預測新數據。
我們可以看出,若給出一個新的值使之預測,它將表現的很差,這叫作過擬合。雖然能非常好地適應我們的訓練集,但是新輸入變量進行預測時,效果會表現的不好。
(2)分類問題中也存在這樣的問題:
我們可以用多項式來理解,x的次數越高,擬合的越好,但相應的預測能力就可能變差。
解決過擬合的方式:減少特征值的數量人為的保留一些重要的特征值
用特征選擇算法進行特征的選擇(PCA、層次分析法)
2.正則化保留所有的特征,但是減少參數
的大小。
2.代價函數(Cost Function)
上面的回歸問題中如果我們的模型是:
我們可以從之前的例子中看出來,正是由于高次項導致的過擬合的發生,所以如果我們能夠讓那些高次項的系數接近于0的話,我們就能夠很好的擬合數據集。
所以我們要做的就是在一定程度上減小這些參數 的值,這就是正則化的基本方法。我們決定要減少
和
的大小,我們要做的便是修改代價函數,在其中
和
設置一點懲罰。這樣做的話,我們在嘗試最小化代價時也需要將這個懲罰納入考慮中,并最終導致選擇較小一些的
和
。
修改后的代價函數:
通過這樣的代價函數選擇出的 3和 4 對預測結果的影響就比之前要小許多。
假如我們有非常多的特征,我們并不知道其中哪些特征我們要懲罰,我們將對所有的特征進行懲罰,并且讓代價函數最優化的軟件來選擇這些懲罰的程度。這樣的結果是得到了一個較為簡單的能防止過擬合問題的假設:
其中
又被稱為正則化參數(Regularization Parameter)。注:按照慣例我們對
不進行懲罰。經過正則化處理的模型與原模型的可能對比如下圖所示:
那為什么增加的一項
可以使 的值減小呢?
: 可以控制兩個不同目標之間的取舍。
目標①:去更好地擬合數據集(訓練集)
目標②:使參數大小變小,從而使假設函數變得更“簡單”。
兩者相互平衡,從而達到一種相互制約的關系,最終找到一個平衡點,從而更好地擬合訓練集并且具有良好的泛化能力。
因為如果我們令
的值很大的話,為了使Cost Function 盡可能的小,所有的 的值(不包括
)都會在一定程度上減小。如果
取值非常大,那么除了
之外的所有參數都趨近于0,模型成為一條直線。
3.正則化線性回歸
正則化線性回歸的代價函數為:
{
}
對上面的算法中 = 1,2,..., 時的更新式子進行調整可得:
可以看出,正則化線性回歸的梯度下降算法的變化在于,每次都在原有算法更新規則的
基礎上令 值減少了一個額外的值。
4.正則化的邏輯回歸模型
自己計算導數同樣對于邏輯回歸,我們也給代價函數增加一個正則化的表達式,得到代
價函數:
Python代碼實現:
import numpy as np
def costReg(theta, X, y, learningRate):
theta = np.matrix(theta)
X = np.matrix(X)
y = np.matrix(y)
first = np.multiply(-y, np.log(sigmoid(X*theta.T)))
second = np.multiply((1 - y), np.log(1 - sigmoid(X*theta.T)))
reg = (learningRate / (2 * len(X)) * np.sum(np.power(theta[:,1:theta.shape[1]],2)))
return np.sum(first - second) / (len(X)) + reg
注:這里的learningRate 是指正則化參數。
要最小化該代價函數,通過求導,得出梯度下降算法為:
5.關鍵函數Python代碼實現
1.正則化的邏輯回歸模型梯度下降法的代碼實現:
def gradientReg(theta, X, y, learningRate):
theta = np.matrix(theta)
X = np.matrix(X)
y = np.matrix(y)
parameters = int(theta.ravel().shape[1])
grad = np.zeros(parameters)
error = sigmoid(X * theta.T) - y
for i in range(parameters):
term = np.multiply(error, X[:,i])
if (i == 0):
grad[i] = np.sum(term) / len(X)
else:
grad[i] = (np.sum(term) / len(X)) + ((learningRate / len(X)) * theta[:,i])
return grad
5.如何更好地擬合數據去收集更多的數據
嘗試更少的特征值
嘗試更多的特征值
增加多項式
增大\減小正則化參數
總結
以上是生活随笔為你收集整理的逻辑回归python正则化 选择参数_吴恩达机器学习笔记(三)——正则化(Regularization)...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python脚本自动统计excel_py
- 下一篇: delphi gui编辑工具源码_Pyt