机器学习之逻辑回归

一、概念

1.1简介

        逻辑回归是一种用于解决分类问题的统计学习方法。尽管名字中含有"回归"一词,但逻辑回归实际上是一种分类算法,用于预测输入变量与离散输出变量之间的关系。逻辑回归通过将输入特征的加权和与一个逻辑函数(如sigmoid函数)进行组合,从而得出一个介于0和1之间的概率值,表示样本属于某个类别的可能性。当概率大于0.5时,通常将样本归为正类;当概率小于0.5时,则归为负类。逻辑回归常用于二元分类问题,但也可以通过修改模型来处理多类别分类。它被广泛应用于医学、社会科学、金融等领域,在实践中表现出良好的性能和解释性。

1.2处理的数据

 逻辑回归是用来进行分类的,下面我将给出一个简单的例子来解释。      

        我们给出一个人的 [身高,体重] 这两个指标,然后判断这个人是属于”胖“还是”瘦“这一类。对于这个问题,我们可以先测量n个人的身高、体重以及对应的指标”胖“,"瘦”,把胖和瘦分别用0和1来表示,把这n组数据输入模型进行训练。训练之后再把待分类的一个人的身高、体重输入模型中,看这个人是属于“胖”还是“瘦”。
        如果数据是有两个指标,可以用平面的点来表示数据,其中一个指标为x轴,另一个为y轴;如果数据有三个指标,可以用空间中的点表示数据;如果是p维的话(p>3),就是p维空间中的点。


                        

二、逻辑回归

2.1定义

        逻辑回归是一种统计学习方法,用于解决分类问题。它假设因变量(输出)为二分类变量,即取值为0或1。逻辑回归通过线性回归模型的结果经过一个逻辑函数(如sigmoid函数)来预测输入特征与输出变量之间的关系。
数学上,逻辑回归可以表示为:

其中,y表示输出变量的取值(0或1),x1,x2,...,xn表示输入特征,w1,w2,...,wn表示模型参数,e为自然对数的底。

2.2线性回归函数

将上述公式转换为向量形式:

2.3sigmoid函数

sigmoid函数是一种常见的激活函数,通常用于将实数映射到0到1之间的区间。

其数学表达式为:

其中,e表示自然对数的底。sigmoid函数的图像呈S形状,具有以下特点:

当x趋向正无穷时,g(x)趋近于1;
当x趋向负无穷时,g(x)趋近于0;
在原点处取得最大斜率。
sigmoid函数在逻辑回归中经常被用作激活函数,将线性模型的输出映射到0到1之间,表示某一类别的概率。此外,sigmoid函数也在人工神经网络等领域广泛应用,因为它具有连续、可导和非线性的特性,适合用于构建深度学习模型的隐藏层。

图像如下:

2.4损失函数

2.5最小二乘法

最小二乘法(least square method): 基于均方误差最小化来进行模型求解的方法称为最小二乘法

均方误差具有非常好的几何意义,它对应了常用的欧几里得距离(欧氏距离)。

参数估计(parameter estimation): 求解w和b使均方误差最小化的过程,称为对线性回归模型的最小二乘“参数估计”。

三、方法实现

3.1梯度下降法

对于如何估计w和b?我们总是希望预测值ŷ尽可能地拟合样本值y,损失函数描述了这种拟合关系,在逻辑回归中,使用交叉熵损失函数

我们可以将前面两个关系式代入,得到一个关于w和b的式子,而对于每一个样本都可以得到一个损失函数,设有m个样本,对这些损失函数求和得到一个成本函数:

接下来问题变成了如何找到一组w和b,使得这个成本函数尽可能地小,可以形象地将其表示为一个“找碗底”的过程。

从初始点开始,每一次迭代都使用如下公式更新w和b,使得成本函数总是沿着最接近“碗底”的方向下降:

其中α为学习率,用以控制每一次梯度下降的步长

关于初始化w和b,几乎是任意的初始化方法都有效,因为成本函数是凸函数,无论在哪里初始化,使用梯度下降法都应该能达到”碗底“或其附近,这也是为什么选择交叉熵作为损失函数的原因,它总能得到或接近一个全局最优解

下面我们只关注w,忽略b,具体来看看梯度下降法为什么能够”找到碗底“。

由上图可以看到,无论怎样初始化w,梯度下降法总是使w朝着成本函数减少的方向移动的。

3.2牛顿法

        牛顿迭代法的原理较为复杂,因此不在这里写出来。对比这牛顿法方法与梯度下降法的参数更新公式可以发现,两种方法不同在于牛顿法中多了一项二阶导数,这项二阶导数对参数更新的影响主要体现在 改变参数更新方向上。

        如图所示,红色是牛顿法参数更新的方向,绿色为梯度下降法参数更新方向,因为牛顿法考虑了二阶导数,因而可以找到更优的参数更新方向,在每次更新的步幅相同的情况下,可以比梯度下降法节省很多的迭代次数。
迭代过程:

四、代码案例

4.1生成示例数据

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler

np.random.seed(0)
X = np.r_[np.random.randn(20, 2) - [2, 2], np.random.randn(20, 2) + [2, 2]]
y = [0] * 20 + [1] * 20

4.2数据标准化

scaler = StandardScaler()
X = scaler.fit_transform(X)

4.3拆分数据集为训练集和测试集

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

4.4训练逻辑回归模型

model = LogisticRegression(solver='liblinear')
model.fit(X_train, y_train)

