机器学习多元Logistic回归算法——原理+python详细代码解析(sklearn)

多元 Logistic 回归算法是一种用于处理多分类问题的统计方法。当因变量有多个类别时,比如三个及以上的不同取值,就需要使用多元 Logistic 回归算法。与二元 Logistic 回归类似,它也是建立因变量的发生概率与自变量之间的关系,但这里的因变量有多个类别。我们讲解多元Logistic回归算法的基本原理,并结合具体实例讲解该算法在Python中的实现与应用。

完整代码

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import confusion_matrix
from sklearn.metrics import classification_report
from sklearn.metrics import cohen_kappa_score

# 6.2.2 数据读取及观察
data = pd.read_csv(r'G:\多元Logistic回归算法\数据6.1.csv')#自己的绝对路径
data.info()
len(data.columns)
data.columns
data.shape
data.dtypes
data.isnull().values.any()
data.isnull().sum()
data.head()
data.V1.value_counts()

# 6.3 描述性分析及图形绘制
# 6.3.1 描述性分析
pd.set_option('display.max_rows', None)
pd.set_option('display.max_columns', None)
data.describe()

# 6.3.2 绘制条形图
sns.countplot(x=data['V1'])
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.title("收入档次条线图")
plt.show()

# 6.3.3 绘制箱线图
sns.boxplot(x='V1', y='V2', data=data, hue='V1', legend=False)
plt.show()
sns.boxplot(x='V1', y='V3', data=data, hue='V1', legend=False)
plt.show()
sns.boxplot(x='V1', y='V4', data=data, hue='V1', legend=False)
plt.show()


# 6.4 数据处理
# 6.4.1 区分分类特征和连续特征并进行处理
def data_encoding(data):
    data = data[["V1", 'V2', "V3", "V4"]]
    Discretefeature = []
    Continuousfeature = ['V2', "V3", "V4"]
    df = pd.get_dummies(data, columns=Discretefeature)
    df[Continuousfeature] = (df[Continuousfeature] - df[Continuousfeature].mean()) / (df[Continuousfeature].std())
    df["V1"] = data[["V1"]]
    return df

data = data_encoding(data)

# 6.4.2 将样本示例全集分割为训练样本和测试样本
X = data.drop(['V1'], axis=1)
y = data['V1']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, stratify=y, random_state=123)

# 6.5 建立多元Logistic回归算法模型
# 6.5.1 模型估计
model = LogisticRegression(solver='newton-cg', C=1e10, max_iter=1)
model.fit(X_train, y_train)

model.n_iter_
model.intercept_
model.coef_

# 6.5.2 模型性能分析
model.score(X_test, y_test)
prob = model.predict_proba(X_test)
prob[:5]

np.set_printoptions(suppress=True)
prob = model.predict_proba(X_test)
prob[:5]

pred = model.predict(X_test)
pred[:5]

table = confusion_matrix(y_test, pred)

sns.heatmap(table, cmap='Reds', annot=True)
plt.tight_layout()

print(classification_report(y_test, pred))

cohen_kappa_score(y_test, pred)

一、多元Logistic回归算法的基本原理

多元Logistic回归算法本质上是二元Logistic回归算法的拓展,用于响应变量取多个单值时的情形,如偏好选择、考核等级等。多元Logistic回归分析的基本原理同样是考虑响应变量(0,1)发生的概率,用发生概率除以没有发生概率再取对数。回归自变量系数也是模型中每个自变量概率比的概念,回归系数的估计同样采用迭代最大似然法。多元Logistic回归算法的公式为:

其中,p为事件发生的概率,为模型的截距项,为自变量系数,X=为自变量,为误差项。

实际应用中的考虑因素

  1. 变量选择:在多元 Logistic 回归中,变量的选择同样重要。过多的无关变量可能会导致过拟合,而太少的变量可能会使模型的解释能力不足。可以使用逐步回归、Lasso 回归等方法进行变量选择。
  2. 模型评估:可以使用准确率、混淆矩阵、ROC 曲线等方法评估模型的性能。对于多分类问题,还可以使用宏平均(macro-average)和微平均(micro-average)等指标来综合评估模型在各个类别上的表现。
  3. 数据预处理:与二元 Logistic 回归类似,需要对数据进行预处理,包括处理缺失值、标准化连续变量、对分类变量进行编码等。

二、具体实例讲解多元Logistic回归算法

我们以“数据6.1”文件中的数据为例进行讲解。数据6.1文件中记录的是某商业银行全体员工的V1(收入档次)​(1为高收入,2为中收入,3为低收入)​、V2(工作年限)​、V3(绩效考核得分)​、V4(违规操作积分)和V5(职称情况)​(1为高级职称,2为中级职称,3为初级职称)等数据,如图所示。

