了解 Python 中的逻辑回归?

pythonserver side programmingprogramming更新于 2024/1/24 20:02:00

逻辑回归是一种预测二元结果的统计技术。它并不是什么新鲜事,因为它目前正应用于从金融到医学到犯罪学和其他社会科学的各个领域。

在本节中,我们将使用 Python 开发逻辑回归,尽管您可以使用其他语言(如 R)实现相同的功能。

安装

我们将在示例程序中使用以下库,

  • Numpy:定义数值数组和矩阵

  • Pandas:处理和操作数据

  • Statsmodels:处理参数估计和统计测试

  • Pylab:生成图表

您可以通过在 CLI 中运行以下命令,使用 pip 安装上述库。

>pip install numpy pandas statsmodels

逻辑回归的示例用例

为了在 Python 中测试我们的逻辑回归,我们将使用加州大学洛杉矶分校(数字研究和教育研究所)提供的逻辑回归数据。您可以从以下链接以 csv 格式访问数据:https://stats.idre.ucla.edu/stat/data/binary.csv

我已将此 csv 文件保存在本地计算机中并将从那里读取数据,您可以执行任一操作。通过此 csv 文件,我们将确定可能影响研究生院录取的各种因素。

导入所需的库 &加载数据集

我们将使用 pandas 库 (pandas.read_csv) 读取数据:

import pandas as pd
import statsmodels.api as sm
import pylab as pl
import numpy as np
df = pd.read_csv('binary.csv')
#我们可以直接从链接读取数据 \
# df = pd.read_csv(‘https://stats.idre.ucla.edu/stat/data/binary.csv’)
print(df.head())

输出

   admit   gre gpa rank
0   0      380 3.61 3
1   1     660 3.67 3
2   1 800 4.00 1
3   1 640 3.19 4
4   0 520 2.93 4

从上面的输出中我们可以看到,有一列名为"rank",这可能会产生问题,因为"rank"也是 pandas dataframe 中方法的名称。为了避免任何冲突,我将 rank 列的名称更改为"prestige"。因此,让我们更改数据集的列名称:

df.columns = ["admit", "gre", "gpa", "prestige"]
print(df.columns)

输出

Index(['admit', 'gre', 'gpa', 'prestige'], dtype='object')
In [ ]:

现在一切看起来都很好,我们现在可以更深入地了解数据集包含的内容。

#总结数据

使用 pandas 函数 describe我们将对所有内容有一个概括的了解。

print(df.describe())

输出

            admit         gre             gpa          prestige
count    400.000000     400.000000     400.000000     400.00000
mean       0.317500     587.700000       3.389900       2.48500
std        0.466087     115.516536       0.380567       0.94446
min        0.000000     220.000000       2.260000       1.00000
25%        0.000000     520.000000       3.130000       2.00000
50%        0.000000     580.000000       3.395000       2.00000
75%        1.000000     660.000000       3.670000       3.00000
max        1.000000     800.000000       4.000000     4.00000

我们可以得到数据中每一列的标准差和频率表,这些频率表切割声望和某人是否被录取。

# 查看每一列的标准差
print(df.std())

输出

admit      0.466087
gre     115.516536
gpa 0.380567
prestige 0.944460
dtype: float64

示例

# 频率表切割 presitge 以及某人是否被录取
print(pd.crosstab(df['admit'], df['prestige'], rownames = ['admit']))

输出

prestige   1  2  3  4
admit
0         28 97 93 55
1 33 54 28 12

让我们绘制数据集的所有列。

# 绘制所有列
df.hist()
pl.show()

输出

虚拟变量

Python pandas 库在分类变量的表示方式上提供了极大的灵活性。

# 虚拟排名
dummy_ranks = pd.get_dummies(df['prestige'], prefix='prestige')
print(dummy_ranks.head())

输出

         prestige_1   prestige_2   prestige_3   prestige_4
0                 0            0            1            0
1                 0            0            1            0
2                 1            0            0            0
3                 0            0            0            1
4                 0            0            0            1

示例

# 为回归创建一个干净的数据框
cols_to_keep = ['admit', 'gre', 'gpa']
data = df[cols_to_keep].join(dummy_ranks.ix[:, 'prestige_2':])

输出

     admit  gre  gpa  prestige_2  prestige_3  prestige_4
0        0  380  3.61          0           1           0
1          1  660  3.67          0           1         0
2        1  800  4.00          0           0         0
3        1  640  3.19          0         0         1
4       0 520 2.93 0 0 1
在 [ ] 中:

执行回归

现在我们要进行逻辑回归,这很简单。我们只需指定包含我们试图预测的变量的列,然后指定模型应该用来进行预测的列。

现在我们根据 gre、gpa 和 prestige 虚拟变量 prestige_2、prestige_3 和 prestige_4 预测 admit 列。 prestige_4。

train_cols = data.columns[1:]
# Index([gre, gpa, prestige_2, prestige_3, prestige_4], dtype=object)

logit = sm.Logit(data['admit'], data[train_cols])

# 拟合模型
result = logit.fit()

输出

Optimization terminated successfully.
Current function value: 0.573147
Iterations 6

解释结果

让我们使用 statsmodels 生成摘要输出。

print(result.summary2())

输出

                     Results: Logit
===============================================================
Model:              Logit             No. Iterations: 6.0000
Dependent Variable: admit           Pseudo R-squared: 0.083
Date:               2019-03-03 14:16             AIC: 470.5175
No. Observations:   400                          BIC: 494.4663
Df Model:             5               Log-Likelihood: -229.26
Df Residuals:       394                      LL-Null: -249.99
Converged:       1.0000                        Scale: 1.0000
----------------------------------------------------------------
Coef. Std.Err. z P>|z| [0.025 0.975]
----------------------------------------------------------------
gre 0.0023 0.0011 2.0699 0.0385 0.0001 0.0044
gpa 0.8040 0.3318 2.4231 0.0154 0.1537 1.4544
prestige_2 -0.6754 0.3165 -2.1342 0.0328 -1.2958 -0.0551
prestige_3 -1.3402 0.3453 -3.8812 0.0001 -2.0170 -0.6634
prestige_4 -1.5515 0.4178 -3.7131 0.0002 -2.3704 -0.7325
intercept -3.9900 1.1400 -3.5001 0.0005 -6.2242 -1.7557
==============================================================

上述结果对象还允许我们隔离和检查模型输出的各个部分。

#查看每个系数的置信区间
print(result.conf_int())

输出

                  0           1
gre            0.000120   0.004409
gpa            0.153684   1.454391
prestige_2     -1.295751  -0.055135
prestige_3     -2.016992  -0.663416
prestige_4     -2.370399  -0.732529
intercept      -6.224242  -1.755716

从上面的输出中,我们可以看到被录取的概率和候选人本科学校的声望之间存在反比关系。

因此,就读于排名靠前的本科院校(prestige_1= True)的学生被研究生课程录取的概率要高于就读于排名较低的学校(prestige_3 或 prestige_4)的学生。


相关文章