逻辑回归是机器学习中经常使用的一种方法,属于有监督机器学习。逻辑回归虽然名字有“回归”二字,但其实属于一种分类方法,本文介绍如何使用逻辑回归进行分类。首先介绍一下逻辑回归的基本原理。图1.逻辑函数图逻辑回归之所以被称为“逻辑”,是因为它使用了Logistic函数(也称为Sigmoid函数)。既然逻辑回归是一种分类方法,那么这里就用最简单的二分类来解释一下。二分类的输出标记为y=0或1,线性回归生成的预测值z=ω^Tx+b,我们令t=z,将z的表达式带入式(1)得到对式(2)进行变换,得到式(3)。y就是我们需要的正例,1-y就是负例,两者的比值可以称为概率,所以式(3)可以称为“对数概率”。接下来我们需要使用最大似然估计方法求解ω和b。我们将y作为后验概率估计p(y=1|x),则可以得到图3中的公式(4)和(5)。接下来让β=(ω;b)和x=(x;1),可得式(6),由式(6)可得图4中的(7)、(8)、(9),(9)为目标函数,求解可得最优参数目标函数。这些推导比较复杂,笔者这里只列出主要部分。有兴趣的可以自行查阅相关资料。图2.Logistic回归推导公式(1)-(3)图3.Logistic回归推导公式(4)-(6)图4.Logistic回归推导公式(7)-(9)了解逻辑回归基本原理后,我们再用一个例子来介绍一下逻辑回归的用法。我们在本文中使用的逻辑回归模型来自scikit-learn,使用的数据集也来自scikit-learn。代码如下。importmatplotlib.pyplotaspltfromsklearn.metricsimportclassification_reportfromsklearn.datasetsimportmake_classificationfromsklearn.linear_modelimportLogisticRegressionfromsklearn.model_selectionimporttrain_test_splitX,y=make_classification(n_samples=100,n_features=2,n_informative=2,n_redundant=0,n_clusters_per_class=1,class_sep=2.0,random_state=15)fig,ax=plt.子图(figsize=(8,6))plt.scatter(X[:,0],X[:,1],marker='o',c=y)plt.xlabel('Feature1')plt.ylabel('Feature2')plt.show()图5.本例中使用的数据点的结果如图5所示,这个数据集是我们使用make_classification方法生成的,一共100个点,一共两个特征(维度),所有数据分为两类。从图中可以看出,紫色的点归为一类,黄色的点归为另一类。然后将数据集划分为训练集和测试集。代码如下。X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.30,random_state=30)这里,我们设置测试集中的数据个数为30,随机状态为30。这个个数可以设置在将要。接下来,我们使用逻辑回归进行训练和预测,并使用classification_report方法输出结果。model=LogisticRegression()#生成模型model.fit(X_train,y_train)#输入训练数据y_predict=model.predict(X_test)#输出预测数据print(classification_report(y_test,y_predict))#生成预测结果报告预测结果如图在图6中。从图6中我们可以看到模型的准确率为0.97,因为我们一共有30个测试数据,所以这意味着我们只有一个错误的预测点,说明分类效果模型还是很不错的。图6.模型结果报告那么为了让大家对模型的分类效果有更进一步的了解,笔者在这里进一步研究一下,我们来看一下逻辑回归模型的分类边界,也就是模型从哪里开始分吧,代码如下。step=0.01#等效步长,点越小越密x_min=X[:,0].min()-1#设置网格的边界x_max=X[:,0].max()+1y_min=X[:,1].min()-1y_max=X[:,1].max()+1x_mesh,y_mesh=np.meshgrid(np.arange(x_min,x_max,step),np.arange(y_min,y_max,step))data_mesh=np.stack([x_mesh.ravel(),y_mesh.ravel()],axis=-1)#转换mesh为2列数据Z=model.predict(data_mesh)Z=z.reshape(x_mesh.shape)fig,ax=plt.subplots(figsize=(8,6))plt.pcolormesh(x_mesh,y_mesh,Z,cmap=plt.cm.cool)#绘制网格plt的颜色。scatter(X[:,0],X[:,1],c=y,cmap=plt.cm.ocean)plt.show()这里的代码有点复杂,请解释。我们的设计思路是这样的,因为这次使用的逻辑回归模型是二元分类模型,即把结果分为两类,那么我们在模型中用颜色标记每一类的面积,这样有两种颜色。落入每个区域的点都属于这个区域,也就是这个类。x_mesh,y_mesh=np.meshgrid(np.arange(x_min,x_max,step),np.arange(y_min,y_max,step))这行代码是获取整个区域的点(即求和两个类的面积),这个面积比我们使用的数据集的范围要大,x_min,x_max,y_min,y_max是整个区域的边界。data_mesh=np.stack([x_mesh.ravel(),y_mesh.ravel()],axis=-1)这行代码是将上面整个区域的点转换成2列数据??用于后面的预测,Z=model.predict(data_mesh)是区域内每个点的预测值。然后我们使用plt.pcolormesh和plt.scatter分别绘制区域的颜色和数据点的颜色,我们可以清楚的看到这些点在哪个区域。结果如图7所示。图7.不同颜色用于表示不同的划分区域。从结果可以看出,有一个绿色的点落在了错误的区域,说明这个点的预测是错误的,这和我们之前的classification_report得到的结果是一致的。逻辑回归在机器学习中应用广泛,效果较好,但也存在一些缺点,如无法解决非线性问题、对多重共线性数据敏感、难以处理数据不平衡等。原理比作者介绍的复杂多了。想深入了解的读者可以自行查找相关资料进行学习。作者简介:Mort,数据分析爱好者,擅长数据可视化,比较关注机器学习领域,希望与业内朋友一起学习交流。