4.5预测

y_pred = model.predict(X_test)

4.6绘制决策边界和数据散点图

plt.scatter(X[:20, 0], X[:20, 1], color='blue', marker='o', label='class 0')
plt.scatter(X[20:, 0], X[20:, 1], color='red', marker='x', label='class 1')

4.7绘制决策边界

x1_min, x1_max = X[:, 0].min(), X[:, 0].max()
x2_min, x2_max = X[:, 1].min(), X[:, 1].max()
xx1, xx2 = np.meshgrid(np.linspace(x1_min, x1_max), np.linspace(x2_min, x2_max))
grid = np.c_[xx1.ravel(), xx2.ravel()]
probs = model.predict_proba(grid)[:, 1].reshape(xx1.shape)
plt.contour(xx1, xx2, probs, [0.5], linewidths=1, colors='black')

plt.xlabel('feature 1')
plt.ylabel('feature 2')
plt.legend()
plt.show()

图示:

        在这个示例中,我们首先生成了一些示例数据,并使用matplotlib库绘制了数据的散点图。然后,我们定义了sigmoid函数和损失函数,并且使用scikit-learn库的LogisticRegression来训练逻辑回归模型。最后,我们使用matplotlib库绘制了决策边界,以可视化模型的分类效果。

       ****** 下面代码示例展示了如何使用最小二乇法、牛顿法和梯度下降法来求解逻辑回归模型的参数。可以根据需要调整参数、数据集和迭代次数来进行实验和理解不同方法的性能和收敛速度。

1.最小二乘法

import numpy as np

# 最小二乘法求解逻辑回归参数
def least_squares(X, y):
    X_b = np.c_[np.ones((len(X), 1)), X]  # 添加偏置项
    theta_best = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y)
    return theta_best

# 示例数据
X = np.array([[1], [2], [3], [4]])
y = np.array([0, 0, 1, 1])

# 使用最小二乘法求解参数
theta_best = least_squares(X, y)

print("Theta best (Least Squares):", theta_best)

2.牛顿法

import numpy as np

# sigmoid函数
def sigmoid(z):
    return 1 / (1 + np.exp(-z))

# 牛顿法求解逻辑回归参数
def newton_method(X, y, max_iter=100, tol=1e-6):
    m, n = X.shape
    X_b = np.c_[np.ones((m, 1)), X]  # 添加偏置项
    theta = np.zeros(n + 1)

    for _ in range(max_iter):
        h = sigmoid(X_b.dot(theta))
        gradient = 1/m * X_b.T.dot(h - y)
        hessian = 1/m * X_b.T.dot(np.diag(h*(1-h))).dot(X_b)
        delta = np.linalg.inv(hessian).dot(gradient)
        theta -= delta

        if np.linalg.norm(delta) < tol:
            break

    return theta

# 示例数据
X = np.array([[1], [2], [3], [4]])
y = np.array([0, 0, 1, 1])

# 使用牛顿法求解参数
theta_best = newton_method(X, y)

print("Theta best (Newton's method):", theta_best)

3.梯度下降法

import numpy as np

# sigmoid函数
def sigmoid(z):
    return 1 / (1 + np.exp(-z))

# 梯度下降法求解逻辑回归参数
def gradient_descent(X, y, learning_rate=0.01, max_iter=1000, tol=1e-6):
    m, n = X.shape
    X_b = np.c_[np.ones((m, 1)), X]  # 添加偏置项
    theta = np.zeros(n + 1)

    for _ in range(max_iter):
        h = sigmoid(X_b.dot(theta))
        gradient = 1/m * X_b.T.dot(h - y)
        theta -= learning_rate * gradient

        if np.linalg.norm(learning_rate * gradient) < tol:
            break

    return theta

# 示例数据
X = np.array([[1], [2], [3], [4]])
y = np.array([0, 0, 1, 1])

# 使用梯度下降法求解参数
theta_best = gradient_descent(X, y)

print("Theta best (Gradient Descent):", theta_best)

五、优、缺点

1、优点
(1)适合分类场景

(2)计算代价不高,容易理解实现。

(3)不用事先假设数据分布,这样避免了假设分布不准确所带来的问题。

(4)不仅预测出类别,还可以得到近似概率预测。

(5)目标函数任意阶可导。

2、缺点
(1)容易欠拟合,分类精度不高。

(2)数据特征有缺失或者特征空间很大时表现效果并不好。

六、结论

逻辑回归是一种用于解决分类问题的机器学习算法。以下是关于逻辑回归的总结:

  1. 逻辑回归是一种基于概率的分类算法,通常用于解决二分类问题,即将数据分为两个类别。

  2. 逻辑回归通过将特征的加权和与偏置项进行线性组合,并经过一个sigmoid函数(也称为logistic函数)来预测输出为正类的概率。

  3. 训练逻辑回归模型的目标是最大化似然函数,即最大化模型预测样本标签的概率。

  4. 逻辑回归模型通常使用梯度下降等优化算法来最小化损失函数,例如对数损失函数。

  5. 逻辑回归可以处理线性可分和线性不可分的情况,但在处理非线性问题时通常需要进行特征工程或使用多项式特征。

  6. 逻辑回归的优点包括计算速度快、易于解释和实现、适用于大规模数据集;缺点包括对特征之间相关性敏感、容易受到异常值的影响。

总的来说,逻辑回归是一种简单而有效的分类算法,在许多实际应用中都取得了不错的效果。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值