下面以V1(收入档次)为响应变量,以V2(工作年限)​、V3(绩效考核得分)和V4(违规操作积分)为特征变量,构建多元Logistic回归算法模型。

1 导入分析所需要的模块和函数

在进行分析之前,首先导入分析所需要的模块和函数,读取数据集并进行观察。

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import confusion_matrix
from sklearn.metrics import classification_report
from sklearn.metrics import cohen_kappa_score

# 6.2.2 数据读取及观察
data = pd.read_csv(r'G:\多元Logistic回归算法\数据6.1.csv')
data.info()

数据集中共有1034个样本(1034 entries, 0 to 1033)​、5个变量(total 5 columns)​。5个变量分别是V1~V5,均包含1034个非缺失值(1034 non-null)​,其中V1、V2、V5的数据类型为整型(int64)​,V3、V4的数据类型为浮点型(float64)​,数据文件中共有2个浮点型(float64)变量、3个整型(int64)变量,数据内存为40.5KB。

len(data.columns) # 列出数据集中变量的数量。运行结果为5
data.columns     # 列出数据集中的变量,运行结果为:Index(['V1', 'V2', 'V3', 'V4', 'V5'],
dtype='object'),与前面的结果一致
data.shape     # 列出数据集的形状。运行结果为(1034, 5),也就是1034行5列,数据集中共有1034个样
本,5个变量
data.dtypes     # 观察数据集中各个变量的数据类型,与前面的结果一致

2 描述性分析及图形绘制

#1 描述性分析
pd.set_option('display.max_rows', None)
pd.set_option('display.max_columns', None)
data.describe()

变量V1(收入档次)为离散变量,统计指标的意义不大,其他变量为连续变量,具有一定的参考价值,比如变量V3为绩效考核得分,参与分析的样本员工的绩效考核得分平均值为161.608027,最大值为298.500000,最小值为24.600000,标准差为55.616922,25%、50%、75%三个四分位数分别为115.425000、158.550000、206.275000。

#2 绘制条形图
sns.countplot(x=data['V1'])
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.title("收入档次条线图")
plt.show()

#3 绘制箱线图
sns.boxplot(x='V1', y='V2', data=data, hue='V1', legend=False)
plt.show()
sns.boxplot(x='V1', y='V3', data=data, hue='V1', legend=False)
plt.show()
sns.boxplot(x='V1', y='V4', data=data, hue='V1', legend=False)
plt.show()
收入档次-工作年限箱图

绘制箱图,以“V1收入档次”作为x 轴,以“V2工作年限”作为y轴,参数 palette为调色板,palette="Blues"表示使用蓝色系的调色板。设置1为高收入,2为中收入,3为低收入,通过箱图可以非常直观地发现,收入档次与工作年限紧密相关,工作年限越长,收入档次越高。

收入档次-绩效考核箱图

如果从中位数的角度(箱体中间的那条线)来看,绩效考核得分越高,收入档次也越高,但从整个箱体的角度来看,这种关系不如“收入档次-工作年限”箱图展示的那般明显。

收入档次-违规操作积分箱图

同样地从箱图的角度来看,违规操作积分对收入档次的影响关系不够明显。

3 区分分类特征和连续特征并进行处理

首先定义一个函数data_encoding(),该函数的作用是区分分类特征和连续特征,并对分类特征设置虚拟变量,对连续特征进行标准化处理。

#区分分类特征和连续特征并进行处理
def data_encoding(data):
    data = data[["V1", 'V2', "V3", "V4"]]
    Discretefeature = []
    Continuousfeature = ['V2', "V3", "V4"]
    df = pd.get_dummies(data, columns=Discretefeature)
    df[Continuousfeature] = (df[Continuousfeature] - df[Continuousfeature].mean()) / (df[Continuousfeature].std())
    df["V1"] = data[["V1"]]
    return df

data = data_encoding(data)

4 将样本全集分割为训练样本和测试样本

# 将样本示例全集分割为训练样本和测试样本
X = data.drop(['V1'], axis=1)
y = data['V1']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, stratify=y, random_state=123)

5 建立多元Logistic回归算法模型

使用sklearn建立多元Logistic回归算法模型,其中的参数 multi_class='multinomial'表示使用多元Logistic回归算法,solver = 'newton-cg'表示使用Newton-CG算法 (牛顿法家族中的一种,利用损失函数二阶导数矩阵(即海森矩阵)来迭代优化损失函数),C=1e10表示将惩罚力度设为10-10, max_iter=1e3表示将最大迭代次数设置为103(如果不设置,默认为100)

