提到邏輯回歸呢?我一下子就想起了我批判性思維的老師晉邏輯。
算法原理:
首先來(lái)聲明一下,雖然我們算法的名字就叫做邏輯回歸,但是邏輯回歸卻是一個(gè)二分類算法(周志華老師稱之為線性幾率回歸或者對(duì)數(shù)幾率回歸),一般只能用來(lái)預(yù)測(cè)含有兩種標(biāo)簽(或者類別)的數(shù)據(jù),比如0和1,男和女等等。為什么它的名字里面包含了回歸呢?我想可能是因?yàn)槟P椭邪艘粋€(gè)線性回歸表達(dá)式y(tǒng)=w*x+b,這樣的話y的取值就有可能非常大,也有可能非常小,這樣怎么能用于分類呢?于是Sigmoid函數(shù)就出現(xiàn)了,函數(shù)表達(dá)如下:
Sigmoid函數(shù)可以看出Sigmoid函數(shù)的定義域是整個(gè)空間,而它的值域處于0(自變量趨于負(fù)無(wú)窮大)和1(自變量趨于正無(wú)窮大)之間,我們將y的取值作用于Sigmoid函數(shù)得即到如下關(guān)系:Sigmoid函數(shù)曲線也就意味著我們把y值映射到另一個(gè)空間,通過(guò)映射的結(jié)果( P(Y=1|x)表示映射結(jié)果Y等于1的概率)和0.5的大小關(guān)系,我們從而來(lái)預(yù)測(cè)類別(和標(biāo)簽)。Tips:邏輯回歸一般只適合用于二分類,但是也存在一對(duì)多One-Vs-Rest(One For All ?)和多元邏輯回歸(Multinomial Logistic Regression)用于多類別的回歸。Sigmoid和y歐爾麥特警告綠谷警告
算法背后的數(shù)學(xué)推導(dǎo)

邏輯回歸的數(shù)學(xué)原理
1、Sklearn的邏輯回歸
#這次的文件和KNN文件相同,不再重復(fù)介紹
#這是一個(gè)簡(jiǎn)單的二元分類邏輯回歸模型
#導(dǎo)入必須的庫(kù)
from sklearn.linear_model import LogisticRegression as LR#唯一的不同在這
from sklearn.preprocessing import StandardScaler as SS
from sklearn.model_selection import train_test_split
from sklearn.metrics import confusion_matrix
from sklearn.preprocessing import LabelEncoder as LE
import pandas as pd
import numpy as np
dataset=pd.read_csv(path)
x=dataset.iloc[:,1:4].values
y=dataset.iloc[:,4].values
x[:,0]=LE().fit_transform(x[:,0])
x=SS().fit_transform(x)
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.2,random_state=0)
#以上是數(shù)據(jù)的預(yù)處理
model=LR(random_state=0)#模型實(shí)例化
model.fit(x,y)#擬合x(chóng),y
y_pre=model.predict(x_test)#預(yù)測(cè)
accuracy=confusion_matrix(y_test,y_pre)#計(jì)算混淆矩陣
print(accuracy)
當(dāng)然Sklearn還可以用來(lái)生成可以用來(lái)分類多標(biāo)簽的邏輯回歸模型,代碼只需要做稍微的改動(dòng)
model=LR(multi_class='ovr')#這個(gè)是One For All
#或者
LR(multi_class='multinomial')
其次也可以對(duì)模型進(jìn)行正則化,防止過(guò)擬合需要導(dǎo)入
sklearn.linear_model.LogisticRegressionCV,對(duì)這個(gè)類進(jìn)行實(shí)例化的時(shí)候可以設(shè)置正則化參數(shù);如果要對(duì)大量數(shù)據(jù)進(jìn)行處理可以在LR中加入?yún)?shù)solver='sag'(平均梯度下降);如果數(shù)據(jù)不均衡(也就是說(shuō)每個(gè)類的數(shù)目差異很大)可以設(shè)置LR中的class_weight='balanced'
以上所有即為Sklearn的邏輯回歸模型,如果只是要求用的話我覺(jué)得已經(jīng)足夠了,但是要想真正的理解還是得TensorFlow和Numpy出馬。
2、TensorFlow搭建邏輯回歸模型

