实例:【基于逻辑回归的鸢尾花二分类和三分类问题】


一、问题描述及数据集获取

本实例分别以逻辑回归和支持向量机两种算法实现对Iris数据集的分类。
Iris数据集是常用的分类实验数据集,由Fisher于1936年收集整理。Iris数据集也称鸢尾花数据集,是一个用于多重变量分析的数据集。数据集包含150个样本,分为3类,分别是山鸢尾(Iris Setosa)、变色鸢尾(Iris Versicolor)和维吉尼亚鸢尾(Iris Virginica),每类50个样本,每个样本数据包含4个属性特征,分别是花尊长度、花尊宽度、花瓣长度和花瓣宽度。可通过鸢尾花的4个属性特征预测鸢尾花属于三个种类中的哪一类。
该数据集包含了5个属性,其概况如表2-1所示。

表2-1 鸾尾花数据集概况
特征1特征2特征3特征4标签
物理含义花萼长度花萼宽度花瓣长度花瓣宽度鸾尾花种类
英文释义Sepal LengthSepal WidthPetal LengthPetal Widthclsss
数据形式floatfloatfloatfloatint
单位cmcmcmcm

部分鸾尾花样本如表2-2所示。

表2-2 部分鸾尾花样本
花萼长度花萼宽度花瓣长度花瓣宽度属种(鸾尾花种类)
5.13.51.40.2setosa
4.93.01.40.2setosa
4.73.21.30.2setosa
4.63.11.50.2setosa

本实例中的Iris 数据集取自scikit-leam包,使用load_iris 方法即可加载Iris数据集,使用train test_split方法可以很方便地将原始数据集划分为两部分,分别用于模型训练和模型测试。默认情况下,train_test_split方法会将25%的数据划分到测试集,75%的数据划分到训练集,random_state 保证了随机采样的可重复性(只要random_state值固定,每次划分得到的训练集和测试集就保持一致)。

二、逻辑回归

1.概述

逻辑回归(Logistic regression,简称LR)虽然其中带有"回归"两个字,但逻辑回归其实是一个分类模型,并且广泛应用于各个领域之中。虽然现在深度学习相对于这些传统方法更为火热,但实则这些传统方法由于其独特的优势依然广泛应用于各个领域中。

而对于逻辑回归而且,最为突出的两点就是其模型简单和模型的可解释性强。

逻辑回归模型的优劣势:

  • 优点:实现简单,易于理解和实现;计算代价不高,速度很快,存储资源低;
  • 缺点:容易欠拟合,分类精度可能不高

逻辑回归 原理简介:

Logistic回归虽然名字里带“回归”,但是它实际上是一种分类方法,主要用于两分类问题(即输出只有两种,分别代表两个类别),所以利用了Logistic函数(或称为Sigmoid函数),函数形式为:
log ⁡ i ( z ) = 1 1 + e − z \log i(z) = \frac{1}{{1 + {e^{ - z}}}} logi(z)=1+ez1

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

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('x')
plt.ylabel('y')
plt.grid()
plt.show()

在这里插入图片描述

通过上图我们可以发现 Logistic 函数是单调递增函数,并且在z=0的时候取值为0.5,并且 l o g i ( ) logi() logi()函数的取值范围为(0,1)

而回归的基本方程为 z = w 0 + Σ i N w i x i z = {w_0} + \Sigma _i^N{w_i}{x_i} z=w0+ΣiNwixi.

将回归方程写入其中为:
p = p ( y = 1 ∣ x , θ ) = 1 1 + e − ( w 0 + Σ i N w i x i ) p = p(y = 1|x,\theta ) = \frac{1}{{1 + {e^{ - ({w_0} + \Sigma _i^N{w_i}{x_i})}}}} p=p(y=1∣x,θ)=1+e(w0+ΣiNwixi)1

所以, p ( y = 1 ∣ x , θ ) = h θ ( x , θ ) , p ( y = 0 ∣ x , θ ) = 1 − h θ ( x , θ ) p(y = 1|x,\theta ) = {h_\theta }(x,\theta ),p(y = 0|x,\theta ) = 1 - {h_\theta }(x,\theta ) p(y=1∣x,θ)=hθ(x,θ),p(y=0∣x,θ)=1hθ(x,θ)

