Logistics Regression原理-Python实现

  逻辑回归(Logistics Regression)是机器学习中常见的分类算法,算法以较高的稳定性和可解释性常在金融场景下使用。算法将线性回归(Linear Regression)的基础上,通过引入Sigmoid函数,从而实现二分类。
  线性回归函数:
z = θ 0 + θ 1 x 1 + θ 2 x 2 + θ 3 x 3 + ⋯ + θ i x i = θ T x z = \theta _{0}+\theta _{1}x_{1}+\theta _{2}x_{2}+\theta _{3}x_{3}+\cdots+\theta _{i}x_{i}=\theta ^{T}x z=θ0+θ1x1+θ2x2+θ3x3++θixi=θTx
  其中, θ \theta θ是模型学习的特征权重, x x x为输入样本的特征向量。
  Sigmoid函数公式如下:
g ( z ) = 1 1 + e − z g(z)=\frac{1}{1+e^{-z}} g(z)=1+ez1
  结合Sigmoid函数将线性回归映射,计算的概率公式如下:
h θ ( x ) = 1 1 + e − θ T x h_{\theta}(x)=\frac{1}{1+e^{-\theta ^{T}x}} hθ(x)=1+eθTx1

  从公式中可看出,模型训练就是确定最优的特征权重 θ \theta θ的过程。

1 损失函数

  对于Logistics Regression计算样本 x x x正类和负类概率如下:
P ( y = 1 ∣ x ; θ ) = h θ ( x ) P ( y = 0 ∣ x ; θ ) = 1 − h θ ( x ) P\left ( y=1|x;\theta \right )=h_{\theta }(x)\\ P\left ( y=0|x;\theta \right )=1-h_{\theta }(x) P(y=1x;θ)=hθ(x)P(y=0x;θ)=1hθ(x)
  综上结合得到 x x x输出的概率:
P ( y ∣ x ; θ ) = P ( y = 1 ∣ x ; θ ) y P ( y = 0 ∣ x ; θ ) 1 − y P\left ( y|x;\theta \right )=P\left ( y=1|x;\theta \right )^{y}P\left ( y=0|x;\theta \right )^{1-y} P(yx;θ)=P(y=1x;θ)yP(y=0x;θ)1y
  对样本 x x x输出的概率越高,越接近真实类别。对m条训练样本概率相乘公式如下:
L ( θ ) = ∏ i = 1 m P ( y ( i ) ∣ x ( i ) ; θ ) = ∏ i = 1 m [ h θ ( x ( i ) ) ] y ( i ) [ 1 − h θ ( x ( i ) ) ] 1 − y ( i ) L(\theta )=\prod_{i=1}^{m}P\left ( y^{(i)}|x^{(i)};\theta \right )=\prod_{i=1}^{m}\left [h_{\theta }(x^{(i)})\right ]^{y^{(i)}} \left [ 1-h_{\theta }(x^{(i)}) \right ]^{1-y^{(i)}} L(θ)=i=1mP(y(i)x(i);θ)=i=1m[hθ(x(i))]y(i)[1hθ(x(i))]1y(i)

  其中, x ( i ) x^{(i)} x(i)是第i条样本向量, y ( i ) y^{(i)} y(i)第i条样本向量对应的类别。 L ( θ ) L(\theta ) L(θ)值越高,模型拟合度也越高。因此,求解 θ \theta θ使得 L ( θ ) L(\theta ) L(θ)最大化即模型最优。
  对 J ( θ ) J(\theta) J(θ)取对数和取负数操作,模型最优化变换为 J ( θ ) J(\theta) J(θ)值越小,模型拟合度也越高,公式变化如下:
