分类:逻辑回归

逻辑回归

逻辑回归(Logistic Regression)是一种预测分析,解释因变量与一个或者多个自变量之间的关系,与线性回归不同之处就是它的目标变量有几种类别,所以逻辑回归主要用于解决分类问题。 线性回归适用于估计连续值(例如估算房价),但它不是预测观测数据点类别的最佳工具。为了估计分类,我们需要一些关于该数据点最可能的类别的指导。为此,我们使用Logistic回归。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

实验步骤

1 安装并引入必要的库

!pip install numpy==1.16.0
!pip install scikit-learn==0.22.1
!pip install matplotlib==3.1.0

import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
import matplotlib.pyplot as plt
%matplotlib inline

2 数据处理

我们将加载我们要使用的数据集。在这种情况下,我们正在使用 iris内置的数据集 — 所以不需要做任何预处理,我们可以直接操纵它。我们将数据集分为X和y,然后分解为训练集_trainX_和_trainY_,随机测试集_testX_和_testY_。

iris = load_iris()
iris_X = iris.data
iris_y = iris.target
trainX, testX, trainY, testY = train_test_split(iris_X, iris_y, test_size=0.25, random_state=0, stratify=iris_y)

3 拟合预测

在这里插入图片描述
现在创建一个名为regr的LogisticRegression实例:

regr = LogisticRegression(max_iter = 2000)

利用regr模型训练trainX和trainY:

regr.fit(trainX, trainY)

回归评价:

print('Coefficients:%s, intercept %s' % (regr.coef_,regr.intercept_))
print("Residual sum of squares: %.2f"% np.mean((regr.predict(testX) - testY) ** 2))
print('Score: %.2f' % regr.score(testX, testY))

4 调参

首先我们考察LogisticRegression()的multi_class参数对分类结果的影响。默认采用的是one-ve-rest策略,但是逻辑回归模型原生就支持多类分类,即multi_class=‘multinomial’

注意:只有LogisticRegression()的solver参数为’newton-cg’或者’lbfgs’才能配合multi_class=‘multinomial’,否则报错。

regr1 = LogisticRegression(multi_class='multinomial',solver='lbfgs', max_iter=2000)
regr1.fit(trainX,trainY)
print('Coefficients:%s, intercept %s' % (regr1.coef_,regr1.intercept_))
print("Residual sum of squares: %.2f" % np.mean((regr1.predict(testX) - testY) ** 2))
print('Score: %.2f' % regr1.score(testX, testY))

接下来,我们考察LogisticRegression()的参数C对分类模型的预测性能的影响。C是正则化项系数的倒数,它越小则正则化项的权重越大。

#不显示warnings
import warnings
warnings.filterwarnings("ignore")

Cs = np.logspace(-2,4,num=100)
scores = []
for C in Cs:
    regr2 = LogisticRegression(C=C)
    regr2.fit(trainX,trainY)
    scores.append(regr2.score(testX,testY))
print(scores)

scores数据太多,不利于分析,所以我们可以借助绘图进行分析:

fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(Cs,scores)
ax.set_xlabel(r'C')
ax.set_ylabel(r'score')
ax.set_xscale('log')
ax.set_title('LogisticRegression')
plt.show()

在这里插入图片描述
从图中可以看出,随着C的增大(即正则化项减少),LogisticRegression的预测准确率上升;当C增大到一定程度,LogisticRegression的预测准确率维持在较高的水准上保持不变。

练习1
对本次实验中LogisticRegression()的参数默认_penalty=‘l2’进行修改,修改为_penalty=‘l1’,solver设定为’liblinear’,看看运行结果有什么不同?

import warnings
import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
import matplotlib.pyplot as plt
%matplotlib inline

iris = load_iris()
iris_X = iris.data
iris_y = iris.target
trainX, testX, trainY, testY = train_test_split(iris_X, iris_y, test_size=0.25, random_state=0, stratify=iris_y)

regr1 = LogisticRegression(max_iter = 2000)
regr1 = LogisticRegression(penalty='l1',solver='liblinear',max_iter=2000)
regr1.fit(trainX,trainY)
print('Coefficients:%s, intercept %s' % (regr1.coef_,regr1.intercept_))
print("Residual sum of squares: %.2f" % np.mean((regr1.predict(testX) - testY) ** 2))
print('Score: %.2f' % regr1.score(testX, testY))

warnings.filterwarnings("ignore")
Cs = np.logspace(-2,4,num=100)
scores = []
for C in Cs:
    regr2 = LogisticRegression(C=C)
    regr2.fit(trainX,trainY)
    scores.append(regr2.score(testX,testY))
    
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(Cs,scores)
ax.set_xlabel(r'C')
ax.set_ylabel(r'score')
ax.set_xscale('log')
ax.set_title('LogisticRegression')
plt.show()

在这里插入图片描述

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

追阳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值