逻辑回归从其原理上来说,逻辑回归其实是实现了一个决策边界:对于函数 y = 1 1 + e − z y = \frac{1}{{1 + {e^{ - z}}}} y=1+ez1 ,当 z ≥ 0 z\ge0 z0时, y ≥ 0.5 y \ge 0.5 y0.5
,分类为1,当 z < 0 z<0 z<0时, y < 0.5 y < 0.5 y<0.5,分类为0,其对应的y值我们可以视为类别1的概率预测值.

对于模型的训练而言:实质上来说就是利用数据求解出对应的模型的特定的 w。从而得到一个针对于当前数据的特征逻辑回归模型。

而对于多分类而言,将多个二分类的逻辑回归组合,即可实现多分类。

2.应用

逻辑回归模型广泛用于各个领域,包括机器学习,大多数医学领域和社会科学。例如,最初由Boyd 等人开发的创伤和损伤严重度评分(TRISS)被广泛用于预测受伤患者的死亡率,使用逻辑回归 基于观察到的患者特征(年龄,性别,体重指数,各种血液检查的结果等)分析预测发生特定疾病(例如糖尿病,冠心病)的风险。逻辑回归模型也用于预测在给定的过程中,系统或产品的故障的可能性。还用于市场营销应用程序,例如预测客户购买产品或中止订购的倾向等。在经济学中它可以用来预测一个人选择进入劳动力市场的可能性,而商业应用则可以用来预测房主拖欠抵押贷款的可能性。条件随机字段是逻辑回归到顺序数据的扩展,用于自然语言处理。

逻辑回归模型现在同样是很多分类算法的基础组件,比如 分类任务中基于GBDT算法+LR逻辑回归实现的信用卡交易反欺诈,CTR(点击通过率)预估等,其好处在于输出值自然地落在0到1之间,并且有概率意义。模型清晰,有对应的概率学理论基础。它拟合出来的参数就代表了每一个特征(feature)对结果的影响。也是一个理解数据的好工具。但同时由于其本质上是一个线性的分类器,所以不能应对较为复杂的数据情况。很多时候我们也会拿逻辑回归模型去做一些任务尝试的基线(基础水平)。

3. LogisticRegression回归算法

LogisticRegression回归模型在Sklearn.linear_model子类下,调用sklearn逻辑回归算法步骤比较简单,即:

(1) 导入模型。调用逻辑回归LogisticRegression()函数。

(2) fit()训练。调用fit(x,y)的方法来训练模型,其中x为数据的属性,y为所属类型。

(3) predict()预测。利用训练得到的模型对数据集进行预测,返回预测结果。

4. sklearn逻辑回归API

sklearn.linear_model.LogisticRegression(penalty='l2', dual=False, tol=0.0001, C=1.0, fit_intercept=True, 
											intercept_scaling=1, class_weight=None, random_state=None, 
											solver='lbfgs', max_iter=100, multi_class='auto', verbose=0, 
											warm_start=False, n_jobs=None, l1_ratio=None)

参数:

  • penalty:惩罚项,str类型,可选参数为l1和l2,默认为l2。用于指定惩罚项中使用的规范。newton-cg、sag和lbfgs求解算法只支持L2规范。
  • dual:对偶或原始方法,bool类型,默认为False。对偶方法只用在求解线性多核(liblinear)的L2惩罚项上。当样本数量>样本特征的时候,dual通常设置为False。
  • tol:停止求解的标准,float类型,默认为1e-4。就是求解到多少的时候,停止,认为已经求出最优解。
  • c:正则化系数λ的倒数,float类型,默认为1.0。必须是正浮点型数。像SVM一样,越小的数值表示越强的正则化。
  • fit_intercept:是否存在截距或偏差,bool类型,默认为True。
  • intercept_scaling:仅在正则化项为”liblinear”,且fit_intercept设置为True时有用。float类型,默认为1。
  • class_weight:用于标示分类模型中各种类型的权重,可以是一个字典或者balanced字符串,默认为不输入,也就是不考虑权重,即为None。
  • random_state:随机数种子,int类型,可选参数,默认为无,仅在正则化优化算法为sag,liblinear时有用。
  • solver:优化算法选择参数,只有五个可选参数,即newton-cg,lbfgs,liblinear,sag,saga。默认为liblinear。solver参数决定了我们对逻辑回归损失函数的优化方法,有四种算法可以选择,分别是:
  • liblinear:使用了开源的liblinear库实现,内部使用了坐标轴下降法来迭代优化损失函数。
  • lbfgs:拟牛顿法的一种,利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数。
  • newton-cg:也是牛顿法家族的一种,利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数。
  • sag:即随机平均梯度下降,是梯度下降法的变种,和普通梯度下降法的区别是每次迭代仅仅用一部分的样本来计算梯度,适合于样本数据多的时候。
  • saga:线性收敛的随机优化算法的的变重。

