逻辑回归
逻辑回归(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()