机器学习(四)——逻辑回归(下)

前面我们讲了二元逻辑回归问题。现在来讨论多元逻辑回归问题。考虑一下,如果我们的返回值不是0,1,而是0,1,2,或者是“好”,“中”,“差”,那么要如何使用逻辑回归来进行预测呢?根据之前的二元逻辑回归的思路,我们可以划分多个阈值来实现。例如,0~0.3 归为0,0.3~0.6 归为1,0.6~1归为2,等等。
医学研究、社会科学领域中, 存在因变量是多项的情况, 其中又分为无序(口味:苦、 甜、 酸、 辣;科目:数学、 自然、 语文、 英语) 和有序(辣度:微辣、 中辣、 重辣) 两类。
对于有序多元逻辑回归,我们可以通过划分多个阈值来实现。例如,0~0.3 归为微辣,0.3~0.6 归为中辣,0.6~1归为重辣,等等。
对于无序多元逻辑回归,我们可建立K-1个二元回归模型(其中k表示类别个数)。给定一个数据点,K-1个模型都会运行,概率最大的类别将会被选为预测类别。对于输入点x,分类结果为各类别的概率分别为如下公式:


在R中,有序逻辑回归可以使用MASS::polr 函数来进行模型预测:

#读取数据
wine <- read.csv("winequality-white.csv", sep=";")

#由于wine的品质有1,2,3,4,5,6,7 等多种类型,但是实际上我们不需要这么多类型
#我们只需要划分好、中、坏三种类型,因此我哦们可以使用如下方法来将原来的7种类型重新划分为3种类型
#小于5的归为0,大于6的归为2,其余归位1。
wine$quality <- factor(ifelse(wine$quality < 5, 0, ifelse(wine$quality > 6, 2, 1)))

#划分测试集和训练集
set.seed(7644)
wine_sampling_vector <- createDataPartition(wine$quality, p = 0.80, list = FALSE)
wine_train <- wine[wine_sampling_vector,]
wine_test <- wine[-wine_sampling_vector,]

#使用polr函数来进行有序逻辑回归
library(MASS)
wine_model <- polr(quality ~., data = wine_train, Hess=T)
#查看回归结果
summary(wine_model)

Call:
polr(formula = quality ~ ., data = wine_train, Hess = T)

Coefficients:
                          Value Std. Error   t value
fixed.acidity         3.067e-01   0.055939    5.4828
volatile.acidity     -4.239e+00   0.430971   -9.8357
citric.acid          -1.517e-01   0.356087   -0.4261
residual.sugar        2.622e-01   0.009930   26.4073
chlorides            -3.288e+00   2.061758   -1.5947
free.sulfur.dioxide   1.391e-02   0.003157    4.4050
total.sulfur.dioxide  4.811e-04   0.001396    0.3447
density              -5.443e+02   0.651263 -835.7740
pH                    2.316e+00   0.303956    7.6187
sulphates             2.155e+00   0.337039    6.3936
alcohol               2.820e-01   0.043573    6.4724

Intercepts:
    Value     Std. Error t value  
0|1 -530.5911    0.6625  -800.8336
1|2 -525.0512    0.6849  -766.5609

Residual Deviance: 4419.114 
AIC: 4445.114 

对于有序逻辑回归,如果有K个类别,需要对一个二元逻辑回归模型
的输出设置K-1个阈值。该模型用决定该直线斜率的一组\beta_i系数,但是包含K-1个截距项。
从上面的结果我们可以看到,我们有3个类别,产生了两个截距项。关于有序逻辑回归的更多解释,可以参考《有序logistic回归

无序逻辑回归,可以使用glmnet::multinorm函数来预测:

#读取数据
glass <- read.csv("glass.data", header=FALSE)
#重命名属性
names(glass) <- c("id","RI","Na", "Mg", "Al", "Si", "K", "Ca", "Ba", "Fe", "Type")
#去掉第一列(ID不是特征)
glass <- glass[,-1]

#划分训练集和测试集
set.seed(4365677)
glass_sampling_vector <- createDataPartition(glass$Type, p = 0.80, list = FALSE)
glass_train <- glass[glass_sampling_vector,]
glass_test <- glass[-glass_sampling_vector,]