J ( θ ) = − ln ⁡ ( L ( θ ) ) = − ∑ i = 1 m y ( i ) ln ⁡ ( h θ ( x ( i ) ) ) + ( 1 − y ( i ) ) ln ⁡ ( h θ ( x ( i ) ) ) J(\theta)=-\ln\left ( L(\theta ) \right )=-\sum_{i=1}^{m}y^{(i)}\ln(h_{\theta }(x^{(i)}))+(1-y^{(i)})\ln(h_{\theta }(x^{(i)})) J(θ)=ln(L(θ))=i=1my(i)ln(hθ(x(i)))+(1y(i))ln(hθ(x(i)))

2 梯度下降法

  梯度下降(Gradient Descent)是常见的求解无约束函数最小化函数的方法。通过求偏导向下降最快的方向前进更新 θ \theta θ值,以此迭代直至 J ( θ ) J(\theta) J(θ)最小。公式如下:
θ j = θ j − η ∂ J ( θ ) ∂ θ j \theta _{j}=\theta _{j}-\eta \frac{\partial J(\theta)}{\partial\theta_ {j}} θj=θjηθjJ(θ)
  其中, θ j \theta_{j} θj是第j个特征权重系数, η \eta η是学习率或步长, J ( θ ) J(\theta) J(θ)是损失函数。
  梯度下降(Gradient Descent)有批量梯度下降(Batch Gradient Descent)、随机梯度下降法(Stochastic Gradient Descent)和小批量梯度下降法(Mini-Batch Gradient Descent)。差别在于每次更新 θ \theta θ时所用样本量,以下是批量梯度下降求偏导,推导如下:
∂ J θ ( x ) ∂ θ j = − 1 m ∑ i = 1 m y ( i ) ∂ ln ⁡ ( h θ ( x ( i ) ) ) ∂ θ j + ( 1 − y ( i ) ) ∂ ln ⁡ ( 1 − h θ ( x ( i ) ) ) ∂ θ j = − 1 m ∑ i = 1 m y ( i ) ( 1 − h θ ( x ( i ) ) ) x j ( i ) − ( 1 − y ( i ) ) h θ ( x ( i ) x j ( i ) = − 1 m ∑ i = 1 m ( y ( i ) − h θ ( x ( i ) ) x j ( i ) \frac{\partial J_{\theta }(x)}{\partial \theta_{j}}=-\frac{1}{m}\sum_{i=1}^{m}y^{(i)}\frac{\partial \ln\left ( h_{\theta }(x^{(i)}) \right )}{\partial \theta _{j}}+(1-y^{(i)})\frac{\partial \ln\left ( 1-h_{\theta }(x^{(i)}) \right )}{\partial \theta _{j}}\\ \quad \quad=-\frac{1}{m}\sum_{i=1}^{m}y^{(i)}\left ( 1-h_{\theta }(x^{(i)}) \right )x_{j}^{(i)}-(1-y^{(i)})h_{\theta }(x^{(i)}x_{j}^{(i)} \\ =-\frac{1}{m}\sum_{i=1}^{m}\left (y^{(i)}- h_{\theta }(x^{(i)} \right )x_{j}^{(i)}\quad\quad\quad\quad\quad\quad\quad\quad\quad θjJθ(x)=m1i=1my(i)θjln(hθ(x(i)))+(1y(i))θjln(1hθ(x(i)))=m1i=1my(i)(1hθ(x(i)))xj(i)(1y(i))hθ(x(i)xj(i)=m1i=1m(y(i)hθ(x(i))xj(i)
  将计算结果带入,迭代更新公式如下:
θ j = θ j + η m ∑ i = 1 m ( y i − h θ ( x i ) ) x i j \theta _{j}=\theta _{j}+ \frac{\eta}{m}\sum_{i=1}^{m}\left ( y^{i}-h_{\theta}(x^{i}) \right )x_{i}^{j} θj=θj+mηi=1m(yihθ(xi))xij

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_)

参考

[1]Peter Harrington. 机器学习实战[M]. 北京:人民邮电出版社,2013.6.
[2]李航. 统计学习方法[M]. 北京:清华大学出版社,2012.3.

你可能感兴趣的:(模型算法)