📜  使用 Statsmodels 的逻辑回归

📅  最后修改于: 2022-05-13 01:55:51.901000             🧑  作者: Mango

使用 Statsmodels 的逻辑回归

先决条件:了解逻辑回归
逻辑回归是用于查找特定事件发生概率的回归分析类型。对于我们有一个只能采用离散值的分类因变量的情况,它是最适合的回归类型。

数据集:
在本文中,我们将根据学生的 gmat、gpa 分数和工作经验来预测学生是否会被特定大学录取。这里的因变量是一个二元 Logistic 变量,预计将严格采用两种形式之一,即被承认未被承认

建立逻辑回归模型:

Statsmodels是一个Python模块,提供各种函数来估计不同的统计模型和执行统计测试

  • 首先,我们定义了依赖( y )和独立( X )变量的集合。如果因变量是非数字形式,则首先使用虚拟变量将其转换为数字。示例中用于训练模型的文件可在此处下载。
  • Statsmodels 提供了一个Logit()函数来执行逻辑回归。 Logit()函数接受yX作为参数并返回Logit对象。然后将模型拟合到数据中。
Python3
# importing libraries
import statsmodels.api as sm
import pandas as pd
 
# loading the training dataset
df = pd.read_csv('logit_train1.csv', index_col = 0)
 
# defining the dependent and independent variables
Xtrain = df[['gmat', 'gpa', 'work_experience']]
ytrain = df[['admitted']]
  
# building the model and fitting the data
log_reg = sm.Logit(ytrain, Xtrain).fit()


Python3
# printing the summary table
print(log_reg.summary())


Python3
# loading the testing dataset 
df = pd.read_csv('logit_test1.csv', index_col = 0)
 
# defining the dependent and independent variables
Xtest = df[['gmat', 'gpa', 'work_experience']]
ytest = df['admitted']
 
# performing predictions on the test datdaset
yhat = log_reg.predict(Xtest)
prediction = list(map(round, yhat))
 
# comparing original and predicted values of y
print('Actual values', list(ytest.values))
print('Predictions :', prediction)


Python3
from sklearn.metrics import (confusion_matrix,
                           accuracy_score)
 
# confusion matrix
cm = confusion_matrix(ytest, prediction)
print ("Confusion Matrix : \n", cm)
 
# accuracy score of the model
print('Test accuracy = ', accuracy_score(ytest, prediction))


输出 :

Optimization terminated successfully.
         Current function value: 0.352707
         Iterations 8

在输出中,“迭代”是指模型迭代数据的次数,试图优化模型。默认情况下,执行的最大迭代次数为 35 次,之后优化失败。

汇总表:

下面的汇总表为我们提供了关于回归结果的描述性总结。

Python3

# printing the summary table
print(log_reg.summary())

输出 :

Logit Regression Results                           
==============================================================================
Dep. Variable:               admitted   No. Observations:                   30
Model:                          Logit   Df Residuals:                       27
Method:                           MLE   Df Model:                            2
Date:                Wed, 15 Jul 2020   Pseudo R-squ.:                  0.4912
Time:                        16:09:17   Log-Likelihood:                -10.581
converged:                       True   LL-Null:                       -20.794
Covariance Type:            nonrobust   LLR p-value:                 3.668e-05
===================================================================================
                      coef    std err          z      P>|z|      [0.025      0.975]
-----------------------------------------------------------------------------------
gmat               -0.0262      0.011     -2.383      0.017      -0.048      -0.005
gpa                 3.9422      1.964      2.007      0.045       0.092       7.792
work_experience     1.1983      0.482      2.487      0.013       0.254       2.143
===================================================================================

汇总表中一些术语的解释:

  • coef :回归方程中自变量的系数。
  • 对数似然:最大似然估计(MLE)函数的自然对数。 MLE 是寻找导致最佳拟合的参数集的优化过程。
  • LL-Null:不包含自变量(仅包含截距)时模型的对数似然值。
  • 伪R-squ。 :替代最小二乘线性回归中的 R 平方值。它是空模型的对数似然与完整模型的对数似然之比。

预测新数据:

现在我们将在新的测试数据上测试我们的模型。测试数据是从此 csv 文件加载的。
predict()函数对于执行预测很有用。获得的预测是分数(介于 0 和 1 之间),表示被录取的概率。因此,这些值被四舍五入,以获得 1 或 0 的离散值。

Python3

# loading the testing dataset 
df = pd.read_csv('logit_test1.csv', index_col = 0)
 
# defining the dependent and independent variables
Xtest = df[['gmat', 'gpa', 'work_experience']]
ytest = df['admitted']
 
# performing predictions on the test datdaset
yhat = log_reg.predict(Xtest)
prediction = list(map(round, yhat))
 
# comparing original and predicted values of y
print('Actual values', list(ytest.values))
print('Predictions :', prediction)

输出 :

Optimization terminated successfully.
         Current function value: 0.352707
         Iterations 8
Actual values [0, 0, 0, 0, 0, 1, 1, 0, 1, 1]
Predictions : [0, 0, 0, 0, 0, 0, 0, 0, 1, 1]

测试模型的准确性:

Python3

from sklearn.metrics import (confusion_matrix,
                           accuracy_score)
 
# confusion matrix
cm = confusion_matrix(ytest, prediction)
print ("Confusion Matrix : \n", cm)
 
# accuracy score of the model
print('Test accuracy = ', accuracy_score(ytest, prediction))

输出 :

Confusion Matrix : 
 [[6 0]
 [2 2]]
Test accuracy =  0.8