调用fit()方法进行估计

model.n_iter_ # 显示模型的迭代次数

model.intercept_ # 显示模型的截距项

model.coef_ # 显示模型的回归系数


#模型估计
model = LogisticRegression(solver='newton-cg', C=1e10)
model.fit(X_train, y_train)

model.n_iter_
model.intercept_
model.coef_

6 模型性能分析

#模型性能分析
model.score(X_test, y_test)
prob = model.predict_proba(X_test)
prob[:5]

np.set_printoptions(suppress=True)
prob = model.predict_proba(X_test)
prob[:5]

pred = model.predict(X_test)
pred[:5]

table = confusion_matrix(y_test, pred)
table
sns.heatmap(table, cmap='Reds', annot=True)
plt.tight_layout()

print(classification_report(y_test, pred))

cohen_kappa_score(y_test, pred)

以第1个样本为例,其分类为高收入组的概率为0.00304247,分类为中收入组的概率为0.90883504,分类为低收入组的概率为 0.08812249,也就是说有90.88%的概率为中收入组。以此类推,第2~5个样本的最大分组概率分别是中收入组 0.97755211、中收入组0.61702151、低收入组0.99684192、高收入组0.99019283。

三、优缺点

一、优点

  1. 可解释性较好

    • 与一些复杂的机器学习算法相比,多元 Logistic 回归的系数具有一定的可解释性。每个自变量的系数表示在其他变量保持不变的情况下,该变量对因变量取特定类别的对数优势比的影响。这使得人们能够理解各个因素对不同类别结果的影响方向和程度。
    • 例如,如果一个自变量的系数为正,说明该变量的增加会提高因变量取对应类别的概率;反之,系数为负则降低概率。
  2. 适用于多分类问题

    • 能够有效地处理具有多个类别的分类问题,在实际应用中很多场景都涉及多分类任务,如医学诊断中的疾病分类、图像识别中的物体分类等。相比一些专门针对二分类问题的算法,多元 Logistic 回归在多分类问题上具有更广泛的适用性。
  3. 对数据要求相对宽松

    • 不要求自变量服从特定的分布,如正态分布等。这使得它在处理各种类型的数据时更加灵活,能够适应不同的数据特征。
    • 可以同时纳入连续型变量和分类变量,对于分类变量可以通过虚拟变量编码等方式进行处理,方便地将不同类型的变量整合到一个模型中。
  4. 计算效率较高

    • 算法相对简单,计算复杂度相对较低,特别是在样本量和特征数量不是特别大的情况下,训练和预测的速度较快。这使得它在实时应用或大规模数据处理中具有一定的优势。
  5. 稳健性较好

    • 在面对一些异常值或噪声数据时,相对较为稳健。它不像一些基于距离或方差的方法那样容易受到极端值的影响,能够在一定程度上保持模型的稳定性。
    • 通过适当的正则化方法(如 L1 或 L2 正则化),可以进一步提高模型的稳健性,防止过拟合。

二、缺点

  1. 线性假设限制

    • 假设自变量和因变量之间存在线性关系。然而,在实际问题中,这种线性关系并不总是成立。例如,某些自变量与因变量之间可能存在非线性关系,如二次关系、指数关系等。在这种情况下,直接使用多元 Logistic 回归可能会导致模型的拟合效果不佳,无法准确地捕捉到变量之间的真实关系。
  2. 独立性假设

    • 通常假设各个观测值之间是相互独立的。但在实际数据中,观测值之间可能存在相关性,例如时间序列数据中的自相关、空间数据中的空间相关性等。如果违反了独立性假设,可能会导致模型的参数估计不准确,影响模型的预测性能。
  3. 对数据不平衡敏感

    • 当数据中不同类别的样本数量严重不平衡时,多元 Logistic 回归可能会偏向于多数类,对少数类的分类效果较差。例如,在疾病诊断中,如果某种罕见疾病的样本数量远远少于常见疾病的样本数量,模型可能会更多地预测为常见疾病,而忽略了少数类疾病的特征。在这种情况下,需要采取一些特殊的方法来处理数据不平衡问题,如过采样、欠采样或使用集成学习方法等。
  4. 解释系数的局限性

    • 虽然系数具有一定的解释性,但这种解释是基于对数优势比的。对于一些非专业人士来说,理解对数优势比可能比较困难。此外,系数的解释也受到其他变量的影响,在多变量的情况下,很难孤立地解释一个变量的系数。而且,当变量之间存在交互作用时,系数的解释会变得更加复杂。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值