概述
在本课中,我们将研究了Logistic回归。你将了解到:
- 如何使用python执行逻辑回归来预测statsmodel和sklearn中的二进制响应值。
- 如何解释statsmodels中逻辑回归输出的系数。
- 如何使用各种指标评估模型的执行情况。
- 如何评估python中的模型拟合。
1 简介
在上节课中 , 你了解到如何使用多重线性回归得到 , 定量变量和分类变量在内的多个解释变量 , 同时使用这些变量预测定量反应变量
在这节课中我们完成类似的事情 , 不过我们并不是预测定量反应变量 , 而是在这节课中预测分类变量 , 逻辑回归是实现这点的一种最流行的技巧
逻辑回归是用于预测两个可能结果的回归方法
这种方法可以预测以下示例:
- 预测特定信用卡交易是否存在诈骗
- 某人是否点击我们的网址
- 某人是否拖欠贷款
或者预测只包括两个结果的其他事件 , 利用线性回归我们进行最优化 , 可以较好预测连续性的值变量 , 但是这里我们要正确预测两个可能结果的其中一个 , 我们首先看看它如何改变数学模型 然后创建回归模型
2 Fitting Logistic Regression
在之前的课程中 , 预测反应变量的线性回归并没有受到限制 , 这说明正确的输入内容可能会预测 , "房价为负数 某人身高可能是 80 英尺"
与线性回归不同 使用逻辑回归 , 得到的反应变量在 0 到 1 之间 , 而不是线性回归中可能得到的任何值
从数学意义上来讲, 为了完成逻辑运算 , 我们要改变是否诈骗, 成功与否和其他结果只包括 0 和 1 的变量标记
在信用卡交易例子中 , 你可以认为诈骗案例为 1 , 其他非诈骗案例为 0 , 那么创建逻辑运算是通过 , 线性模型预测对数(log)几率而不是预测反应变量本身
这里 p 是某个值出现的概率 , 所以这是某个事件出现的概率 , 相比于事件不会发生的概率 , 这称为优势率(odd ratio)
并且利用对数用方程式列出线性回归直线 , 我们把预测值控制在 0 和 1 之间 得到成功的概率
通过代数知识 , 你可以像这样使用对数几率改变方程式 , 这直接得出概率 , 这称为 sigmoid 函数
sigmoid 函数根据线性回归直线得到值 , 并将概率控制在 0 和 1 之间
这两种方程都常用于理解创建逻辑回归
对比
3 Fitting Logistic Regression in Python
拟合逻辑回归模型 , 实际上与上节课中 , 拟合线性回归模型非常类似 , 我们再次使用 statsmodels 对数据集进行逻辑回归
首先我们加载必要的库和数据 正如你这里看到的 , 与线性回归类似 , 对于任何分类变量 , 我们想要改为虚拟变量 , 所以在这个数据集中 , 一些日期标记为工作日或周末 , 诈骗要么为真 要么为假 , 所以我们把这些改为虚拟变量
然后我们填充缺失值 诸如此类 , 这个数据集没有缺失值 , 所以我们应当创建虚拟变量 , 这里我将要虚设诈骗 (fraud) 变量 , 我们使用时长预测变量, 所以这里你看到我们创建了这些虚拟变量 , 我使用 0 表示这里的假 , 如果这一列为真 使用 1 表示 , 所以实际上不需要最后一个 我们可以删除
get_dummies
中传出得第一列为0
,第二列为1
这样就得到我的DataFrame 现在可以继续使用 statsmodels , 对于逻辑回归 , 我们不使用普通最小二乘法 , 而是使用评定 (Logit
) 模型 , 我们需要传递的第一个参数值是反应变量(Reasonable variable)
传递这组fraud数据 且建立截距列, 实际上这与上节课内容相似 , 我们要传递截距, 那么说我们要使用时长(duration
) , 所以那样创建模型 , 我们需要进行拟合 然后存储起来 我们再次得到一个摘要 , 所以进行最优化 你会发现 , 我们得到的输出结果与上节课你见到的很相似
4 解释结果
与回归案例相同 , 我们这里使用 p 值 帮助我们理解 , 某个变量 , 对我们预测某笔交易是否存在诈骗非常有效
另外 这些系数 与之前你见到的方式有所不同
首先 我们对每个系数求幂 , 然后通过定量变量 , 对于解释变量每增加一个单位 , 我们认为某个分类变量的几率发生乘数变化 , 成为系数的指数 , 其他变量保持不变
对逻辑回归中虚拟变量编码的方式 , 与多重线性回归的方式相同 , 所以解释虚拟变量系数 , 只能通过指数化系数进行再次改变
然后你使用之前类似的方式 , 解释虚拟变量中的指数化系数 , 在这个类别中与基准相比 , 我们认为某个分类变量的几率发生乘数变化 , 其他变量保持不变 , 现在看起来有些令人困惑 但是接下来我们进行尝试 你会发现这种方法不错
5 Interpret Results
我们仔细观察这些系数和输出结果 了解如何解释这些系数 , 所以这里我们要关注这些系数 , 大多数情况下我们并不关注截距 , 只关注与解释变量相关的内容
为了解释这些内容 , 我们首先需要对每个系数进行指数化
我们进行指数化 , 现在每个值结果是对几率的乘数变化
例如对于工作日虚拟变量
在工作日 , 诈骗为 12.76 乘以周末的值 , 其他变量保持不变 , 在这种案例中表示时长不发生变化
也解释时长的系数 , 因为页面上时长每增加 1 个单位 , 诈骗增加 0.23 倍 , 其他变量保持不变
当你得到乘数变化小于 1 时 , 正如这里对时长的运算 , 计算倒数非常有效
这改变了单位增加的方向 , 变为单位降低 , 所以页面上时长每降低 1 个单位 , 诈骗增加 4.32 倍 , 如果其他变量保持不变
在这个案例中结果是工作日或周末 , 这种倒数可以帮助受众更好地联系结果
6
确定逻辑回归模型如何 , 较好地预测正确标记时 , 最常见的测量方法称为准确率
准确率是正确标记的行数除以数据集中的总行数的比例 , 有些情况下准确率并不能较好发挥作用 , 尤其是数据集中存在大量不均衡时.
混淆矩阵
Recall(查全率):
True Positive / (True Positive + False Negative). Out of all the items that are truly positive, how many were correctly classified as positive. Or simply, how many positive items were 'recalled' from the dataset.被正确预测
Precision(查准率):
True Positive / (True Positive + False Positive). Out of all the items labeled as positive, how many truly belong to the positive class.被正确归类
例如下图
如何理解真阳性(TP), 假阳性(FP), 假阴性(FN)
- 例1
-
例2
所以对应上述,可得查全率和查准率的公式
Python中的模型诊断
导入模块
- 加载库和必要的数据集
- 然后使用
LogisticRegression
逻辑回归作为model模型 , - 导入了
Scikit-learn
, 导入train_test_split
训练 测试和拆分
首先我们split
拆分数据集为 train
训练和test
测试数据
同时我也希望像这样完成 X 和 Y 部分 , Y 表示是否入学(admit) , X 表示其余部分 , 所以我们这里创建声望 (prestige) 作为虚拟变量 , 这样你可以看到我增加了 4 个等级 , 传递了声望 (prestige) 部分 从 4 个中挑选 1 个 , 进行编码 作为单独一列 , 然后我删除其中一列 ,这里你可以指定random_state
随机状态 , 每次运行时都可以得到相同结果 , 可以看到我们得到了 4 部分 , 现在我们要对训练集完成操作 , 与上节课类似 , 你可以通过各种方式改变数据 更好地预测反应变量
不过这一节的目的只是 , 要观察 Scikit-learn 中可以得到的矩阵 , 我们来拟合模型和训练的数据 , 然后观察它是否较好地完成测试数据
- 第一步是拟合模型
log_mod = LogisticRegression()
- 第二步使用训练数据拟合模型 ,
log_mod.fit(X_train, y_train)
- 第三步拟合模型后 , 进行预测
y_preds = log_mod.predict(X_test)
- 第四步得到精确率分数 召回率分数 , 准确率分数 , 混淆矩阵
解释结果
这里你可以看到精确分数约为 67% , 召回率约为 12.5% 并不算大 , 准确度约为 63% , 然后是混淆矩阵
The predicted is across the columns, and the actual is across the rows. Therefore,
Predicted | ||
---|---|---|
Actual | 0 |
1 |
0 |
23 | 1 |
1 |
14 | 2 |
- Therefore, there are 23 non-admitted that we predict to be non-admitted.
- There are 14 admitted that we predicted to be non-admitted.
- There is 1 non-admitted that we predict to be admitted.
- There are 2 admitted that we predict to be admitted.
Why Train-Test Split And Additional Documentation
Here is the documentation for logistic regression sklearn. Additionally, here is the documentation for working with confusion matrices.
In this screencast, you created a train and test dataset, which is very popular in machine learning. A great paper on this topic is provided here. In general, it is useful to split your data into training and testing data to assure your model can predict well not only on the data it was fit to, but also on data that the model has never seen before. Proving the model performs well on test data assures that you have a model that will do well in the future use cases