基于逻辑回归的分类预测

  • 什么是逻辑回归
  • 逻辑回归能干什么
  • 简易代码实现
  • 其他方法
  • 逻辑回归原理
  • 推荐


什么是逻辑回归

logistic回归是一种广义线性回归(generalized linear model),因此与多重线性回归分析有很多相同之处。它们的模型形式基本上相同,都具有 w‘x+b,其中w和b是待求参数,其区别在于他们的因变量不同,多重线性回归直接将w‘x+b作为因变量,即y =w‘x+b,而logistic回归则通过函数L将w‘x+b对应一个隐状态p,p =L(w‘x+b),然后根据p 与1-p的大小决定因变量的值。如果L是logistic函数,就是logistic回归,如果L是多项式函数就是多项式回归。

logistic回归的因变量可以是二分类的,也可以是多分类的,但是二分类的更为常用,也更加容易解释,多类可以使用softmax方法进行处理。实际中最为常用的就是二分类的logistic回归。
Logistic回归模型的适用条件:
1 因变量为二分类的分类变量或某事件的发生率,并且是数值型变量。但是需要注意,重复计数现象指标不适用于Logistic回归。
2 残差和因变量都要服从二项分布。二项分布对应的是分类变量,所以不是正态分布,进而不是用最小二乘法,而是最大似然法来解决方程估计和检验问题。
3 自变量和Logistic概率是线性关系
4 各观测对象间相互独立。
(以上复制于百度百科,在我的印象当中逻辑回归其实是一个相对简单但是又不那么简单的算法)
一下为自己的见解:
逻辑回归可以是解决多分类,也可以是解决二分类问题。当然也不仅仅是解决二维的问题。逻辑回归就是在输入一定样本后,通过调参画出一条线将养分区分成若干类。在这个过程中没有办法认为那一系列参数是最佳的,如何辨别那就只有通过测试集了,当然了测试集与训练集的选定对于结果影响也是十分大的。在这个基础上我们有可以扩展那就是在二维是一条直线,在三维不就是一个面了吗?这算不算逻辑回归呢?若在二维中最后的域并不是规则的或者说不是两块等等。这算不算逻辑回归?当然是逻辑回归。

二元Logistic回归结果 二元logistic回归wald_拟合


二元Logistic回归结果 二元logistic回归wald_拟合_02


(原谅我盗图 取自该篇)

逻辑回归能干什么

逻辑回归能干什么?这个问题或许在看完上述之后已经有了了解但是请注意!
Logistic回归模型的适用条件:
1 因变量为二分类的分类变量或某事件的发生率,并且是数值型变量。但是需要注意,重复计数现象指标不适用于Logistic回归。
2 残差和因变量都要服从二项分布。二项分布对应的是分类变量,所以不是正态分布,进而不是用最小二乘法,而是最大似然法来解决方程估计和检验问题。
3 自变量和Logistic概率是线性关系
4 各观测对象间相互独立。

简易代码实现

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import  LinearRegression
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split

X,y = make_regression(n_samples=100,n_features=2,n_informative=2,random_state=38)
X_train,X_test,y_train,y_test = train_test_split(X,y,random_state=8)
lr = LinearRegression().fit(X_train,y_train)

print('lr.coef_:{}'.format(lr.coef_[:]))
print('lr.intercept_:{}'.format(lr.intercept_))

# X,y = make_regression(n_samples=50,n_features=1,n_informative=1,noise=50,random_state=1)
#
# reg = LinearRegression()
# reg.fit(X,y)
# z = np.linspace(-3,3,200).reshape(-1,1)
# plt.scatter(X,y,c='b',s=60)
# plt.plot(z,reg.predict(z),c='k')


# X = [[1],[4],[3]]
# y = [3,5,3]
# lr = LinearRegression().fit(X,y)#线性模型拟合这两个点
# z = np.linspace(0,5,20)#画出两个点以及函数
# plt.scatter(X,y,s=80)
# plt.plot(z,lr.predict(z.reshape(-1,1)),c='k')
# plt.title('Straight Line')
# plt.show()
#print('y = {:,.3f}'.format(lr.coef_[0]),'x','+{:,.3f}'.format(lr.intercept_))
#拟合数据时,求线性方程的系数
# print('直线的系数为:{:,.2f}'.format(reg.coef_[1]))
# print('直线的截距是:{:,.2f}'.format(reg.intercept_))
print('训练集得分:{:,.2f}'.format(lr.score(X_test,y_test)))

二元Logistic回归结果 二元logistic回归wald_数据_03


二元Logistic回归结果 二元logistic回归wald_二元Logistic回归结果_04

通过运行上面的代码可以发现,训练集和测试集的得分均为1.00,当然这说明了模型的高度拟合,但是这也是因为没有在我们的数据中加入影响因素noise导致的,在实际的数据集中会有各种因素的影响,

