基于Python的机器学习系列(8):Newton Raphson逻辑回归

        在本篇博文中,我们将探讨一种比传统梯度下降更高效的优化方法——Newton Raphson方法,并学习如何在逻辑回归中应用它。Newton Raphson方法通过利用二阶导数的曲率信息,快速地找到使代价函数最小化的参数。尽管这种方法在处理较小规模的数据集时速度极快,但随着特征数量的增加,它的性能可能会受到影响,因为需要计算矩阵的逆以及二阶导数。

Newton Raphson方法概述

        Newton Raphson方法是一种迭代算法,旨在通过对目标函数的二阶导数进行分析,找到函数的最小值点。与传统的梯度下降算法不同,Newton Raphson方法不仅考虑了一阶导数(斜率),还考虑了二阶导数(曲率),从而能够更快速地收敛到最优解。

实现步骤

        在本次实现中,我们将Newton Raphson方法应用于逻辑回归,具体步骤如下:

  1. 数据准备

    • 添加截距项
    • 将输入矩阵 X、目标向量 y 和权重向量 w 进行正确的形状处理
      • X 的形状为 (m, n),其中 m 是样本数量,n 是特征数量
      • y 的形状为 (m, ),为目标标签
      • w 的形状为 (n, ),为模型参数
    • 划分训练集和测试集
    • 特征缩放以加速收敛
    • 清理缺失数据(如果有)
    • (可选)特征工程
  2. 预测和计算损失

                损失函数采用交叉熵损失:

                其中h 定义为sigmoid函数: 

        3.计算曲率方向

                使用如下公式计算曲率方向:

                其中 H 为二阶导数矩阵(即Hessian矩阵)。

        4.更新参数

                使用如下规则更新参数:

        5.迭代

                迭代执行步骤2-4,直到达到最大迭代次数 max_iter,或新旧损失之间的差异小于预定义的阈值。

数据准备

        首先,我们需要生成并处理数据,包括添加截距项、特征缩放等。以下代码展示了这一过程:

from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler

# 生成数据集
X, y = make_classification(n_samples=500, n_features=5, n_redundant=1, n_informative=4,
                             n_clusters_per_class=2, random_state=14)
plt.scatter(X[:, 0], X[:, 1], marker='o', c=y,
            s=25, edgecolor='k')

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)

# 特征缩放
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

# 添加截距项
intercept = np.ones((X_train.shape[0], 1))
X_train   = np.concatenate((intercept, X_train), axis=1)
intercept = np.ones((X_test.shape[0], 1))
X_test    = np.concatenate((intercept, X_test), axis=1)

Newton Raphson算法实现

        在实现Newton Raphson算法时,我们需要计算梯度和Hessian矩阵,并使用这些信息来更新权重向量。以下代码展示了这一过程:

def newton(X, y, max_iter=1000):
    w = np.zeros(X.shape[1])
    l_rate = 0.01
    batch_size = int(0.1 * X.shape[0])
    for i in range(max_iter):
        ix = np.random.randint(0, X.shape[0])
        batch_X = X[ix:ix+batch_size]
        batch_y = y[ix:ix+batch_size]
        cost, second, first = newton_curve(batch_X, batch_y, w)
        if i % 500 == 0:
            print(f"Cost at iteration {i}", cost)
        H_inverse = np.linalg.pinv(second)
        w = w - l_rate * H_inverse @ first
    return w, i

def newton_curve(X, y, w):
    m = X.shape[0]
    h = h_theta(X, w)
    error = h - y
    cost = -(np.sum(-y * np.log(h) - (1 - y) * np.log(1 - h)))
    first = (1/m) * np.dot(X.T, error)
    second = X.T @ np.diag((h) * (1-h)) @ X
    return cost, second, first

def sigmoid(x):
    return 1 / (1 + np.exp(-x))
        
def h_theta(X, w):
    return sigmoid(X @ w)

def output(pred):
    return np.round(pred)

w, i = newton(X_train, y_train, max_iter=5000)

计算准确率

        接下来,我们使用训练好的模型对测试集进行预测,并计算模型的准确率:

from sklearn.metrics import accuracy_score
yhat = output(h_theta(X_test, w))
accuracy_score(y_test, yhat)

结语

        在这一系列文章中,我们先介绍了二元逻辑回归,接着扩展到多元逻辑回归,最后讨论了Newton-Raphson方法的逻辑回归。每种方法都有其独特的应用场景和优势。

  1. 二元逻辑回归:适用于只有两个类别的分类问题。通过对数几率(logit)函数的应用,我们可以将线性回归扩展到分类任务中。这个方法简单而有效,是大多数分类问题的基础。

  2. 多元逻辑回归:当问题有多个类别时,多元逻辑回归则是首选。它通过使用softmax函数来处理多类别分类问题,是二元逻辑回归的自然扩展。

  3. Newton-Raphson方法的逻辑回归:相比于传统的梯度下降法,Newton-Raphson方法提供了一种通过二阶导数(Hessian矩阵)来快速收敛的方法。虽然在特征数量较少时表现优异,但其在特征数量较多时由于需要计算Hessian矩阵的逆,可能会导致计算开销过大。

        每种方法在不同的场景下都有其独特的优势和局限性。了解并合理选择这些方法,可以帮助我们更好地解决分类问题。

        敬请期待下一篇博文:基于Python的机器学习系列(8):朴素贝叶斯 - 高斯模型。

如果你觉得这篇博文对你有帮助,请点赞、收藏、关注我,并且可以打赏支持我!

欢迎关注我的后续博文,我将分享更多关于人工智能、自然语言处理和计算机视觉的精彩内容。

谢谢大家的支持!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

会飞的Anthony

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值