在 Python 中理解逻辑回归?


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

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

安装

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

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

  • Pandas:用于处理和操作数据

  • Statsmodels:用于处理参数估计和统计检验

  • Pylab:用于生成绘图

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

>pip install numpy pandas statsmodels

逻辑回归的示例用例

为了测试我们在 Python 中的逻辑回归,我们将使用 UCLA(数字研究与教育研究所)提供的 logit 回归数据。您可以从以下链接以 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')
#We can read the data directly from the link \
# 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 数据框中方法的名称。为了避免任何冲突,我将 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

我们可以获取数据的每一列的标准差,以及按声望和是否被录取来划分的频数表。

# take a look at the standard deviation of each column
print(df.std())

输出

admit      0.466087
gre     115.516536
gpa 0.380567
prestige 0.944460
dtype: float64

示例

# frequency table cutting presitge and whether or not someone was admitted
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

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

# plot all of the columns
df.hist()
pl.show()

输出

虚拟变量

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

# dummify rank
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

示例

# create a clean data frame for the regression
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
In [ ]:

执行回归

现在我们将进行逻辑回归,这非常简单。我们只需指定包含我们要预测的变量的列,然后指定模型应使用哪些列进行预测。

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

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

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

# fit the model
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
==============================================================

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

#look at the confidence interval of each coeffecient
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)的学生。

更新于: 2019-07-30

297 次浏览

开启您的 职业生涯

通过完成课程获得认证

立即开始
广告