为什么需要逻辑回归

逻辑回归是由线性回归演变而来的一个分类算法,所以说逻辑回归对数据的要求比较高。对于分类器来说,我们前面已经学习了几个强大的分类器(决策树, 随机森林等),这些分类器对数据的要求没有那么高,那我们为什么还需要逻辑回归呢?主要在于逻辑回归有以下几个优势:

  • 对线性关系的拟合效果好到丧心病狂:特征与标签之间的线性关系极强的数据,比如金融领域中的信用卡欺诈,评分卡制作,电商中的营销预测等等相关的数据,都是逻辑回归的强项。虽然现在有了梯度提升树GDBT,比逻辑回归效果更好,也被许多数据咨询公司启用,但逻辑回归在金融领域,尤其是银行业中的统治地位依然不可动摇
  • 计算快 : 在大型数据集上的表现优于其他的分类器
  • 抗噪能力强

重要参数

  • penalty:指定正则化的参数可选为"l1", “l2” 默认为“l2”.
    注意:l1正则化会将部分参数压缩到0,而l2正则化不会让参数取到0只会无线接近
  • C : 大于0的浮点数。C越小对损失函数的惩罚越重
  • multi_class : 告知模型要处理的分类问题是二分类还是多分类。默认为“ovr”(二分类)
    • “multinational” : 表示处理多分类问题,在solver="liblinear"师不可用
    • “auto” : 表示让模型自动判断分类类型
  • solver:指定求解方式
solver参数liblinearlbfgsnewton-cgsagsaga
使用原理梯度下降法拟牛顿法的一种利用
损失函数二阶导数矩阵
来迭代优化损失函数
牛顿法的一种利用
损失函数二阶导数矩阵
来迭代优化损失函数
随机梯度下降随机梯度下降的优化
支持的惩罚项L1,L2L2L2L2L1,L2
支持的回归类型
multinormal
ovr
在大型数据集上速度
这里的快慢仅是内部比较
与外部比较逻辑回归仍然是比较快速的

penalty参数示例

通过在乳腺癌数据集上的使用,来比较L1,L2参数求得的系数。

from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_breast_cancer # 乳腺癌数据集
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import numpy as np
import matplotlib.pyplot as plt

%matplotlib inline
# 获得特征标签数据
data = load_breast_cancer()
X = data['data']
y = data['target']

# 分割训练姐测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1)

lr_l1 = LogisticRegression(penalty="l1", C=0.5, solver="liblinear")
lr_l2 = LogisticRegression(penalty="l2", C=0.5, solver="liblinear")

# 训练模型
lr_l1.fit(X_train, y_train)
lr_l2.fit(X_train, y_train)

部分参数为0
没有参数为0

L1,L2的效果对比

# 训练集表现
l1_train_predict = []
l2_train_predict = []

# 测试集表现
l1_test_predict = []
l2_test_predict = []

for c in np.linspace(0.01, 2, 50) :
    lr_l1 = LogisticRegression(penalty="l1", C=c, solver="liblinear", max_iter=1000)
    lr_l2 = LogisticRegression(penalty='l2', C=c, solver='liblinear', max_iter=1000)
    
    # 训练模型,记录L1正则化模型在训练集测试集上的表现
    lr_l1.fit(X_train, y_train)
    l1_train_predict.append(accuracy_score(lr_l1.predict(X_train), y_train))
    l1_test_predict.append(accuracy_score(lr_l1.predict(X_test), y_test))
    
    # 记录L2正则化模型的表现
    lr_l2.fit(X_train, y_train)
    l2_train_predict.append(accuracy_score(lr_l2.predict(X_train), y_train))
    l2_test_predict.append(accuracy_score(lr_l2.predict(X_test), y_test))
    
data = [l1_train_predict, l2_train_predict, l1_test_predict, l2_test_predict]
label = ['l1_train', 'l2_train', 'l1_test', "l2_test"]
color = ['red', 'green', 'orange', 'blue']

plt.figure(figsize=(12, 6))
for i in range(4) :
    plt.plot(np.linspace(0.01, 2, 50), data[i], label=label[i], color=color[i])

plt.legend(loc="best")
plt.show()

在这里插入图片描述
一般情况下使用l2.在l2表现不好的时候考虑换l1尝试。具体实际中看个人的需求来选择使用哪个参数。

处理多多分类问题

将multi_class参数设置为multinational,或者auto即可。注意在使用multinational参数时,solver不能为liblinear。否则会报错。

# 导入鸢尾花数据集
from sklearn.datasets import load_iris
from sklearn.model_selection import cross_val_score
iris = load_iris()
X = iris.data
y = iris.target

# 将multi_class设置为multinational,solver设置为liblinear出现保存
# lr = LogisticRegression(penalty='l2', solver='liblinear', max_iter=1000, multi_class="multinomial")
# 出错:ValueError: Solver liblinear does not support a multinomial backend.

lr = LogisticRegression(C=0.5, penalty='l2', solver='sag', multi_class="auto", max_iter=2000)
score = cross_val_score(lr, X, y, cv=10).mean()
score # 0.9666666666666666

总结

本篇文章只是讲了逻辑回顾的简单使用,以及其中的几个重要的参数。文中没有涉及到任何的数学原理。逻辑回顾的数学原理相当的复杂难懂,感兴趣的小伙伴可以自行百度查看。

Logo

华为云1024程序员节送福利,参与活动赢单人4000元礼包,更有热门技术干货免费学习

更多推荐