#使用multinom函数来进行多元逻辑回归
library(nnet)
glass_model <- multinom(Type ~ ., data = glass_train)
#查看模型结果
summary(glass_model)

Call:
multinom(formula = Type ~ ., data = glass_train)

Coefficients:
  (Intercept)        RI         Na         Mg        Al          Si
2    88.38269 157.08023 -2.3673886 -5.0267504  0.877379 -3.41913137
3    47.39946 -55.92268  1.4463655  0.9474131  4.217085 -0.02663305
5    19.09162  12.18003 -0.4994562 -3.4609854 10.512980 -0.47914302
6   -11.58902 -16.49982 -1.4285456 -4.9773258 50.073683  0.58528791
7   -33.94812  35.21297  2.1003583 -5.1605090  6.518912 -0.32453356
             K         Ca          Ba           Fe
2   -2.4824078 -3.4529191   -4.798335    3.9004356
3   -0.4554840  1.1770520   -2.261806    3.5402764
5    0.2840309 -0.4108929   -3.670666   -0.3565494
6 -182.0373775 -2.3927701 -191.362765 -360.1904720
7   -0.4393933 -2.2908750   -2.934206  -16.2597361

Std. Errors:
  (Intercept)         RI        Na        Mg        Al        Si          K
2  0.13873234 0.34942950 0.5375687 0.7813359 1.3757878 0.1361653 1.84414502
3  0.06148251 0.09974268 0.7592587 1.3621772 1.8285346 0.1929260 2.40562605
5  0.04973139 0.10197329 0.7925746 1.1559582 2.5560426 0.2200123 2.35769251
6  0.01983548 0.02146023 3.4573795 4.5301804 0.5130094 0.3330953 0.07282538
7  0.19802113 0.42883613 1.0163134 1.2334636 2.2783457 0.2240136 2.35104838
         Ca           Ba           Fe
2 0.4961426 2.270415e+00 2.282575e+00
3 0.6614129 4.653237e+00 3.326838e+00
5 0.8039363 2.442393e+00 4.765766e+00
6 6.7453264 1.197158e-08 1.960701e-13
7 0.9515986 2.627772e+00 1.913829e+01

Residual Deviance: 246.4441 
AIC: 346.4441 

#查看训练集的回归结果
glass_predictions <- predict(glass_model, glass_train)
mean(glass_predictions==glass_train$Type)
table(predicted=glass_predictions,actual=glass_train$Type)

#查看测试集的回归结果
glass_test_predictions <- predict(glass_model, glass_test)
mean(glass_test_predictions==glass_test$Type)
table(predicted = glass_test_predictions,actual =glass_test$Type)

可以看到,原来有6个类别(1,2,3,5,6,7),生成了5个模型(2,3,5,6,7)。其原因是,多项逻辑回归的原理是,在结果变量的类别中,会选择一个类别作为参考类别,其他各个类别的系数结果都是以参考类别作为参考(即定义为1),进一步计算及进行诠释。其实在二分类的逻辑回归中,我们也应用到了这一点,0/1变量中,我们默认的0是参考类别,1是感兴趣类别。但是由于二分类结果没有第三个类别,所以不需要额外提出所谓的参考和非参考类别。但是多项逻辑回归就有所不同,有多个类别在结果变量,需要考虑参考类别的选择。

关于模型结果的解读,这里不再细述,可以参考这篇文章:《R-多项逻辑回归/多类别逻辑回归

当然,对于有序多元逻辑回归,我们也可以采用多分类器的方法来进行回归预测。只是实现原理不同而已。

#采用多分类器的方法来进行回归预测
wine_model2 <- multinom(quality ~ ., data = wine_train, maxit=1000)
wine_predictions2 <- predict(wine_model2, wine_test)
mean(wine_predictions2==wine_test$quality)
table(predicted=wine_predictions2,actual=wine_test$quality)

#比较两种分类器的优劣
AIC(wine_model)
AIC(wine_model2)

#对于有序逻辑回归,我们也可以使用step函数来进行参数的选择(这里默认是向后剔除)
wine_model3 <- step(wine_model)
wine_test_predictions3 <- predict(wine_model3, wine_test)
mean(wine_test_predictions3==wine_test$quality)
table(predicted = wine_test_predictions3,actual =wine_test$quality)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容