前言:真的是改了不少次!細節真的不少!
機器學習專欄:html
- 機器學習——線性迴歸(預測)
- 機器學習——邏輯迴歸(分類)
- 機器學習——特徵縮放
- 機器學習——正則化
邏輯迴歸(分類)
一、基本原理
邏輯迴歸用於分類,是對樣本屬於某一類的機率進行預測,對數概率函數:
g(z)=1+e−z1
python
給定數據集
D=(x(1),y(1));(x(2),y(2));...;(x(m),y(i)),其中
x(i)表示第
i個樣本點
x(i)∈Rn(表示有n個屬性值)。
考慮到
y=θ0+θ1x1(i)+...+θnxn(i)取值是連續的,所以它不能擬合離散變量。能夠考慮用它來擬合條件機率 ,由於機率的取值也是連續的。可是其取值爲 R ,不符合機率取值爲 0 到 1,所以考慮採用廣義線性模型。
對於一個簡單的二分類問題,咱們用logistics函數來代替理想的階躍函數來做爲鏈接函數:
hθ(x(i))=1+e−θTx(i)1
令
z=θTx(i)
![在這裏插入圖片描述](http://static.javashuo.com/static/loading.gif)
因而有:
ln1−hθ(x(i))hθ(x(i))=θTx(i)
事件發生與不發生的機率比值稱爲概率(odds),
hθ(x(i))表示發生的機率,即:
{P(y=1∣x(i),θ)=hθ(x(i))P(y=0∣x(i),θ)=1−hθ(x(i))
綜合兩式可得:
P(y∣x(i);θ)=(hθ(x(i)))y(1−hθ(x(i)))1−y
所以邏輯迴歸的思路是,先擬合決策邊界(不侷限於線性,還能夠是多項式,這個過程能夠理解爲感知機),再創建這個邊界與分類的機率聯繫(經過對數概率函數),從而獲得了二分類狀況下的機率。web
關於對數似然估計的概念我這裏就不做過多介紹了,可參考浙江大學的《機率論與數理統計》,咱們由「最大似然估計法」去得出代價函數,咱們要求每一個樣本屬於其真實標記的機率越大越好,因此:
maxL(θ)=i=1∏mP(y(i)∣x(i),θ)
取「對數似然」得:
maxlogL(θ)=i=1∑mlogP(y(i)∣x(i),θ)
由上,咱們將代價函數定爲:
J(θ)=m1i=1∑mC(hθ(x(i)),y(i))=−m1i=1∑m[y(i)log(hθ(x(i)))+(1−y(i))log(1−hθ(x(i)))]
一次性計算出全部樣本的預測值(是個機率值):
h=g(Xθ)
其中,
X=⎣⎢⎢⎡x01x02:x0mx11x11:x1m............xn1xn1:xnm⎦⎥⎥⎤表示訓練集,
θ=⎣⎢⎢⎡θ0θ1:θn⎦⎥⎥⎤
將代價函數寫成矩陣形式:
J(θ)=−m1(YTlog(h)−(1−Y)Tlog(1−h))
其中,
Y=⎣⎢⎢⎡y(1)y(2):y(m)⎦⎥⎥⎤表示由全部訓練樣本輸出構成的向量,
h=⎣⎢⎢⎡h(1)h(2):h(m)⎦⎥⎥⎤表示計算得出全部樣本的預測值(是個機率值)app
四、梯度降低法
梯度降低公式:
θj:=θj−mα∂θj∂J(θ)θj:=θj−mαi=1∑m(hθ(x(i))−y(i))xj(i)
【logistics迴歸梯度降低公式的簡單推導】
θj:=θj−mα∂θj∂J(θ)J(θ)=−m1i=1∑m[y(i)log(hθ(x(i)))+(1−y(i))log(1−hθ(x(i)))J(θ)=−m1i=1∑m[y(i)log(g(θTx(i)))+(1−y(i))log(1−g(θTx(i)))∂θj∂J(θ)=−m1i=1∑m[g(θTx(i))y(i)−(1−y(i))1−g(θTx(i))1]∂θj∂g(θTx(i))先求:∂θj∂g(θTx(i))=(1+e−θTx(i))2∂θj∂(1+e−θTx(i))=−(1+e−θTx(i))2e−θTx(i)xj(i)即:∂θj∂g(θTx(i))=hθ(x(i))(1−hθ(x(i)))xj(i)代入∂θj∂J(θ)中,得:θj:=θj−mαi=1∑m(hθ(x(i))−y(i))xj(i)機器學習
四、sklearn實現邏輯迴歸
""" Created on Tue Nov 12 19:28:12 2019 @author: 1 """
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
import numpy as np
import pandas as pd
df=pd.read_csv('D:\\workspace\\python\machine learning\\data\\breast_cancer.csv',sep=',',header=None,skiprows=1)
X = df.iloc[:,0:29]
y = df.iloc[:,30]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
model = LogisticRegression(solver='liblinear')
model.fit(X_train, y_train)
train_score = model.score(X_train, y_train)
cv_score = model.score(X_test, y_test)
print('train_score:{0:.6f}, cv_score:{1:.6f}'.format(train_score, cv_score))
y_pre = model.predict(X_test)
y_pre_proba = model.predict_proba(X_test)
print('matchs:{0}/{1}'.format(np.equal(y_pre, y_test).shape[0], y_test.shape[0]))
五、多分類問題
5.1多分類原理
爲了實現多分類,咱們將多個類(D)中的一個類標記爲正向類(y=1),而後將其餘全部類都標記爲負向類,這個模型記做
hθ(1)(X) 。接着,相似地第咱們選擇另外一個類標記爲正向類(y=2),再將其它類都標記爲負向類,將這個模型記做
hθ(2)(X) 依此類推。最後咱們獲得一系列的模型簡記爲:
hθ(k)(X)=P(y=k∣X,θ)其中
k=1,2,...,D
最後,在作預測時,對每個輸入的測試變量,咱們將全部的分類機都運行一遍,選擇可能性最高的分類機的輸出結果做爲分類結果:
maxhθ(k)(x(i))svg
5.2sklearn實現多分類
""" Created on Tue Nov 12 22:07:34 2019 @author: 1 """
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
import pandas as pd
import matplotlib.pyplot as plt
df=pd.read_csv('D:\\workspace\\python\machine learning\\data\\iris.csv',sep=',')
X = df.iloc[:,0:1]
y = df.iloc[:,4]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
model = LogisticRegression(solver='liblinear')
model.fit(X_train, y_train)
y_pre=model.predict(X_test)
print('accuracy_score:{}'.format(accuracy_score(y_test,y_pre)))
y_pre_proba = model.predict_proba(X_test)
print('y_pre:{}, \ny_pre_proba:{}'.format(y_pre, y_pre_proba))
colors = ['blue', 'red','green']
plt.figure(1)
for i in range(3):
plt.scatter(df.loc[df['virginica']==i].iloc[:,0],df.loc[df['virginica']==i].iloc[:,1],c=colors[i])
plt.title('原始數據分類結果')
colors = ['blue', 'red','green']
plt.figure(2)
df['virginica_pre']=model.predict(X)
for i in range(3):
plt.scatter(df.loc[df['virginica_pre']==i].iloc[:,0],df.loc[df['virginica_pre']==i].iloc[:,1],c=colors[i])
plt.title('預測數據分類結果')
結果可視化:
![在這裏插入圖片描述](http://static.javashuo.com/static/loading.gif)
給你們推薦一個博客:一文詳盡講解什麼是邏輯迴歸函數