📅  最后修改于: 2020-09-27 03:21:34             🧑  作者: Mango
注意:Logistic回归使用预测建模的概念作为回归;因此,它称为逻辑回归,但用于对样本进行分类。因此,它属于分类算法。
逻辑回归方程可从线性回归方程获得。获得Logistic回归方程的数学步骤如下:
上面的方程式是Logistic回归的最终方程式。
根据类别,逻辑回归可以分为三种类型:
要了解Python中Logistic回归的实现,我们将使用以下示例:
示例:提供了一个数据集,其中包含从社交网站获得的各种用户的信息。有一家汽车制造公司最近推出了新的SUV汽车。因此,该公司希望从数据集中检查有多少用户想要购买汽车。
对于这个问题,我们将使用Logistic回归算法构建机器学习模型。数据集如下图所示。在这个问题中,我们将通过使用年龄和薪水(因变量)来预测购买的变量(因变量)。
Logistic回归中的步骤:要使用Python实现Logistic回归,我们将使用与前面的回归主题相同的步骤。步骤如下:
1.数据预处理步骤:在此步骤中,我们将预处理/准备数据,以便我们可以在代码中有效地使用它。它将与我们在“数据预处理”主题中所做的相同。下面给出了此代码:
#Data Pre-procesing Step
# importing libraries
import numpy as nm
import matplotlib.pyplot as mtp
import pandas as pd
#importing datasets
data_set= pd.read_csv('user_data.csv')
通过执行以上代码行,我们将获得数据集作为输出。考虑给定的图像:
现在,我们将从给定的数据集中提取因变量和自变量。下面是它的代码:
#Extracting Independent and dependent Variable
x= data_set.iloc[:, [2,3]].values
y= data_set.iloc[:, 4].values
在上面的代码中,我们对x取[2,3],因为我们的自变量是年龄和薪水,它们在索引2、3处。对于y变量,我们取4是因为我们的因变量在索引4处。输出将是:
现在,我们将数据集分为训练集和测试集。下面是它的代码:
# Splitting the dataset into training and test set.
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test= train_test_split(x, y, test_size= 0.25, random_state=0)
输出如下:
对于测试集:
对于训练集:
在逻辑回归中,我们将进行特征缩放,因为我们想要准确的预测结果。在这里,我们将仅缩放自变量,因为因变量只有0和1的值。下面是它的代码:
#feature Scaling
from sklearn.preprocessing import StandardScaler
st_x= StandardScaler()
x_train= st_x.fit_transform(x_train)
x_test= st_x.transform(x_test)
缩放后的输出如下:
2.使逻辑回归适合训练集:
我们已经准备好了数据集,现在我们将使用训练集来训练数据集。为了提供训练或使模型适合训练集,我们将导入sklearn库的LogisticRegression类。
导入类后,我们将创建一个分类器对象,并使用它来使模型适合逻辑回归。下面是它的代码:
#Fitting Logistic Regression to the training set
from sklearn.linear_model import LogisticRegression
classifier= LogisticRegression(random_state=0)
classifier.fit(x_train, y_train)
输出:通过执行以上代码,我们将获得以下输出:
出[5]:
LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,
intercept_scaling=1, l1_ratio=None, max_iter=100,
multi_class='warn', n_jobs=None, penalty='l2',
random_state=0, solver='warn', tol=0.0001, verbose=0,
warm_start=False)
因此,我们的模型非常适合训练集。
3.预测测试结果
我们的模型在训练集上训练有素,因此我们现在将使用测试集数据来预测结果。下面是它的代码:
#Predicting the test set result
y_pred= classifier.predict(x_test)
在上面的代码中,我们创建了y_pred向量来预测测试集结果。
输出:通过执行上述代码,将在变量资源管理器选项下创建一个新的向量(y_pred)。可以看作是:
上面的输出图像显示了想要购买或不购买汽车的相应预测用户。
4.测试结果的准确性
现在,我们将在此处创建混淆矩阵以检查分类的准确性。要创建它,我们需要导入sklearn库的confusion_matrix 函数 。导入函数,我们将使用新变量cm调用它。该函数有两个参数,主要是y_true(实际值)和y_pred(分类器返回的目标值)。下面是它的代码:
#Creating the Confusion matrix
from sklearn.metrics import confusion_matrix
cm= confusion_matrix()
输出:
通过执行以上代码,将创建一个新的混淆矩阵。考虑下图:
我们可以通过解释混淆矩阵来找到预测结果的准确性。通过以上输出,我们可以解释为65 + 24 = 89(正确的输出)和8 + 3 = 11(错误的输出)。
5.可视化训练集结果
最后,我们将可视化训练集结果。为了可视化结果,我们将使用matplotlib库的ListedColormap类。下面是它的代码:
#Visualizing the training set result
from matplotlib.colors import ListedColormap
x_set, y_set = x_train, y_train
x1, x2 = nm.meshgrid(nm.arange(start = x_set[:, 0].min() - 1, stop = x_set[:, 0].max() + 1, step =0.01),
nm.arange(start = x_set[:, 1].min() - 1, stop = x_set[:, 1].max() + 1, step = 0.01))
mtp.contourf(x1, x2, classifier.predict(nm.array([x1.ravel(), x2.ravel()]).T).reshape(x1.shape),
alpha = 0.75, cmap = ListedColormap(('purple','green' )))
mtp.xlim(x1.min(), x1.max())
mtp.ylim(x2.min(), x2.max())
for i, j in enumerate(nm.unique(y_set)):
mtp.scatter(x_set[y_set == j, 0], x_set[y_set == j, 1],
c = ListedColormap(('purple', 'green'))(i), label = j)
mtp.title('Logistic Regression (Training set)')
mtp.xlabel('Age')
mtp.ylabel('Estimated Salary')
mtp.legend()
mtp.show()
在上面的代码中,我们导入了Matplotlib库的ListedColormap类,以创建用于可视化结果的颜色图。我们创建了两个新变量x_set和y_set来替换x_train和y_train。之后,我们使用nm.meshgrid命令创建一个矩形网格,其范围为-1(最小)到1(最大)。我们拍摄的像素点的分辨率为0.01。
为了创建填充轮廓,我们使用了mtp.contourf命令,它将创建提供颜色(紫色和绿色)的区域。在此函数,我们传递了classifier.predict来显示分类器预测的预测数据点。
输出:通过执行以上代码,我们将获得以下输出:
该图可以在以下几点进行说明:
分类器的目标:
我们已经成功地可视化了Logistic回归的训练集结果,并且我们的分类目标是对购买SUV汽车和未购买汽车的用户进行划分。因此,从输出图中,我们可以清楚地看到带有观察点的两个区域(紫色和绿色)。紫色区域适用于未购买汽车的用户,绿色区域适用于那些购买汽车的用户。
线性分类器:
从图中可以看出,分类器本质上是直线或线性,因为我们已将线性模型用于Logistic回归。在其他主题中,我们将学习非线性分类器。
可视化测试集结果:
我们使用训练数据集对模型进行了很好的训练。现在,我们将可视化结果以用于新观察(测试集)。测试集的代码将与上面相同,除了这里我们将使用x_test和y_test代替x_train和y_train。下面是它的代码:
#Visulaizing the test set result
from matplotlib.colors import ListedColormap
x_set, y_set = x_test, y_test
x1, x2 = nm.meshgrid(nm.arange(start = x_set[:, 0].min() - 1, stop = x_set[:, 0].max() + 1, step =0.01),
nm.arange(start = x_set[:, 1].min() - 1, stop = x_set[:, 1].max() + 1, step = 0.01))
mtp.contourf(x1, x2, classifier.predict(nm.array([x1.ravel(), x2.ravel()]).T).reshape(x1.shape),
alpha = 0.75, cmap = ListedColormap(('purple','green' )))
mtp.xlim(x1.min(), x1.max())
mtp.ylim(x2.min(), x2.max())
for i, j in enumerate(nm.unique(y_set)):
mtp.scatter(x_set[y_set == j, 0], x_set[y_set == j, 1],
c = ListedColormap(('purple', 'green'))(i), label = j)
mtp.title('Logistic Regression (Test set)')
mtp.xlabel('Age')
mtp.ylabel('Estimated Salary')
mtp.legend()
mtp.show()
输出:
上图显示了测试设置结果。可以看到,该图分为两个区域(紫色和绿色)。绿色观测值位于绿色区域,而紫色观测值位于紫色区域。因此,可以说这是一个很好的预测和模型。一些绿色和紫色数据点位于不同的区域,可以忽略不计,因为我们已经使用混淆矩阵(11错误输出)计算了此误差。
因此,我们的模型非常好,可以为该分类问题做出新的预测。