定义
在线性回归中, 反应变量是一个数值变量。在逻辑回归中,得到的反应变量在0到1之间。比如,在信用卡交易的例子中,可以认为诈骗的案例为1,其他非诈骗的案例为0。那么,逻辑回归就是要创建线性模型,以预测对数几率而不是反应变量本身。
log() = + * + * + ...
这里:
p是某个值出现的概率,称为优势率(odds)。
使用对数几率改变方程式,可以直接得出概率:
logic.png
这个函数称为sigmoid
函数。
sigmoid
函数通过线性回归的直线得到值,并将值映射到一个0到1之间的概率值。
python 演示
- 导入数据和库
import numpy as np
import pandas as pd
import statsmodels.api as sm
df = pd.read_csv("./fraud_dataset.csv")
df.head()
- 获得虚拟变量
df[['no_fraud', 'fraud']] = pd.get_dummies(df['fraud'])
df = df.drop('no_fraud', axix = 1)
df[['weekday', 'weekend']] = pd.get_dummies(df['day'])
df = df.drop('weekend', axix = 1)
- 逻辑回归
df['intercept'] = 1
logit_mod = sm.Logit(df['fraud'], df[['intercept','duration', 'weekday']])
results = logit_mod.fit()
results.summary()
- 显示系数的指数值以便对其进行解释
np.exp(results.params)
例如假设工作日的系数为12.76,则可以说在其他解释变量不变的情况下,在工作日,诈骗为12.76乘以周末的值。
exp:返回e的n次方。
解释结果
p值
和线性回归类似,这里p值有助于我们理解某个变量对于我们用模型预测结果是否具有统计学上的显著性。
系数
对于系数的理解和线性回归不同。他是指,在其他解释变量不变的情况下,解释变量每增加一个单位,优势率(odds)
将发生乘数变化(multiplicateive change)
,变化量为exp(系数)
。
逻辑回归中对虚拟变量的编码方式和线性回归中相同,所以其解释方式也仅仅是加上了一个指数化的过程。
值得注意的是:
- 通常对系数进行指数处理
np.exp(results.params)
例如假设工作日的系数为12.76,则可以说在其他解释变量不变的情况下,在工作日,诈骗为12.76乘以周末的值。
- 如果系数为负,通常描述其相反方向的变化:在其他解释变量不变的情况下,在页面上的时长每降低一个单位,诈骗将增加4.32倍。
模型诊断+性能指标
通常情况下,我们可以用准确率
描述模式是否能较好的预测正确的标记。正确率是指正确标记的行数除以数据集中的总行数的比例。但是有些情况下,正确率并不能较好的发挥作用,尤其是在数据集中存在着大量不均衡的数据时。所以还有一些其他的常用衡量标准,为此我们还需要理解模型是否能较好的符合这些衡量标准。更多类似的概念可查看 机器学习纳米学位课程 。
混淆矩阵
召回率:recall,表示的是样本中的正例有多少被预测正确了。
准确率:precision,检测到为真,而且真实结果也为真的概率。
精确率:accuracy,分类器正确分类的样本数与总样本数之比。
python 演示
- 导入数据和库
import numpy as np
import pandas as pd
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import confusion_matrix, precision_score, recall_score, accuracy_score
from sklearn.model_selection import train_test_split
np.random.seed(42)
df = pd.read_csv('./admissions.csv')
df.head()
- 创建虚拟变量
df[['level1','level2','level3','level4']] = pd.get_dummies(df['prestige'])
- 逻辑回归
y = df['admit']
X = df[['gre','gpa','level1','level2','level3']]
X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.20,random_state=0)
log_mod = LogisticRegression()
log_mod.fit(X_train, y_train)
这里是逻辑回归 sklearn 包的相关文献。
- 预测
y_preds = log_mod.predict(X_test)
y_preds
- 输出混淆矩阵
print(precision_score(y_test, y_preds))
print(recall_score(y_test, y_preds))
print(accuracy_score(y_test, y_preds))
confusion_matrix(y_test, y_preds)
这里是处理混淆矩阵的相关文献。
precision、 recall 与 accuracy 这些都是常见的度量标准。
- 解释confusion_matrix(y_test, y_preds)的结果
confusion_matrix(y_test, y_preds)输出的是一个矩阵即二维数组,例如:
Predicted (预测值) | ||
---|---|---|
Actual(实际值) | 0 | 1 |
0 | 23 | 1 |
1 | 14 | 2 |
因此,
- 在我们预测的未入学人数中,有 23 人未入学。
- 在我们预测的未入学人数中,有 14 人已入学。
- 在我们预测的已入学人数中,有 1 人未入学。
- 在我们预测的已入学人数中,有 2 人已入学。
其他常见的指标
其他非常常见的指标是 ROC 曲线 与 AUC 。这些实际上使用的是逻辑回归模型的概率,而不仅仅是标签。更多关于这两个指标的资料,点击 这里 即可获取。
python 演示
### Unless you install the ggplot library in the workspace, you will
### get an error when running this code!
from ggplot import *
from sklearn.metrics import roc_curve, auc
%matplotlib inline
preds = log_mod.predict_proba(X_test)[:,1]
fpr, tpr, _ = roc_curve(y_test, preds)
df = pd.DataFrame(dict(fpr=fpr, tpr=tpr))
ggplot(df, aes(x='fpr', y='tpr')) +\
geom_line() +\
geom_abline(linetype='dashed')
逻辑回归通常的步骤
总结下来,逻辑回归通常的步骤是:
- 实例化
- 拟合 ( on train)
- 预测 ( on test)
- 分值 (预测值与 test 值相比较)
获取一个 混淆矩阵(confusion matrix),尝试一些额外的度量标准: precision、 recall 与 accuracy 。其他非常常见的指标是 ROC 曲线 与 AUC 。
本文要点
-
如何使用 python 来实现逻辑回归,用 statsmodels 和 sklearn 包来预测二元分类反应值。
-
如何解释 statsmodels 逻辑回归输出的系数。
-
如何用多个指标来评估模型效果。
-
如何在 python 里评估模型拟合效果。
网友评论