逻辑回归(Logistics Regression)是机器学习中常见的分类算法,算法以较高的稳定性和可解释性常在金融场景下使用。算法将线性回归(Linear Regression)的基础上,通过引入Sigmoid函数,从而实现二分类。
  线性回归函数:
python LogisticRegression加载模型 python logisticregression函数_机器学习
  其中,python LogisticRegression加载模型 python logisticregression函数_逻辑回归_02是模型学习的特征权重,python LogisticRegression加载模型 python logisticregression函数_线性回归_03为输入样本的特征向量。
  Sigmoid函数公式如下:
python LogisticRegression加载模型 python logisticregression函数_权重_04
  结合Sigmoid函数将线性回归映射,计算的概率公式如下:
python LogisticRegression加载模型 python logisticregression函数_分类算法_05

python LogisticRegression加载模型 python logisticregression函数_逻辑回归_02的过程。

1 损失函数

python LogisticRegression加载模型 python logisticregression函数_线性回归_03正类和负类概率如下:
python LogisticRegression加载模型 python logisticregression函数_逻辑回归_08
  综上结合得到python LogisticRegression加载模型 python logisticregression函数_线性回归_03输出的概率:
python LogisticRegression加载模型 python logisticregression函数_机器学习_10
  对样本python LogisticRegression加载模型 python logisticregression函数_线性回归_03输出的概率越高,越接近真实类别。对m条训练样本概率相乘公式如下:
python LogisticRegression加载模型 python logisticregression函数_机器学习_12

python LogisticRegression加载模型 python logisticregression函数_逻辑回归_13是第i条样本向量, python LogisticRegression加载模型 python logisticregression函数_逻辑回归_14第i条样本向量对应的类别。python LogisticRegression加载模型 python logisticregression函数_逻辑回归_15值越高,模型拟合度也越高。因此,求解python LogisticRegression加载模型 python logisticregression函数_逻辑回归_02使得python LogisticRegression加载模型 python logisticregression函数_逻辑回归_15最大化即模型最优。
  对python LogisticRegression加载模型 python logisticregression函数_线性回归_18取对数和取负数操作,模型最优化变换为python LogisticRegression加载模型 python logisticregression函数_线性回归_18值越小,模型拟合度也越高,公式变化如下:
python LogisticRegression加载模型 python logisticregression函数_逻辑回归_20

2 梯度下降法

  梯度下降(Gradient Descent)是常见的求解无约束函数最小化函数的方法。通过求偏导向下降最快的方向前进更新python LogisticRegression加载模型 python logisticregression函数_逻辑回归_02值,以此迭代直至python LogisticRegression加载模型 python logisticregression函数_线性回归_18最小。公式如下:
python LogisticRegression加载模型 python logisticregression函数_线性回归_23
  其中,python LogisticRegression加载模型 python logisticregression函数_权重_24是第j个特征权重系数,python LogisticRegression加载模型 python logisticregression函数_机器学习_25是学习率或步长,python LogisticRegression加载模型 python logisticregression函数_线性回归_18是损失函数。
  梯度下降(Gradient Descent)有批量梯度下降(Batch Gradient Descent)、随机梯度下降法(Stochastic Gradient Descent)和小批量梯度下降法(Mini-Batch Gradient Descent)。差别在于每次更新python LogisticRegression加载模型 python logisticregression函数_逻辑回归_02时所用样本量,以下是批量梯度下降求偏导,推导如下:
python LogisticRegression加载模型 python logisticregression函数_分类算法_28
  将计算结果带入,迭代更新公式如下:
python LogisticRegression加载模型 python logisticregression函数_分类算法_29

3 Python源码实现

import numpy as np


class LogisticRegression(object):
    """
    逻辑回归训练类
    Parameters
    ----------
    alpha : float,模型学习率
    maxiter : int,模型训练迭代次数
    Examples
    --------
    >>> from sklearn.datasets import load_iris
    >>> iris = load_iris()
    >>> x = iris.data[:100]
    >>> y = iris.target[:100]
    >>> clf = LogisticRegression()
    >>> clf.fit(x,y)
    >>> clf.coef_
    [[-0.91868845]
    [-1.83345461]
    [ 3.2758664 ]
    [ 2.10152911]]
    >>> clf.predict_proba(x[1])
    [[0.00672338]]
    """

    def __init__(self, alpha=0.3, maxiter=500):
        self.alpha = alpha  # 学习率
        self.maxiter = maxiter  # 迭代次数
        self.coef_ = None

    @staticmethod
    def sigmoid(x):
        return 1 / (1 + np.exp(-x))

    def fit(self, x, y):
        """
        梯度提升方法训练模型特征系数
        :param x: numpy or list类型,特征变量
        :param y: numpy or list类型,目标列
        """
        x = np.mat(x)  # 将数据类型转换为numpy
        y = np.mat(y).transpose()
        m, n = np.shape(x)
        self.coef_ = np.ones((n, 1))  # 初始化特征系数(n*1)向量,[1,1,1,……]
        for k in range(self.maxiter):
            h = self.sigmoid(x * self.coef_)
            error = (y - h)
            self.coef_ = self.coef_ + self.alpha / m * x.transpose() * error  # 更新特征系数

    def predict_proba(self, x):
        """
        模型预测,返回Postive的概率
        :param x: numpy or list类型,特征变量
        :return: list类型,预测正类结果
        """
        if self.coef_ is None:
            raise ValueError('模型未进行训练')
        x = np.mat(x)  # 将数据类型转换为numpy
        return self.sigmoid(x * self.coef_)