逻辑回归(Logistics Regression)是机器学习中常见的分类算法,算法以较高的稳定性和可解释性常在金融场景下使用。算法将线性回归(Linear Regression)的基础上,通过引入Sigmoid函数,从而实现二分类。
线性回归函数:
其中,是模型学习的特征权重,
为输入样本的特征向量。
Sigmoid函数公式如下:
结合Sigmoid函数将线性回归映射,计算的概率公式如下:
的过程。
1 损失函数
正类和负类概率如下:
综上结合得到输出的概率:
对样本输出的概率越高,越接近真实类别。对m条训练样本概率相乘公式如下:
是第i条样本向量,
第i条样本向量对应的类别。
值越高,模型拟合度也越高。因此,求解
使得
最大化即模型最优。
对取对数和取负数操作,模型最优化变换为
值越小,模型拟合度也越高,公式变化如下:
2 梯度下降法
梯度下降(Gradient Descent)是常见的求解无约束函数最小化函数的方法。通过求偏导向下降最快的方向前进更新值,以此迭代直至
最小。公式如下:
其中,是第j个特征权重系数,
是学习率或步长,
是损失函数。
梯度下降(Gradient Descent)有批量梯度下降(Batch Gradient Descent)、随机梯度下降法(Stochastic Gradient Descent)和小批量梯度下降法(Mini-Batch Gradient Descent)。差别在于每次更新时所用样本量,以下是批量梯度下降求偏导,推导如下:
将计算结果带入,迭代更新公式如下:
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_)