在之前的問題討論中,研究的都是連續值,即y的輸出是一個連續的值。但是在分類問題中,要預測的值是離散的值,就是預測的結果是否屬於某一個類。例如:判斷一封電子郵件是否是垃圾郵件;判斷一次金融交易是否是欺詐;之前我們也談到了腫瘤分類問題的例子,區別一個腫瘤是惡性的還是良性的。
我們先說二分類問題,我們將一些自變量分為負向類和正向類,那么因變量為0,1;0表示負向類,1表示正向類。
如果用線性回歸來討論分類問題,那么假設輸出的結果會大於1,但是我們的假設函數的輸出應該是在0,1之間。所以我們把輸出結果在0,1之間的算法叫做邏輯回歸算法。
因為線性回歸算法中,函數的輸出肯定會大約1,所以我們定義了一個新的函數來作為分類問題的函數,我們用g代表邏輯函數,它通常是一個S形函數,公式為:
Python代碼:
import numpy as np def sigmoid(z): return 1 / (1 + np.exp(-z))
函數圖像為:
這樣,無論自變量取值是多少,函數的輸出值一直在0,1之間。
在線性回歸模型中,我們定義的代價函數是所有模型誤差的平方和。當在邏輯回歸模型中,如果還延用這個定義,將代入,我們得到是一個非凸函數
:
這意味着我們的代價函數有許多局部最小值,這將影響梯度下降算法尋找全局最小值。
我們重新定義邏輯回歸的代價函數為:,其中
。
Python代碼:
import numpy as np def cost(theta, X, y): 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))) return np.sum(first - second) / (len(X))
在多分類問題,我們遇到的問題是一對多。而相對於而分類來說,在多分類中,我們可以把相近的認為是一類,把一個多分類問題認為是多個二分類問題,從而實現多分類問題的解決方案。
在回歸問題中,還有一個過擬合的問題,如下圖所示:
上圖中,只有圖二比較好,第一個圖型是欠擬合,第三個是過擬合:過去強調擬合原始數據而丟失了算法的本質。
那么解決上述的問題有兩個方法:
1.丟棄一些不能幫助我們正確預測的特征。可以是手工選擇保留哪些特征,或者使用一些模型選擇的算法來幫忙(例如 PCA)
2.正則化。 保留所有的特征,但是減少參數的大小(magnitude)。
在回歸問題中,出現過擬合的原因是因為高階系數太大了,如果讓高階系數接近0的話就可以解決這個問題了。所以要做的就是在一定程度上減小這些參數的值,這就是正則化的基本方法。
對於一個代價函數,我們修改后的結果如下:。
如果我們不知道哪些特征需要懲罰,我們將對所有的特征進行懲罰,並讓代價函數最優軟件來選擇這些懲罰的程度。
其中的λ稱為正則化參數,如果選擇的正則化參數 λ 過大,則會把所有的參數都最小化了,導致模型變成 ℎ𝜃(𝑦) =𝜃0 ,也就是上圖中紅色直線所示的情況,造成欠擬合。
𝜃0 不參與其中的任何一個正則化。