1. 程式人生 > >【python+機器學習(5)】

【python+機器學習(5)】

歡迎大家關注公眾號【雜湊大資料】
1、二元分類問題概述
機器學習可以實現的兩大核心點是分類預測和迴歸預測。在之前的分享中我們介紹了連續資料的線性迴歸預測問題。但是在實際生活中,我們所面對的許多問題往往是非連續的分類問題,比如醫生根據一些指標判斷病人是否可以康復、企業根據使用者行為分析使用者是否會流失、警察根據嫌疑人的特徵來判定其是否為罪犯等。這些只有“是、否”兩種結果的問題均屬於兩元分類問題。

在機器學習中,存在許多預測分類的演算法,包括邏輯迴歸、決策樹、支援向量機、隨機森林、神經網路、樸素貝葉斯分類等等。其中邏輯迴歸是基於線性迴歸發展而來的,因其預測較為準確、易於理解而廣泛應用於實際場景中,比如在銀行的相關業務中,有80%是通過邏輯迴歸進行預測的,因此本節我們將從理論到具體實現,來詳細講解邏輯迴歸的相關內容。而具體案例應用將稍後分享。
2、邏輯迴歸介紹

image

我們已知常規的線性迴歸問題是尋找多個特徵x和目標變數之間的線性關係,具體計算模型為:

image

在這種情況下,所得到的目標變數是連續的一些值。在實際問題中,雖然我們擁有同樣多的特徵屬性值x,但是其目標卻只有(是、否)兩種情況。顯然上述的線性問題無法與目標擬合,因此我們希望,可以做個同等變換將使這些連續的值,與分類結果相關聯。這種關聯方式可以通過Sigmoid函式來實現:

image

即當x為0.5時其值為0,大於0.5時其值將不斷增大到無限接近於1,反之將接近0。下圖表示x在不同範圍時的函式值。

image

因此我們在原本的線性迴歸模型中套用Sigmoid函式就可以構建出邏輯迴歸的具體模型P:這樣便可以表示預測結果為其中一種情況的可能性為p。

image

該邏輯迴歸模型等價與logit(p),這樣便可以實現將連續的值對映為表示分類的概率問題。

image

構建完模型後,在進行機器學習預測時,我們也需要設計模型引數的計算方式,通過定義損失函式來確定引數值進而實現準確的預測。具體損失函式的構建以及引數值的優化(可使用梯度下降、牛頓法、擬牛頓法、梯度上升)等的具體實現,涉及到大量的數學計算這裡將不再進行詳細推導,如果感興趣的小夥伴歡迎留言討論。下面我們將具體通過python來一步步完成邏輯迴歸預測。

2、python從零實現邏輯迴歸

python的Scikit-learn庫中已有完整的邏輯迴歸演算法,類似於之前講解的線性迴歸模型,可以直接匯入後直接使用。具體匯入方式如下。

from sklearn.linear_modle import LogisticRegression

但是為了更好的理解邏輯迴歸的實現思路,本次我們將從零實現該演算法。

首先生成Logistic的一個類方法,第一步是實現特徵變數x和分類變數y的初始化。

class logistic(): 
def __init__(self, x, y):
 if type(x) == type(y) == list: 
self.x = np.array(x)
 self.y = np.array(y) 
elif type(x) == type(y) == np.ndarray: 
self.x = x
 self.y = y 
else: raise False

第二步:定義sigmoid函式,完成呼叫可返回計算後的結果值。

def sigmoid(num):
 if type(num) == int or type(num) == float: 
return 1.0 / (1 + exp(-1 * num))
 else: raise False

第三步:進行資料的訓練。其中alpha為學習率,errors為迭代閾值(只有計算誤差小於該值才會停止訓練),punish為懲罰係數預設為0.0001,times表示最大迭代次數。

 def train_data(self, alpha, errors, punish=0.0001): 
self.punish = punish 
dimension = self.x.shape[1] 
self.theta = np.random.random(dimension)
 compute_error = 100000000 
times = 0 
while compute_error > errors: 
res = np.dot(self.x, self.theta) 
delta = self.sigmoid(res) - self.y
 self.theta = self.theta - alpha * np.dot(self.x.T, delta) - punish * self.theta # 帶懲罰的梯度下降方法 
compute_error = np.sum(delta) 
times += 1

第四步:對新的資料進行結果預測,返回0或者1的預測結果(將實際問題資料化處理)

 def predict(self, x): 
 x = np.array(x) 
 if self.sigmoid(np.dot(x, self.theta)) > 0.5:  
 return 1  else:   return 0

至此邏輯迴歸的預測演算法已經實現,為了檢驗我們實現的該演算法的準確性,我們將通過隨機生成一些分類變數來進行測試。

首先生成200條2分類資料:

x, y = make_blobs(n_samples=200, centers=2, n_features=2, random_state=0, center_box=(10, 20))

然後呼叫我們完成的邏輯迴歸演算法:(分別指定懲罰係數為0.1和0.01)

 result = logistic(x, y) 
result.train_data(alpha=0.00001, errors=0.005, punish=0.01)

分類預測效果展示:

image

我們明顯可以看出不同懲罰引數的邏輯分割線是不同的,因此這也充分表明需要根據資料的實際特徵來設定懲罰的係數,進而是預測結果可以更加準確。