【学习笔记】The Analytics Edge 第三周:逻辑回归模型的建立与使用


  • cid:41:privileges:topics:read

    这周的课程以预测医疗保险质量的好坏为例介绍了如何在R中使用逻辑回归。
    符号定义如下:
    因变量:“质量差”定义为y,y = 1表示质量差, y = 0 表示质量好。
    P(y = 1) 表示“质量差”的概率,P(y = 0) = 1 - P(y = 1)
    自变量: x1, x2, x3,…, xk
    逻辑回归函数:
    0_1474327439681_logistic.jpg

    对于医疗数据集“quality.csv”(https://d37djvu3ytnwxt.cloudfront.net/assets/courseware/v1/cbb7baaf6c8a0559bb6a4549ad194ab8/asset-v1:MITx+15.071x_3+1T2016+type@asset+block/quality.csv)
    首先导入数据:

    quality = read.csv(“quality.csv”)

    使用table查看一下质量好坏的分布

    table(quality$PoorCare)
    0 1
    98 33

    这里可以构建一个简单的base model (分类问题中的标准base model是频率最高的数据的个数除以所有数据的个数):
    98/131
    [1] 0.7480916

    Base model的准确率大致为75%, 意味着我们训练模型的准确率要超过75%才行。

    这一周课程的数据并没有默认分类为训练数据和测试数据,因此需要自己来对数据集进行分类。在R中可以借助额外的库来帮助我们随机将数据划分为训练数据和测试数据。为此我们首先需要安装和导入库:

    install.packages(“caTools”)
    library(caTools)

    设置随机数的种子:(种子可以自己选择,课程使用的是88)

    set.seed(88)

    随机划分数据(splitratio = 0.75 表示在划分出的两组数据集中PoorCare = 0的数据都占到75%):

    split = sample.split(quality$PoorCare, SplitRatio = 0.75)
    split
    [1] TRUE TRUE TRUE TRUE FALSE TRUE FALSE TRUE FALSE FALSE TRUE FALSE
    [13] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
    [25] FALSE TRUE TRUE TRUE TRUE FALSE FALSE FALSE FALSE TRUE TRUE TRUE
    [37] FALSE TRUE TRUE TRUE FALSE FALSE TRUE TRUE FALSE TRUE FALSE TRUE
    [49] FALSE TRUE TRUE FALSE FALSE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
    [61] TRUE TRUE TRUE TRUE TRUE FALSE TRUE TRUE TRUE TRUE FALSE TRUE
    [73] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE FALSE
    [85] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE FALSE TRUE TRUE
    [97] TRUE TRUE TRUE TRUE TRUE TRUE TRUE FALSE TRUE TRUE TRUE FALSE
    [109] TRUE FALSE FALSE TRUE TRUE FALSE TRUE TRUE TRUE FALSE TRUE TRUE
    [121] FALSE TRUE TRUE FALSE TRUE TRUE FALSE TRUE TRUE TRUE FALSE

    根据随机换分的结果,将原本的数据集分成两组分、分别存到两个变量中:
    qualityTrain = subset(quality, split == TRUE)
    qualityTest = subset(quality, split == FALSE)

    建立逻辑回归模型:

    QualityLog = glm(PoorCare ~ OfficeVisits + Narcotics, data=qualityTrain, family=binomial)
    summary(QualityLog)

    0_1474327598724_CALL.jpg

    summary里的AIC这个参数和线性回归里的R^2参数一样,是衡量模型好坏的参数。对于同一组数据,AIC越小的模型越好。

    接着就可以尝试一下,使用建立好的模型对训练数据集做出预测:(type=“response”表示返回结果为概率)

    predictTrain = predict(QualityLog, type=“response”)
    summary(predictTrain)
    Min. 1st Qu. Median Mean 3rd Qu. Max.
    0.06623 0.11910 0.15970 0.25250 0.26760 0.98460
    tapply(predictTrain, qualityTrain$PoorCare, mean)
    0 1
    0.1894512 0.4392246

    在实际进行分类的时候,我们需要预测的结果要么是0、要么是1。这是就需要为模型选取一个阈值。当概率大于等于阈值时判定“质量差”,小于阈值时判定“质量好”。阈值的大小会对模型的两个属性“sensitivity” 和 “specificity”产生影响。
    0_1474327635077_confusion.jpg
    Sensitivity = TP / (TP + FN)
    Specificity = TN / (TN + FP)
    一个高阈值的模型通常sensitivity较低而Specificity较高,反之亦然。
    在R中可以对分类结果使用不同的阈值:

    table(qualityTrain$PoorCare, predictTrain > 0.5)
    FALSE TRUE
    0 70 4
    1 15 10

    计算下sensitivity:

    10/25
    [1] 0.4
    计算下specificity:
    70/74
    [1] 0.9459459

    使用阈值0.7:

    table(qualityTrain$PoorCare, predictTrain > 0.7)

    FALSE TRUE
    0 73 1
    1 17 8
    计算sensitivity:

    8/25
    [1] 0.32
    计算specificity:”
    73/74
    [1] 0.9864865

    使用阈值0.2:

    table(qualityTrain$PoorCare, predictTrain > 0.2)

    FALSE TRUE
    0 54 20
    1 9 16
    计算sensitivity:

    16/25
    [1] 0.64
    计算specificity:
    54/74
    [1] 0.7297297

    为了确定到底应该使用哪个阈值,我们可以使用ROC(Receiver Operator Characteristic) curve来帮助做出判断:
    0_1474327782323_roc1.jpg
    如果更关注高specificity或者低false positive rate,就选择能最大化true positive rate并保持false positive rate较低的阈值。(比如上图中的(0.1, 0.5)左右的位置)
    反之亦然,比如图中的(0.3, 0.8)左右的位置。
    在R中为了确定具体的阈值,我们需要首先创建一个ROC曲线:

    install.packages(“ROCR”)
    library(ROCR)

    ROCRpred = prediction(predictTrain, qualityTrain$PoorCare)
    ROCRperf = performance(ROCRpred, “tpr”, “fpr”)
    plot(ROCRperf)
    0_1474327833092_roc1.jpg

    创建一个带标签的ROC曲线以方便我们选取阈值:

    plot(ROCRperf, colorize=TRUE, print.cutoffs.at=seq(0,1,by=0.1), text.adj=c(-0.2,1.7))
    0_1474327845920_roc2.jpg
    如上图所示,(0.1, 0.5)处的阈值大致为0.3, 而(0.3, 0.8) 处的阈值大致为0.2


登录后回复
 

与 BitTiger Community 的连接断开,我们正在尝试重连,请耐心等待