机器学习—逻辑回归Logistic Regression

本文详细介绍了逻辑回归的实现,包括原理、自我实现、使用sklearn库的应用,以及展示了决策边界的绘制。通过实例展示了逻辑回归如何处理多分类问题,探讨了正则化的影响,并对比了不同正则化参数的效果。最后,讨论了逻辑回归在多分类任务中的应用,如OvR和MvM策略。
摘要由CSDN通过智能技术生成

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

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值