首页
/ 告别调包依赖:从零实现线性回归与逻辑回归模型

告别调包依赖:从零实现线性回归与逻辑回归模型

2026-02-04 04:51:31作者:廉皓灿Ida

你是否还在依赖机器学习库(Machine Learning Library, MLL)的黑盒模型?是否想真正理解线性模型的数学原理与代码实现?本文将带你从零开始,用不到200行代码实现线性回归(Linear Regression)和逻辑回归(Logistic Regression),让你彻底掌握这两个基础但强大的算法。读完本文,你将能够:

  • 理解线性模型的核心数学原理
  • 掌握梯度下降(Gradient Descent)优化算法
  • 实现带正则化的线性回归与逻辑回归
  • 解决实际的回归与分类问题

线性模型:从数学公式到代码实现

线性模型是机器学习中最基础也最常用的模型之一,它通过对输入特征进行线性组合来预测输出结果。MLAlgorithms项目中的mla/linear_models.py文件提供了清晰简洁的实现,我们将以此为基础进行讲解。

核心架构:BasicRegression基类

项目采用面向对象的设计思想,将线性回归和逻辑回归的共同功能抽象到BasicRegression基类中。这个基类实现了梯度下降优化、正则化等核心功能,让代码更加简洁和可维护。

class BasicRegression(BaseEstimator):
    def __init__(self, lr=0.001, penalty="None", C=0.01, tolerance=0.0001, max_iters=1000):
        self.C = C                  # 正则化系数
        self.penalty = penalty      # 正则化类型:'l1'、'l2'或None
        self.tolerance = tolerance  # 收敛容忍度
        self.lr = lr                # 学习率
        self.max_iters = max_iters  # 最大迭代次数
        self.errors = []            # 记录训练过程中的误差
        self.theta = []             # 模型参数
        # ... 其他初始化代码

线性回归:预测连续值

线性回归用于预测连续型输出变量,它的核心是最小化均方误差(Mean Squared Error, MSE)。在MLAlgorithms中,LinearRegression类继承自BasicRegression,并实现了相应的损失函数:

class LinearRegression(BasicRegression):
    """Linear regression with gradient descent optimizer."""
    
    def _loss(self, w):
        loss = self.cost_func(self.y, np.dot(self.X, w))
        return self._add_penalty(loss, w)
    
    def init_cost(self):
        self.cost_func = mean_squared_error  # 使用均方误差作为损失函数

逻辑回归:处理分类问题

逻辑回归虽然名字中带有"回归",但实际上是一种分类算法。它通过sigmoid函数将线性输出转换为概率值,适用于二分类问题:

class LogisticRegression(BasicRegression):
    """Binary logistic regression with gradient descent optimizer."""
    
    def init_cost(self):
        self.cost_func = binary_crossentropy  # 使用交叉熵作为损失函数
    
    def _loss(self, w):
        loss = self.cost_func(self.y, self.sigmoid(np.dot(self.X, w)))
        return self._add_penalty(loss, w)
    
    @staticmethod
    def sigmoid(x):
        return 0.5 * (np.tanh(0.5 * x) + 1)  # 数值稳定的sigmoid实现

实战指南:使用线性模型解决实际问题

了解了线性模型的实现原理后,让我们看看如何使用MLAlgorithms中的线性模型解决实际问题。项目的examples/linear_models.py文件提供了完整的使用示例。

线性回归:预测房价

下面是使用线性回归解决回归问题的示例代码:

def regression():
    # 生成随机回归问题数据
    X, y = make_regression(
        n_samples=10000, n_features=100, n_informative=75, 
        noise=0.05, random_state=1111, bias=0.5
    )
    X_train, X_test, y_train, y_test = train_test_split(
        X, y, test_size=0.25, random_state=1111
    )
    
    # 创建并训练模型
    model = LinearRegression(lr=0.01, max_iters=2000, penalty="l2", C=0.03)
    model.fit(X_train, y_train)
    
    # 预测并评估
    predictions = model.predict(X_test)
    print("回归问题MSE:", mean_squared_error(y_test, predictions))

逻辑回归:客户流失预测

下面是使用逻辑回归解决分类问题的示例代码:

def classification():
    # 生成随机分类问题数据
    X, y = make_classification(
        n_samples=1000, n_features=100, n_informative=75,
        random_state=1111, n_classes=2, class_sep=2.5
    )
    X_train, X_test, y_train, y_test = train_test_split(
        X, y, test_size=0.1, random_state=1111
    )
    
    # 创建并训练模型
    model = LogisticRegression(lr=0.01, max_iters=500, penalty="l1", C=0.01)
    model.fit(X_train, y_train)
    
    # 预测并评估
    predictions = model.predict(X_test)
    print("分类问题准确率:", accuracy(y_test, predictions))

正则化:解决过拟合问题

在实际应用中,我们经常会遇到过拟合问题。MLAlgorithms提供了L1和L2两种正则化方法来解决这个问题:

def _add_penalty(self, loss, w):
    """Apply regularization to the loss."""
    if self.penalty == "l1":  # L1正则化(Lasso)
        loss += self.C * np.abs(w[1:]).sum()
    elif self.penalty == "l2":  # L2正则化(Ridge)
        loss += (0.5 * self.C) * (w[1:] ** 2).sum()
    return loss
  • L1正则化(Lasso):会产生稀疏权重,可用于特征选择
  • L2正则化(Ridge):会使权重值普遍较小,提高模型泛化能力

梯度下降:优化模型参数

梯度下降是训练线性模型的核心算法,MLAlgorithms实现了标准的梯度下降过程:

def _gradient_descent(self):
    theta = self.theta
    errors = [self._cost(self.X, self.y, theta)]
    cost_d = grad(self._loss)  # 使用autograd计算梯度
    
    for i in range(1, self.max_iters + 1):
        delta = cost_d(theta)  # 计算梯度
        theta -= self.lr * delta  # 更新参数
        
        errors.append(self._cost(self.X, self.y, theta))
        logging.info("Iteration %s, error %s" % (i, errors[i]))
        
        # 检查收敛条件
        error_diff = np.linalg.norm(errors[i - 1] - errors[i])
        if error_diff < self.tolerance:
            logging.info("Convergence has reached.")
            break
    return theta, errors

如何开始使用MLAlgorithms

要开始使用MLAlgorithms中的线性模型,只需按照以下步骤操作:

  1. 克隆项目仓库:
git clone https://gitcode.com/gh_mirrors/ml/MLAlgorithms
cd MLAlgorithms
  1. 安装依赖:
pip install -r requirements.txt
  1. 运行线性模型示例:
python examples/linear_models.py

总结与展望

线性模型虽然简单,但却是机器学习的基础。通过本文的讲解,你应该已经掌握了线性回归和逻辑回归的原理与实现。MLAlgorithms项目提供的实现不仅简洁易懂,而且包含了正则化、梯度下降等关键技术,能够解决实际问题。

未来,你可以尝试:

  • 实现更多类型的线性模型(如弹性网络)
  • 优化梯度下降算法(如使用动量法、自适应学习率)
  • 将线性模型应用到自己的数据集上

希望本文能帮助你更好地理解线性模型,并启发你深入探索机器学习的更多领域!如果你觉得这篇文章有帮助,请点赞、收藏并关注,我们将持续推出更多机器学习算法的详解。

登录后查看全文
热门项目推荐
相关项目推荐