TensorFlow搭建Logistic
#TensorFlow搭建邏輯回歸模型
import tensorflow as tf
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler as ss
epoch=5000
dataset=pd.read_csv(r'C:\Users\yk\Desktop\python\機(jī)器學(xué)習(xí)\數(shù)據(jù)可視化\文本\test_day6.csv')
x=dataset.iloc[:,2:4].values
y=dataset.iloc[:,4:].values#記好教訓(xùn),以后的數(shù)據(jù)都用二維格式
x=ss().fit_transform(x)
#以上為數(shù)據(jù)的預(yù)處理
X=tf.placeholder(tf.float32,x.shape)
Y=tf.placeholder(tf.float32,y.shape)#創(chuàng)建x,y的占位符,注意我們用的都是二維張量
w=tf.Variable(tf.zeros((2,1)))
b=tf.Variable(tf.zeros(1))#創(chuàng)建變量w和b
equation=tf.matmul(X,w)+b#創(chuàng)建回歸函數(shù)
sigmoid=tf.sigmoid(equation)#創(chuàng)建Sigmoid函數(shù)
cost=Y*tf.log(sigmoid)+(1-Y)*tf.log(1-sigmoid)#創(chuàng)建損失函數(shù)
cost_entropy=-tf.reduce_sum(cost)/len(x)#創(chuàng)建交叉熵函數(shù)
learning_rate=0.001#設(shè)置學(xué)習(xí)率
epoch=100000#設(shè)置學(xué)習(xí)次數(shù)
optimizer=tf.train.GradientDescentOptimizer(learning_rate).minimize(cost_entropy)#設(shè)置優(yōu)化器,選用梯度下降的方法
init=tf.global_variables_initializer()
feed_dict={X:x,Y:y}#設(shè)置喂養(yǎng)數(shù)據(jù)
cost_list=[]#記錄損失函數(shù)值
with tf.Session() as sess:#開(kāi)辟一個(gè)會(huì)話窗口
sess.run(init)#對(duì)變量進(jìn)行初始化賦值
for i in range(epoch):
sess.run(optimizer,feed_dict)#進(jìn)行梯度下降
W=sess.run(w,feed_dict)#計(jì)算w
B=sess.run(b,feed_dict)#計(jì)算b
cost_value=sess.run(cost_entropy,feed_dict)#計(jì)算損失函數(shù)值
cost_list.append(cost_value)#記錄損失函數(shù)變化
if i%100==0:
print(i,'==>','Cost=',cost_value,'w=',W,'b=',B)#可視化
sess.close()
plt.plot(np.arange(1,epoch+1),cost_list)#繪出損失函數(shù)收斂情況
plt.show()
for i,j in zip(x,y):
if j==0:
plt.scatter(i[0],i[1],c='r',marker='o')
else:
plt.scatter(i[0],i[1],c='b',marker='x')
損失函數(shù)收斂情況
TensorFlow收斂
3、自己動(dòng)手搭建邏輯回歸模型,俗話說(shuō)自己做才是最香

畫(huà)風(fēng)詭異
#自己動(dòng)手寫(xiě)邏輯回歸
import numpy as np
from sklearn.preprocessing import StandardScaler as ss
import pandas as pd
import matplotlib.pyplot as plt
dataset=pd.read_csv(r'C:\Users\yk\Desktop\python\機(jī)器學(xué)習(xí)\數(shù)據(jù)可視化\文本\test_day6.csv')
x=dataset.iloc[:,2:4].values
y=dataset.iloc[:,4:].values
x=ss().fit_transform(x)
#數(shù)據(jù)預(yù)處理
def sigmoid(x):
return 1/(1+np.power(np.e,-x))
#定義Sigmoid函數(shù)
def logistic_Gradient(x,y,epoch,alpha):#定義邏輯回歸梯度下降;參數(shù)x,y表示數(shù)據(jù)集,x為400*2,y為400*1;epoch表示學(xué)習(xí)次數(shù);alpha表示學(xué)習(xí)效率
w=np.ones((x.shape[1],1))
b=np.zeros((1,1))#對(duì)w和b賦予初值
cost_list=[]#記錄損失函數(shù)變化值
for i in range(epoch):
cost=compute_cost(x,y,w,b)#首先計(jì)算損失函數(shù)值
cost_list.append(cost[0,0])#加入到列表中
print(cost[0,0])
error=y-sigmoid(np.matmul(x,w)+b)
dt_w=(-1/len(x))*np.matmul(x.T,error)
dt_b=(-1/len(x))*error.sum()
w-=alpha*dt_w
b-=alpha*dt_b#上面是迭代公式參見(jiàn)講解,就是對(duì)函數(shù)求偏導(dǎo)后得到的結(jié)果
return (w,b,cost_list)
def compute_cost(x,y,w,b):#計(jì)算損失函數(shù)值,算法原理講解部分有公式
h=sigmoid(np.matmul(x,w)+b)
return (-1/len(x))*(np.matmul(y.T,np.log(h))+np.matmul(1-y.T,np.log(1-h)))
if __name__=="__main__":
w,b,cost=logistic_Gradient(x,y,10000,0.01)
plt.plot(np.arange(1,len(cost)+1),cost)#繪制損失函數(shù)變化情況
plt.show()
看看損失函數(shù)收斂結(jié)果

損失收斂

要問(wèn)我真的在想什么?蝙蝠俠呢?




