Python-sklearn-LogisticRegression

本文详细介绍了逻辑回归模型的实现过程,包括Sigmoid激活函数、交叉熵损失函数以及手动用梯度下降法进行训练。作者通过Python代码展示了如何从头开始构建逻辑回归模型,并与sklearn库中的LogisticRegression进行比较。
摘要由CSDN通过智能技术生成

逻辑回归LogisticRegression假设函数:

h(x) = z = w_{1} * x_{1} + w_{2} * x_{2} + ... + w_{n} * x_{n} + b = w^{T} * x + b

激活函数(Sigmoid):

g(z) = \frac{1}{1 + e^{-z}}

损失函数(交叉熵损失函数CrossEntropyLoss):

J(w_{1},w_{2},...,w_{n}, b) = -\frac{1}{m}\sum_{i=1}^{m}[y * lnh + (1 - y) * ln(1 - h)]

优化器(梯度下降Gradient descent):

w_{j} := w_{j} - \alpha \frac{\partial }{\partial w_{j}}J(w, b) = w_{j} - \alpha \frac{1}{m}\sum_{i=1}^{m}(h(x^{i}) - y^{i})x_{j}^{i}

b: = b - \alpha \frac{\partial }{\partial b}J(w, b) = b - \alpha \frac{1}{m}\sum_{i=1}^{m}(h(x^{i}) - y^{i})

"""
@Title: logistic_regression
@Time: 2024/2/27
@Author: Michael Jie
"""

import random

import numpy as np
from sklearn.linear_model import LogisticRegression


# Sigmoid激活函数
def sigmoid(x_input):
    return 1 / (1 + np.exp(-x_input))


# 预测
def func(x_input, w_finish, b_finish):
    x_input = np.array(x_input)
    w_finish = np.array(w_finish)
    b_finish = np.array(b_finish)
    g = sigmoid(np.dot(x_input, w_finish.T) + b_finish)
    return 1 if g >= 0.5 else 0


print("----------手动实现LogisticRegression----------")
# 数据集
x = []
for i in range(20):
    x.append([random.random(), random.random()])
    x.append([random.random() + 0.1, random.random() - 0.1])
    x.append([random.random() - 0.1, random.random() + 0.1])
    x.append([random.random() + 0.2, random.random() - 0.2])
    x.append([random.random() - 0.2, random.random() + 0.2])
    x.append([random.random() + 0.3, random.random() - 0.3])
    x.append([random.random() - 0.3, random.random() + 0.3])

    x.append([random.random() + 1.2, random.random() + 1.2])
    x.append([random.random() + 1.3, random.random() + 1.1])
    x.append([random.random() + 1.1, random.random() + 1.3])
    x.append([random.random() + 1.4, random.random() + 1])
    x.append([random.random() + 1, random.random() + 1.4])
    x.append([random.random() + 1.5, random.random() + 0.9])
    x.append([random.random() + 0.9, random.random() + 1.5])
y = []
for i in x:
    if -i[0] + 2 > i[1]:
        y.append([0])
    else:
        y.append([1])

# 初始化训练参数
w, b = [[random.random(), random.random()]], random.random()
print("初始化训练参数为:({w}, {b})".format(w=w, b=b))

x = np.array(x)
y = np.array(y)
w = np.array(w)
m = len(x)

# 训练精度
epsilon = 1e-4
# 学习率
alpha = 1
# 最大训练轮次
max_iter = 200

num = 0
while True:
    # 假设函数
    z = np.dot(x, w.T) + b
    h = sigmoid(z)
    # 损失
    j = -1 / m * np.sum(y * np.log(h) + (1 - y) * np.log(1 - h))
    if j < epsilon or num > max_iter:
        break
    # 梯度下降
    w -= alpha * (1 / m * np.sum((h - y) * x))
    b -= alpha * (1 / m * np.sum(h - y))
    num += 1
    if num % 100 == 0:
        print("第{num}次训练,损失为:{j}".format(num=num, j=j))
print("训练后参数为:({w}, {b})".format(w=w, b=b))
print("输入(0.1, 0.2)的预测值为:{y}".format(y=func([[0.1, 0.2]], w, b)))
print("输入(1, 2)的预测值为:{y}".format(y=func([[1, 2]], w, b)))

print("----------使用sklearn实现LogisticRegression----------")
logistic = LogisticRegression()
logistic.fit(x, y.ravel())
print("训练后参数为:({w}, {b})".format(w=logistic.coef_, b=logistic.intercept_))
print("输入(0.1, 0.2)的预测值为:{y}".format(y=logistic.predict(np.array([[0.1, 0.2]]))))
print("输入(1, 2)的预测值为:{y}".format(y=logistic.predict(np.array([[1, 2]]))))

"""
----------手动实现LogisticRegression----------
初始化训练参数为:([[0.05116287337836445, 0.59146346793862]], 0.9594614107042407)
第100次训练,损失为:0.07556248284258144
第200次训练,损失为:0.04326107397325283
训练后参数为:([[3.10095928 3.64125988]], -7.030353544915665)
输入(0.1, 0.2)的预测值为:0
输入(1, 2)的预测值为:1

----------使用sklearn实现LogisticRegression----------
训练后参数为:([[3.46800065 3.64498844]], [-7.7739492])
输入(0.1, 0.2)的预测值为:[0]
输入(1, 2)的预测值为:[1]
"""

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值