ISLR实验:分类 - 二次判别分析

目录

本文源自《统计学习导论:基于R语言应用》(ISLR) 中《4.6 R实验:逻辑斯谛回归、LDA、QDA和KNN》章节

library(ISLR)
library(MASS)
library(pROC)

数据

股票市场数据

data(Smarket)
head(Smarket)
  Year   Lag1   Lag2   Lag3   Lag4   Lag5 Volume  Today Direction
1 2001  0.381 -0.192 -2.624 -1.055  5.010 1.1913  0.959        Up
2 2001  0.959  0.381 -0.192 -2.624 -1.055 1.2965  1.032        Up
3 2001  1.032  0.959  0.381 -0.192 -2.624 1.4112 -0.623      Down
4 2001 -0.623  1.032  0.959  0.381 -0.192 1.2760  0.614        Up
5 2001  0.614 -0.623  1.032  0.959  0.381 1.2057  0.213        Up
6 2001  0.213  0.614 -0.623  1.032  0.959 1.3491  1.392        Up

训练集和测试集

训练集:2001 至 2004 年

测试集:2005 年

train <- (Year < 2005)

train 是一个布尔变量,Boolean vector

smarket_2005 <- Smarket[!train, ]
dim(smarket_2005)
[1] 252   9
direction_2005 <- Direction[!train]

方法

MASS 包的 qda() 函数实现二次判别分析

qda_fit <- qda(
  Direction ~ Lag1 + Lag2,
  data=Smarket,
  subset=train
)
qda_fit
Call:
qda(Direction ~ Lag1 + Lag2, data = Smarket, subset = train)

Prior probabilities of groups:
    Down       Up 
0.491984 0.508016 

Group means:
            Lag1        Lag2
Down  0.04279022  0.03389409
Up   -0.03954635 -0.03132544

预测

qda_predict <- predict(
  qda_fit,
  smarket_2005
)
qda_class <- qda_predict$class

列联表

table(direction_2005, qda_class)
              qda_class
direction_2005 Down  Up
          Down   30  81
          Up     20 121
mean(qda_class == direction_2005)
[1] 0.5992063

ROC 曲线

plot(
  roc(
    direction_2005,
    qda_predict$posterior[,2],
    percent=TRUE
  ),
  print.auc=TRUE,
  plot=TRUE
)

参考

https://github.com/perillaroc/islr-study

ISLR实验系列文章

线性回归

分类

重抽样方法

线性模型选择与正则化