三、代码实现及分析

1.导入库

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd 
from mpl_toolkits.mplot3d import Axes3D 
from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression 
from sklearn.model_selection import train_test_split 
from sklearn.metrics import mean_squared_error
from sklearn import metrics

2.导入数据集及分析

2.1 鸢尾花数据集

data = load_iris()  # 数据集
iris_target = data.target # 标签
# 将所需的数据以及特征名提取出来转换成DataFrame类型,方便后面处理
iris_df = pd.DataFrame(data=data.data, columns=data.feature_names) 

2.2 查看关键字:

print(data.keys())

在这里插入图片描述

2.3 查看数据集描述:

print(data["DESCR"])

由DESCR可知:
iris数据集共有150个样本,三个种类,每个类有五十个样本

三个种类:class:

  • Iris-Setosa(标签0)
  • Iris-Versicolour(标签1)
  • Iris-Virginica(标签2)

每个样本特征向量为4个:
Attribute Information:

  • sepal length in cm(花萼长度)
  • sepal width in cm(花萼宽度)
  • petal length in cm(花瓣长度)
  • petal width in cm(花瓣宽度)

统计特征:
在这里插入图片描述
其中,Class Correlation为类别相关性

2.4 查看各类信息

print(data.feature_names)
print(data.target_names)
print(data.target)
print(iris_df.head())
print(iris_df.tail())
print(iris_df.info())
print(iris_df.describe())

将原iris_df复制出来,防止变动,并将数据标签添加到iris_all中

iris_all = iris_df.copy() 
iris_all['target'] = iris_target

2.5 特征与标签组合的散点可视化

2.5.1 sns.pairplot展现变量两两之间的关系

sns.pairplot(data=iris_all,hue='target', palette="coolwarm")
plt.show()

在这里插入图片描述
2.5.2 2D散点图

plt.plot(iris_all[iris_all["target"]==0]["petal length (cm)"],iris_all[iris_all["target"]==0]["petal width (cm)"],"rs",label="Setosa")
plt.plot(iris_all[iris_all["target"]==1]["petal length (cm)"],iris_all[iris_all["target"]==1]["petal width (cm)"],"bx",label="Versicolour")
plt.plot(iris_all[iris_all["target"]==2]["petal length (cm)"],iris_all[iris_all["target"]==2]["petal width (cm)"],"go",label="Virginica")
plt.xlabel("petal length (cm)")
plt.ylabel("petal width (cm)")
plt.legend()
plt.rcParams["font.sans-serif"]="simHei"
plt.show()

在这里插入图片描述
2.5.3 3D散点图

#绘制三维散点图
fig = plt.figure(figsize=(20,15))
ax =fig.add_subplot(121,projection='3d')
ax.scatter(iris_all[iris_all["target"]==0]["sepal length (cm)"], iris_all[iris_all["target"]==0]["petal length (cm)"], iris_all[iris_all["target"]==0]["petal width (cm)"])
ax.scatter(iris_all[iris_all["target"]==1]["sepal length (cm)"], iris_all[iris_all["target"]==1]["petal length (cm)"], iris_all[iris_all["target"]==1]["petal width (cm)"])
ax.scatter(iris_all[iris_all["target"]==2]["sepal length (cm)"], iris_all[iris_all["target"]==2]["petal length (cm)"], iris_all[iris_all["target"]==2]["petal width (cm)"])
ax.set_xlabel('sepal length (cm)')
ax.set_ylabel('petal length (cm)')
ax.set_zlabel('petal width (cm)')
plt.show()

