8.逻辑回归
8.1逻辑回归的实现
8.1.1什么是逻辑回归
逻辑回归又称Logistic Regression,其本质是一种广义的线性回归模型,常用于解决二分类问题。
在前面的多元线性回归中,有,其中表示样本的预测值、Xb表示样本的特征集加上第一列的元素1、θ表示截距和特征的系数。
在逻辑回归中,有函数,当>=0.5时,=1;当<=0.5时,=0。这也是为什么逻辑回归用于解决二分类问题的原因,其中表示样本发生的概率。
多元线性回归中,的阈值处于(-∞,+∞),为了将其映射到(0,1)之间,需要一个更好的映射函数,这就是sigmoid函数:
函数曲线如下所示:
因此,逻辑回归算法:
由于在numpy中,向量乘矩阵和矩阵乘向量的结果相同,因此,也有人写成并带入sigmoid函数。
当真实值y=1时,若越小,对应的损失值也越大,因此损失函数J是的递减函数,可以表示为J=-log()、∈(0,1)、y=1。
当真实值y=0,若越大,对应的损失值也越大,因此损失函数J是的递增函数,可以表示为J=-log(1-)、∈(0,1)、y=1。
综上,对于每个样本有损失函数J(i)=-y(i)log((i))-(1-y(i))log(1-(i));对于所有样本有损失函数:
使用梯度下降法求损失函数的极小值,这里不再列推导过程,损失函数的梯度如下所示:
8.1.2自己实现逻辑回归算法
#程序8-1
import numpy as np
from sklearn import datasets
iris = datasets.load_iris()
X = iris.data
y = iris.target
#取出鸢尾花前2个种类
X = X[y<2]
y = y[y<2]
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2,random_state=123456)
def sigmoid(t):
return 1./(1.+np.exp(-t))
def logic_J(X_b,y,theta):
p_hat = sigmoid(X_b.dot(theta))
return -np.sum(y*np.log(p_hat)+(1-y)*np.log(1-p_hat))/len(y)
def logic_dJ(X_b,y,theta):
p_hat = sigmoid(X_b.dot(theta))
return X_b.T.dot(p_hat-y)/len(y)
def logic_pedict(X_b,theta):
p_hat = sigmoid(X_b.dot(theta))
return np.array(p_hat>=0.5,dtype='int')
def gradient_descent(X_b,y,init_theta,J,dJ,eta=1e-2,max_iters=1e4,break_accuracy=1e-8):
theta = init_theta
cur_iter = 0
while cur_iter < max_iters:
gradient = dJ(X_b,y,theta)
last_theta = theta
theta = theta - eta*gradient
if abs(J(X_b,y,theta)-J(X_b,y,last_theta)) < break_accuracy:
break
cur_iter += 1
return theta
X_train_b = np.hstack([np.ones((X_train.shape[0],1),dtype='float'),X_train])
X_test_b = np.hstack([np.ones((X_test.shape[0],1),dtype='float'),X_test])
init_theta = np.zeros((X_train_b.shape[1],))
print(init_theta.shape)
theta = gradient_descent(X_train_b,y_train,init_theta,logic_J,logic_dJ)
print(theta)
y_predict = logic_pedict(X_test_b,theta)
from sklearn.metrics import accuracy_score
score = accuracy_score(y_test,y_predict)
print(score)
运行结果:
(5,)
[-0.34490434 -0.51879