1.前言
2.邏輯回歸的數學理論
前言所講到的邏輯回歸是通過利用線性回歸的基礎通過某個函式進行分類(計算概率)。比較常見的就是乙個sigmoid函式:
cost函式的目的就是要懲罰那些分類錯誤的情況:舉個例子就是,當乙個訓練樣本本來是1類的,意味這最理想的狀態就是p_hat是超過0.5的,但是通過計算得出的p_hat卻低於0.5,可以看作錯誤分類的情況,那麼對於這個樣本的cost就應該很大很大。由這種思路,就可以很好理解這個cost函式了:
又或者換一種形式:
這兩者是等價的。
那麼對於n個訓練樣本就有n個cost,將這些樣本的cost值全部累加起來自然就能得到乙個模型的總損失函式j(θ):
用梯度下降法就能求出最佳的θ,從而使得模型損失最小。邏輯回歸模型就很容易理解了。
3.邏輯回歸**:
import numpy as np
from sklearn.metrics import accuracy_score
class logisticregression:
def __init__(self):
self.coef = none
self.theta = none
self.interception = none
#當傳進來的t是乙個向量,那麼就自然的sigmoid函式後就是乙個向量
#公式中的y_hat相當與p_hat,也是乙個向量
def _sigmoid(self , t):
return 1. / (1. + np.exp(t))
def fit(self , x_train , y_train):
# 損失函式,自變數是theta,因變數是j,對不同的x_train或者不同的theta,會有不同的j
# 在梯度下降法中,主要考慮theta變化後,損失函式j變成什麼
def j(x_train , y_train , theta):
assert x_train.shape[0] == y_train.shape[0] , "the shape of x_train is not equal to y_train."
p_hat = self._sigmoid(x_train.dot(theta))
try:
return - np.sum(p_hat * np.log(p_hat) + (1 - p_hat) * np.log(1 - p_hat)) / len(y_train)
except:
return float('inf')
#損失函式的導數,也需要用到訓練集,以及引數theta
#區別開類的theta是最終theta,fit的theta是仍然在調整的theta
def dj(x_train , y_train ,theta):
assert x_train.shape[0] == y_train.shape[0], "the shape of x_train is not equal to y_train."
return x_train.t.dot(self._sigmoid(x_train.dot(theta)) - y_train) / len(y_train)
def gradient_descent(x_train , y_train , initial_theta , eta = 0.01 , n_iter = 1e4 , epsional = 1e-8):
count = 0
theta = initial_theta
while count < n_iter:
history_theta = theta
gradient = dj(x_train , y_train , theta)
theta = theta - gradient * eta
if(abs(j(x_train , y_train, theta) - j(x_train , y_train, history_theta)) < epsional):
break
count += 1
return theta
x_b = np.hstack([np.ones((x_train.shape[0] , 1)) ,x_train])
initial_theta = np.zeros(x_b.shape[1])
theta = gradient_descent(x_b , y_train , initial_theta)
self.theta = theta
self.coef = theta[1:]
self.interception = theta[0]
def predict(self,x_predict):
assert self.theta is not none , "the model needs to be fitted before you predict."
assert x_predict.shape[1] == len(self.coef) , "no."
x = x_predict.copy()
x1 = np.hstack([np.ones((len(x) , 1)) , x])
p_hat = self._sigmoid(x1.dot(self.theta))
return np.array(p_hat >= 0.5 , dtype='int')
def score(self , y_predict , y_test):
assert y_test.shape[0] == y_predict.shape[0] , "the shape of x_predict need to be equal to y_predict."
return accuracy_score(y_predict , y_test)
def __repr__(self):
return "logistic regression()"
機器學習與資料探勘之邏輯斯諦回歸
機器學習與資料探勘參考文獻 一 二項邏輯斯諦回歸模型 二項邏輯斯諦回歸模型是如下的條件概率分布 這裡,x rn是輸入,y 是輸出,w rn和b r是引數,w稱為權值向量,b稱為偏置,w x為w和x的內積。有時為了方便,將權值向量和輸入向量加以擴充,仍記作w,x,即w w 1 w 2 w n b t,...
資料探勘面試題之邏輯回歸lr
邏輯回歸假設資料服從伯努利分布 0 1 通過極大化似然函式的方法,運用梯度下降來求解引數,來達到將資料二分類的目的。1 去掉高度相關的特徵會讓模型的可解釋性更好 2 可以大大提高訓練的速度。如果模型當中有很多特徵高度相關的話,就算損失函式本身收斂了,但實際上引數是沒有收斂的,這樣會拉低訓練的速度。其...
機器學習入門 邏輯 Logistic 回歸(1)
關於機器學習的教程確實是太多了,處於這種變革的時代,出去不說點機器學習的東西,都覺得自己落伍了,但總覺得網上的東西並不系統,無法讓人串聯在一起,總有很多人讀了幾篇機器學習的東西,就自以為機器學習就那些東西,認為機器學習也就那麼一回事,想把這幾年關於機器學習的東西做一些總結,能夠跟大家一起學習和交流。...