了解 Python 中的逻辑回归?
逻辑回归是一种预测二元结果的统计技术。它并不是什么新鲜事,因为它目前正应用于从金融到医学到犯罪学和其他社会科学的各个领域。
在本节中,我们将使用 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)的学生。