机器学习之逻辑回归(对率回归)

线性回归模型帮助我们用最简单的线性方程实现了对数据的拟合,即实现了对连续值的预测。那怎么预测离散值( 分类)呢?
在数学意义上,就是找到一个单调可微函数将分类任务的标记与线性回归模型的预测值相关联。
形似S的Sigmoid函数可以实现将连续的预测值转换为离散的预测值。对于二分类任务,当线性预测值大于零,则输出离散值为正例;当线性预测值小于零, 则输出离散值为反例。
下图中的两个函数都可完成数值转换,红色代表单位阶跃函数,黑线代表对数几率函数。

机器学习之逻辑回归(对率回归)
横轴z是线性回归的预测值,纵轴y是二分类任务的输出标记。

; 1模型假设

对数几率函数(logistic function)是一种”Sigmoid”函数。可以把样本数据经过线性预测模型求得的值带入对数几率(逻辑)函数的x,根据函数值确定两个分类。对应的模型一般称为逻辑回归(logistic regression),也称对数几率回归(logit regression),简称”对率回归”。
l n y 1 − y = w T x + b ln\frac{y}{1-y}=w^Tx+b l n 1 −y y ​=w T x +b
注意:名称有”回归”字样,但属于 分类学习模型
我们将通过”极大似然法”(maximum likelihood method)来估计w和b。对率回归模型最大化”对数似然”(log-likelihood),
l ( w , b ) = ∑ i = 1 m l n p ( y i ∣ x i ; w , b ) l(w,b)=\sum_{i=1}^{m}ln\: p(y_i | x_i;w,b)l (w ,b )=i =1 ∑m ​l n p (y i ​∣x i ​;w ,b )
即令每个样本属于其真实标记的概率越大越好。

2评价与优化

分类任务性能度量:错误率、精度、查准率、查全率和F1等。
对数几率函数是任意阶可导的凸函数,根据凸优化理论,经典的数值优化算法如梯度下降法、牛顿法等都可求得最优解。梯度下降法参见前文。
牛顿法(Newton’s method),它是一种在实数域和复数域上近似求解方程的方法,使用函数f(x)的泰勒级数的前面几项来寻找方程f(x)=0的根。
牛顿法优化:假设任务是优化一个目标函数f,求函数f的极大极小问题,可以转化为求解函数f的导数f’=0的问题,这样求可以把优化问题看成方程求解问题(f’=0)。
一般认为牛顿法可以利用到曲线本身的信息,比梯度下降法更容易收敛(迭代更少次数),如下图是一个最小化目标方程的例子,红色曲线是利用牛顿法迭代求解,绿色曲线是利用梯度下降法求解。

机器学习之逻辑回归(对率回归)

; 3Sklearn代码实现

在Sklearn库中逻辑回归模型使用 LogisticRegression 类,其求解器(solver)可使用的优化算法,包括liblinear, newton-cg, lbfgs, sag 和 saga。

  • liblinear应用了坐标下降算法(Coordinate Descent, CD),并基于 scikit-learn 内附的高性能 C++ 库 LIBLINEAR library 实现。
  • newton-cg:是牛顿法家族的一种,利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数。
  • lbfgs(Limited-memory BFGS)属于准牛顿法,参数solver的默认值。
  • sag(Stochastic Average Gradient descent)基于平均随机梯度下降算法。在大数据集上的表现更快,大数据集指样本量大且特征数多。
  • saga 求解器是 sag 的一类变体。

示例:鸢尾花数据集分类任务

import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.model_selection import train_test_split
import sklearn.linear_model as sl
import sklearn.metrics as sm

iris = datasets.load_iris()

x = iris.data[:, :2]
y = iris.target

x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=37, test_size=0.2)

model = sl.LogisticRegression(solver='newton-cg', C=200)
model.fit(x_train, y_train)
pred_y = model.predict(x_test)
acc = model.score(x_train, y_train)
print('score', acc)

print('精度:', sm.accuracy_score(y_test, pred_y))
print('查准率:', sm.precision_score(y_test, pred_y, average='macro'))
print('召回率:', sm.recall_score(y_test, pred_y, average='macro'))
print('f1得分:', sm.f1_score(y_test, pred_y, average='macro'))
print('report', sm.classification_report(y_test, pred_y))

plt.title('Iris Classification')
plt.xlabel('x', fontsize=14)
plt.ylabel('y', fontsize=14)
plt.tick_params(labelsize=10)
plt.scatter(x_test[:, 0], x_test[:, 1], c=pred_y, cmap='brg', s=80)
plt.show()

运行结果,如下图:

机器学习之逻辑回归(对率回归)

Original: https://blog.csdn.net/weixin_44153121/article/details/113826290
Author: yangtom249
Title: 机器学习之逻辑回归(对率回归)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/631184/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球