前言
上期 基于 mlr 包的逻辑回归算法介绍与实践(上)关于逻辑回归的介绍内容中主要包括了特征工程、特征选择和缺失值的处理等问题,都是小编之前没有系统学过的机器学习任务。本期逻辑回归内容基于上期进行了扩展,主要包括逻辑回归中的交叉验证、odds ratio
和预测等。
1. 交叉验证逻辑回归模型
交叉验证时,应该交叉验证整个模型的构建过程,包括任何依赖于数据的预处理步骤,例如缺失值填充等。在之前介绍 KNN 算法的推文中,我们使用了一个 wrapper
函数,将 learner
和超参数调优过程封装在一起。本期,我们将为 learner
和缺失值填充创建一个 wrapper
。
1.1 包括缺失值填充的交叉验证过程
函数 makeImputeWrapper()
将 learner
和缺失值填充方法封装在一起:
logRegWrapper <- makeImputeWrapper("classif.logreg",#指定learner cols = list(Age = imputeMean()))#使用wrapper封装
接下来,对 logRegWrapper
应用 10 次交叉验证,重复 50 次,过程和 KNN 算法的嵌套交叉验证类似。对于交叉验证的每一个 fold
,训练集中 Age
变量的均值将被用来输入到任何的缺失值。
kFold <- makeResampleDesc(method = "RepCV", folds = 10, reps = 50, stratify = TRUE) #设置 K-fold 交叉验证 logRegwithImpute <- resample(logRegWrapper, titanicTask, resampling = kFold, measures = list(acc, fpr, fnr)) logRegwithImpute #Resample Result #Task: imp$data #Learner: classif.logreg.imputed #Aggr perf: acc.test.mean=0.7966432,fpr.test.mean=0.2988353,fnr.test.mean=0.1439165 #Runtime: 6.67456
由于这是一个二分类问题,我们可以访问一些额外的性能指标,例如 false positive rate (fpr)
和 false negative rate (fnr)
。平均而言,模型将 79.7% 的乘客正确分类,但将 29.9%的死亡乘客错误地分类为幸存乘客(fpr
),将 14.4% 的幸存乘客错误地分类为死亡乘客(fnr
)。
1.2 性能指标
这里小编举一个简单的例子来帮助读者们更好地理解 fpr
和 fnr
。
假设你在一家银行的欺诈检测部门工作,是一名数据科学家。你的工作是建立一个模型,预测信用卡交易是合法的还是欺诈的。假设在 10 万次信用卡交易中,只有 1 次是欺诈。因为欺诈相对罕见,所以你决定建立一个模型,将所有交易简单地归类为合法交易。
模型精度为 99.999%,但该模型无法识别任何欺诈交易,并且有 100% 的 fnr
。
由此可知,我们应该在特定的问题中选择合适的评估模型性能的指标。
在性能指标网站[1]中可以查看 mlr 包当前包含的所有性能指标以及其适用的情况。
2. 解释模型:odds ratio
在上期推文中曾经提到由于模型参数的可解释性,逻辑回归非常受欢迎。
为了提取模型参数,我们需要使用 getLearnerModel()
函数将 mlr 模型对象 logRegModel
转化为 R 模型对象。接下来,再将这个 R 模型对象作为参数传递给函数 coef()
,它代表“系数” (或参数),返回模型参数。
logRegModelData <- getLearnerModel(logRegModel)#转换模型对象 coef(logRegModelData)#提取模型参数 #(Intercept) Pclass2 Pclass3 Sexmale Age # 3.809661697 -1.000344806 -2.132428850 -2.775928255 -0.038822458 # Fare FamSize # 0.003218432 -0.243029114
当所有连续变量都为零且各因素处于参考水平时,截距代表的是泰坦尼克号灾难幸存几率(odd)的对数。实际上我们对斜率比对截距更感兴趣,但这些值是用对数几率单位(log odds unit)表示的,将很难解释。因此,人们通常把它们转换成 odds ratio
。
例如,如果你是女性,在泰坦尼克号上幸存的几率(odd)是 0.7,如果你是男性,幸存的几率(odd)是 0.2,那么如果女性幸存的 odds ratio
就是 3.5。换句话说,如果你是女性,你的幸存可能会是男性的 3.5 倍。
odds ratio
是解释预测因子对结果影响的一种非常流行的方式。
2.1 将模型参数转换成 odds ratio
要将 log odds
转换为 odds ratios
,取指数即可,还可以使用 confint()
函数计算 95% 置信区间。
exp(cbind(Odds_Ratio = coef(logRegModelData), confint(logRegModelData))) #Waiting for profiling to be done... # Odds_Ratio 2.5 % 97.5 % #(Intercept) 45.13516691 19.14718874 109.72483921 #Pclass2 0.36775262 0.20650392 0.65220841 #Pclass3 0.11854901 0.06700311 0.20885220 #Sexmale 0.06229163 0.04182164 0.09116657 #Age 0.96192148 0.94700049 0.97652950 #Fare 1.00322362 0.99872001 1.00863263 #FamSize 0.78424868 0.68315465 0.89110044
大多数的 odds ratio
都小于 1,意味着事件不太可能发生。如果用 1 除以它们,就更容易理解了。例如,如果你是男性,幸存的 odds ratio
是 0.06,1 除以 0.06 = 16.7。这意味着,在所有其他变量不变的情况下,男性的幸存率是女性的 16.7 倍。
对于连续变量,我们将 odds ratio
解释为:变量每增加一个单位,乘客幸存的可能性就增加多少。例如,每增加一名家庭成员,一名乘客幸存的可能性就会降低 1 / 0.78 = 1.28 倍。
对于因子,我们将 odds ratio
解释为与该变量的参考水平相比乘客幸存的可能性有多大。例如,我们有 Pclass2 和 Pclass3 的 odds ratio
,分别是 2 级和 3 级乘客与 1 级乘客相比存活的倍数。
95% 置信区间表示每个变量具有预测价值的强度。odds ratio
为 1 意味着几率相等,并且变量对预测没有影响。因此,如果 95% 置信区间包含值 1,例如 Fare 变量的置信区间,则这可能表明此变量对预测没有影响。
2.2 增加一个单位是没有意义的
一个单位的增加通常是不容易解释的。 假设你得到一个odds ratio
,即在蚁丘中每增加一只蚂蚁,这个蚁丘在白蚁攻击中存活的可能性就增加 1.000005 倍。如何解释这么小的 odds ratio
呢?
当一个单位的增加没有意义时,一种流行的技术是在训练模型之前对连续变量进行对数转换。这不会影响模型的预测,但可以将 odds ratio
解释为:每次蚂蚁的数量增加一倍,蚁丘存活的可能性就增加 x 倍。这将提供更大、更可解释的 odds ratio
。
3.预测
我们已经构建、交叉验证和解释了我们的模型,现在可以很好地使用该模型对新数据进行预测。这个模型的场景有点不同寻常,因为我们是根据一个历史事件建立了一个模型,所以不会用它来预测另一场泰坦尼克号灾难的幸存者。故要说明如何使用逻辑回归模型进行预测,可载入一些未标记的乘客数据并清理后进行预测。
data(titanic_test, package = "titanic")#加载数据测试集 titanicNew <- as_tibble(titanic_test) titanicNewClean <- titanicNew %>% mutate_at(.vars = c("Sex", "Pclass"), .funs = factor) %>% mutate(FamSize = SibSp + Parch) %>% select(Pclass, Sex, Age, Fare, FamSize)#清理数据 predict(logRegModel, newdata = titanicNewClean)#预测 #Prediction: 418 observations #predict.type: response #threshold: #time: 0.01 # response #1 0 #2 0 #3 0 #4 0 #5 1 #6 0 #... (#rows: 418, #cols: 1)