在 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)的学生。