在这里插入图片描述

3. 逻辑回归模型

3.1 创建训练集和测试集

iris_df_part = iris_df.iloc[:100]
iris_target_part = iris_target[:100]

x_train, x_test, y_train, y_test = train_test_split(iris_df_part, iris_target_part, test_size = 0.2, random_state =180)

X_train,X_test,Y_train,Y_test=train_test_split(iris_df,iris_target,test_size=0.2,random_state=180)

3.2 二分类实现

# 训练逻辑回归二分类模型
def basic2_logosticregression(x_train, x_test, y_train, y_test):
    model=LogisticRegression(random_state=0, solver='lbfgs') 

    model.fit(x_train,y_train)
    y_train_pre=model.predict(x_train)
    y_test_pre=model.predict(x_test)
    
    ## 利用 predict_proba 函数预测其概率
    train_predict_proba = model.predict_proba(x_train)
    test_predict_proba = model.predict_proba(x_test)
    print('测试预测每一类的概率:\n',test_predict_proba)
    
    MSE_train=mean_squared_error(y_train,y_train_pre)
    MSE_test=mean_squared_error(y_test,y_test_pre)
    
    confusion_matrix_result = metrics.confusion_matrix(y_test_pre,y_test)
    print('混淆矩阵结果:\n',confusion_matrix_result)
    plt.figure(figsize=(8, 6))
    sns.heatmap(confusion_matrix_result, annot=True, cmap='Blues')
    plt.xlabel('预测的标签')
    plt.ylabel('实际的标签')
    
    print("权重w:"+ str(model.coef_))
    print("截距w0:"+ str(model.intercept_))
    print("训练集均方误差:"+str(MSE_train))
    print("测试集均方误差:"+str(MSE_test))
    print("score_train: "+str(model.score(x_train,y_train)))
    print("score_test: "+str(model.score(x_test,y_test)))

调用:

basic2_logosticregression(x_train, x_test, y_train, y_test)

在这里插入图片描述
在这里插入图片描述

3.3 三分类实现

# 训练逻辑回归三分类模型
def basic3_logosticregression(X_train,X_test,Y_train,Y_test):
    model=LogisticRegression(random_state=0, solver='lbfgs')
    model.fit(X_train,Y_train)
    Y_train_pre=model.predict(X_train)
    print(Y_train_pre)
    Y_test_pre=model.predict(X_test)
    
    train_predict_proba = model.predict_proba(X_train)
    test_predict_proba = model.predict_proba(X_test)
    print('测试预测每一类的概率:\n',test_predict_proba)

    confusion_matrix_result = metrics.confusion_matrix(Y_test_pre,Y_test)
    print('混淆矩阵结果:\n',confusion_matrix_result)
    # 利用热力图对于结果进行可视化
    plt.figure(figsize=(8, 6))
    sns.heatmap(confusion_matrix_result, annot=True, cmap='Blues')
    plt.xlabel('预测的标签')
    plt.ylabel('实际的标签')
    
    MSE_train=mean_squared_error(Y_train,Y_train_pre)
    MSE_test=mean_squared_error(Y_test,Y_test_pre)
    print("权重:"+ str(model.coef_))
    print("截距:"+ str(model.intercept_))
    print("训练集均方误差:"+str(MSE_train))
    print("测试集均方误差:"+str(MSE_test))
    print("score_train: "+str(model.score(X_train, Y_train)))
    print("score_test: "+str(model.score(X_test,Y_test)))

调用:

basic3_logosticregression(X_train,X_test,Y_train,Y_test)

在这里插入图片描述
在这里插入图片描述

四、小结

通过上述测试结果,在逻辑回归中,我们可以发现,其在三分类的结果的预测准确度上有所下降,其在测试集上的准确度为: 96.67% ,这是由于类别标签1和2两个类别的特征,我们从可视化的时候也可以发现,其特征的边界具有一定的模糊性(边界类别混杂,没有明显区分边界),所有在这两类的预测上出现了一定的错误。

  • 15
    点赞
  • 91
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

有品位的小丑

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

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

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

打赏作者

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

抵扣说明:

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

余额充值