那就加入noise再进行测试吧。

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import  LinearRegression
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split
from sklearn.datasets import  load_diabetes
X,y = load_diabetes().data,load_diabetes().target
X_train,X_test,y_train,y_test = train_test_split(X,y,random_state=8)
lr = LinearRegression().fit(X_train,y_train)
print('训练集得分:{:,.2f}'.format(lr.score(X_train,y_train)))
print('测试集得分:{:,.2f}'.format(lr.score(X_test,y_test)))

在对上述代码进行运行后,可以发现训练集和测试集间的得分间存在一定的差异,这是因为模型过拟合导致的。在实际应用的过程中会采用伊西俄方法来避免过拟合。
存在三种情况:(1)欠拟合,(2)拟合(也是我们所追求的)(3)过拟合(这种情况比欠拟合更加麻烦)
以上就是一个建议的线性模型实现。

其他方法

Part2 基于鸢尾花(iris)数据集的逻辑回归分类实践

Step1:库函数导入
Step2:数据读取/载入
Step3:数据信息简单查看
Step4:可视化描述
Step5:利用 逻辑回归模型 在二分类上 进行训练和预测
Step6:利用 逻辑回归模型 在三分类(多分类)上 进行训练和预测

函数库导入

##  基础函数库
import numpy as np 
import pandas as pd

## 绘图函数库
import matplotlib.pyplot as plt
import seaborn as sns

数据库读取

##我们利用sklearn中自带的iris数据作为数据载入,并利用Pandas转化为DataFrame格式
from sklearn.datasets import load_iris
data = load_iris() #得到数据特征
iris_target = data.target #得到数据对应的标签
iris_features = pd.DataFrame(data=data.data, columns=data.feature_names) #利用Pandas转化为DataFrame格式

数据信息简单查看

##利用.info()查看数据的整体信息
iris_features.info()

##<class'pandas.core.frame.DataFrame'>
##RangeIndex:150entries,0to149
##Datacolumns(total4columns):
###ColumnNon-NullCountDtype
##----------------------------
##0sepallength(cm)150non-nullfloat64
##1sepalwidth(cm)150non-nullfloat64
##2petallength(cm)150non-nullfloat64
##3petalwidth(cm)150non-nullfloat64
##dtypes:float64(4)
##memoryusage:4.8KB

##进行简单的数据查看,我们可以利用.head()头部.tail()尾部
iris_features.head()

可视化描述

## 合并标签和特征信息
iris_all = iris_features.copy() ##进行浅拷贝,防止对于原始数据的修改
iris_all['target'] = iris_target
## 特征与标签组合的散点可视化
sns.pairplot(data=iris_all,diag_kind='hist', hue= 'target')
plt.show()

二元Logistic回归结果 二元logistic回归wald_拟合_05

# 选取其前三个特征绘制三维散点图
from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure(figsize=(10,8))
ax = fig.add_subplot(111, projection='3d')

iris_all_class0 = iris_all[iris_all['target']==0].values
iris_all_class1 = iris_all[iris_all['target']==1].values
iris_all_class2 = iris_all[iris_all['target']==2].values
# 'setosa'(0), 'versicolor'(1), 'virginica'(2)
ax.scatter(iris_all_class0[:,0], iris_all_class0[:,1], iris_all_class0[:,2],label='setosa')
ax.scatter(iris_all_class1[:,0], iris_all_class1[:,1], iris_all_class1[:,2],label='versicolor')
ax.scatter(iris_all_class2[:,0], iris_all_class2[:,1], iris_all_class2[:,2],label='virginica')
plt.legend()

plt.show()

逻辑回归原理

当z≥0 时,y≥0.5,分类为1,当 z<0时,y<0.5,分类为0,其对应的y值我们可以视为类别1的概率预测值。Logistic回归虽然名字里带“回归”,但是它实际上是一种分类方法,主要用于两分类问题(即输出只有两种,分别代表两个类别),所以利用了Logistic函数(或称为Sigmoid函数),函数形式为:

二元Logistic回归结果 二元logistic回归wald_拟合_06


对应的函数图像可以表示如下:

import numpy as np
import matplotlib.pyplot as plt
x = np.arange(-5,5,0.01)
y = 1/(1+np.exp(-x))

plt.plot(x,y)
plt.xlabel('z')
plt.ylabel('y')
plt.grid()
plt.show()

二元Logistic回归结果 二元logistic回归wald_二分类_07

通过上图我们可以发现 Logistic 函数是单调递增函数,并且在z=0而回归的基本方程,将回归方程写入其中为:

二元Logistic回归结果 二元logistic回归wald_数据_08

逻辑回归从其原理上来说,逻辑回归其实是实现了一个决策边界:对于函数,当z≥0 时,y≥0.5,分类为1,当 z<0时,y<0.5,分类为0,其对应的y值我们可以视为类别1的概率预测值。
对于模型的训练而言:实质上来说就是利用数据求解出对应的模型的特定的ω。从而得到一个针对于当前数据的特征逻辑回归模型。
而对于多分类而言,将多个二分类的逻辑回归组合,即可实现多分类。