用贝叶斯判别分析再次预测股票涨跌情况

可以转载,禁止修改。转载请注明作者以及原文链接

注:本文是从贝叶斯分类器的角度来讨论判别分析,有关贝叶斯分类器的概念可参考文末延伸阅读第1-2篇文章。至于Fisher判别分析,未来会连同PCA一同讨论。

判别分析也是一种分类器,与逻辑回归相比,它具有以下优势:

  1. 当类别的区分度高的时候,逻辑回归的参数估计不够稳定,它点在线性判别分析中是不存在的;
  2. 如果样本量n比较小,而且在每一类响应变量中预测变量X近似服从正态分布,那么线性判别分析比逻辑回归更稳定;
  3. 多于两类的分类问题时,线性判别分析更普遍。

贝叶斯分类器

贝叶斯分类的基本思想是:对于多分类(大于等于2类)的问题,计算在已知条件下各类别的条件概率,取条件概率最大的那一类作为分类结果。用公式描述如下:

其中,\pi_{k}是第k类的先验概率,f_k(x)是第k类的概率密度(当然如果是离散型变量就是条件概率,本文考虑连续型变量)。这个公式就是贝叶斯定理

线性判别分析(Linear Discriminant Analysis, LDA)

1、 一元线性判别分析

假设特征变量满足正态分布,即:

线性判别分析有一个重要假设:假设所有K类的划分方差相同,即\delta_1^2=\delta_2^2=……=\delta_K^2。根据贝叶斯定理有:

对分子取对数转换,可见p_k(x)最大等价于下式最大:

(这里十分诚意地附上推导过程,没兴趣的可以直接跳过:)

所以只要找到令上式最大的k值即可。从上式可看出,一共有\mu\delta^2\pi这三种参数需要估计拟合。先验概率\pi_k可以根据业务知识进行预先估计,如果不行也可以直接以样本中第k类的样本在所有类的总样本中的比例当作先验概率,即

至于期望和方差,直接根据各类的观测值计算即可:

从上上式(我就不编号)可看出,\delta_k(x)x的线性函数,这也是LDA名为“线性”的原因。

2、多元线性判别分析

多元LDA由于涉及到多个特征变量,因此用协方差矩阵来代替一维方差(协方差矩阵的概念可参考延伸阅读文献3)。这里直接给结论,线性模型就变成:

除了方差变成协方差矩阵,x\mu也变成了向量。注意这里的x还是一次,仍然是线性模型。

二次判别分析(Quadratic Discriminant Analysis, QDA)

在LDA中假设所有的K类方差(或协方差矩阵)都相同,但这个假设有些严苛,如果放宽这个假设,允许每一类的观测都各自服从一个正态分布,协方差矩阵可以不同,LDA就变成了QDA。这里依然直接给公式:

可见\delta_k(x)x的二次函数,故名“二次判别分析”。

QDA与LDA的关系类似于多项式回归与线性回归的关系,本质上仍是偏差方差的权衡,这也是Machine Learning领域的一个核心问题。QDA比LDA光滑,偏差更小,但方差更大。那么它们的适用条件呢?

一般而言,如果训练观测数据量相对较少,LDA是一个比QDA更好的决策,降低模型的方差很有必要。相反地,如果训练集非常大,则更倾向于使用QDA,这时分类器的方差不再是一个主要关心的问题,或者说K类的协方差矩阵相同的假设是站不住脚的。

实战:用LDA(QDA)再次预测股票涨跌

这里为了方(tou)便(lan),依然使用延伸阅读文献4里的数据集,即ISLR包里的Smarket数据集。用不同方法做同样的事,其实也方便将不同方法进行对比。

> library(ISLR)
> library(MASS)
> attach(Smarket)
> lda.fit=lda(Direction~Lag1+Lag2,data=Smarket, subset=Year<2005)
> lda.fit
Call:
lda(Direction ~ Lag1 + Lag2, data = Smarket, subset = Year < 
    2005)

Prior probabilities of groups:
    Down       Up 
0.491984 0.508016 

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

Coefficients of linear discriminants:
            LD1
Lag1 -0.6420190
Lag2 -0.5135293

Prior probabilities of groups是先验概率,实际上就是各类别在训练集中的比例:

> table(Smarket[Year<2005,9])/nrow(Smarket[Year<2005,])

    Down       Up 
0.491984 0.508016

Group means是对每类每个变量计算平均,用来估计参数\mu。通过Group means矩阵可看出:当股票下跌时,前两天的投资回报率会趋向于正;当股票上涨时,前两天的投资回报率会趋向于负。Coefficients of linear discriminants则是线性模型的系数,说明当-0.642*Lag1-0.514*Lag2很大时,LDA分类器预测上涨;-0.642*Lag1-0.514*Lag2很小时,LDA分类器预测下跌。

> plot(lda.fit)

上面的图是对LDA模型的可视化,实际上它是训练集的-0.642*Lag1-0.514*Lag2分别在Down类和Up类的直方图。下面验证比较一下:

library(dplyr)
Lag1_1 <- Smarket %>% filter(Year<"2005", Direction=="Down") %>% select(Lag1)
Lag2_1 <- Smarket %>% filter(Year<"2005", Direction=="Down") %>% select(Lag2) 
Lag1_2 <- Smarket %>% filter(Year<"2005", Direction=="Up") %>% select(Lag1) 
Lag2_2 <- Smarket %>% filter(Year<"2005", Direction=="Up") %>% select(Lag2) 
lm_1 <- (-0.6420190*Lag1_1-0.5135293*Lag2_1)[,1]
lm_2 <- (-0.6420190*Lag1_2-0.5135293*Lag2_2)[,1]
par(mfrow=c(2,1))
hist(lm_1,breaks=16,freq = F,col="lightblue")
hist(lm_2,breaks=16,freq = F,col="lightblue")

可见直方图形状完全一致。

以上在训练集中对LDA模型的训练过程。下面在测试集中验证LDA模型。

> Smarket.2005=subset(Smarket,Year==2005)
> lda.pred=predict(lda.fit,Smarket.2005)
> class(lda.pred)
[1] "list"
> names(lda.pred)
[1] "class"     "posterior" "x"        
> data.frame(lda.pred)[1:5,]
     class posterior.Down posterior.Up         LD1
999     Up      0.4901792    0.5098208  0.08293096
1000    Up      0.4792185    0.5207815  0.59114102
1001    Up      0.4668185    0.5331815  1.16723063
1002    Up      0.4740011    0.5259989  0.83335022
1003    Up      0.4927877    0.5072123 -0.03792892
> table(lda.pred$class,Smarket.2005$Direction)

       Down  Up
  Down   35  35
  Up     76 106
> mean(lda.pred$class==Smarket.2005$Direction)
[1] 0.5595238

比较一下上一篇逻辑回归(延伸阅读文献4)中的结果:

> glm.fit=glm(Direction~Lag1+Lag2,data=Smarket,family=binomial, subset=train)
> glm.probs=predict(glm.fit,newdata=Smarket[!train,],type="response") 
> glm.pred=ifelse(glm.probs >0.5,"Up","Down")
> table(glm.pred,Direction.2005)
        Direction.2005
glm.pred Down  Up
    Down   35  35
    Up     76 106
> mean(glm.pred==Direction.2005)
[1] 0.5595238

LDA的结果与逻辑回归完全一致!以一个数据分析狮敏锐的第六感,我们可以大胆猜测:LDA与逻辑回归这两种算法可能有某种内在联系!

这里不做严谨的推导(深层的推导可参考延伸阅读文献6),只作一个简单的验证比较。为了简单起见,只考虑二分类问题,多分类问题可同理类推。
$$
log(\frac{p_1(x)}{1-p_1(x)})=log(\frac{p_1(x)}{p_2(x)})=log(p_1(x))-log(p_2(x))=x*\frac{\mu_1-\mu_2}{\sigma^2}-\frac{\mu_1^2-\mu_2^2}{2\sigma^2}+log(\frac{\pi_1}{\pi_2})
$$
可见这仍是关于x的线性函数,与逻辑回归形式一致!虽然形式一致,但逻辑回归的参数是通过极大似然法估计出来的,LDA的参数是概率密度函数计算出来的。

由于LDA与逻辑回归形只是拟合过程不同,因此二者所得的结果应该是接近的。事实上,这一情况经常发生,但并非必然。LDA假设观测服从每一类的协方差矩阵都相同的正态分布,当这一假设近似成立时,LDA效果比逻辑回归好;相反,若这个假设不成立,则逻辑回归效果比LDA好。

下面练习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.class=predict(qda.fit,Smarket.2005)$class
> table(qda.class,Direction.2005)
         Direction.2005
qda.class Down  Up
     Down   30  20
     Up     81 121
> mean(qda.class==Direction.2005)
[1] 0.5992063

可见QDA的准确率稍高于LDA。

参考文献

Gareth James et al. An Introduction to Statistical Learning.

延伸阅读

  1. 算法杂货铺——分类算法之朴素贝叶斯分类(Naive Bayesian classification)
  2. 算法杂货铺——分类算法之贝叶斯网络(Bayesian networks)
  3. 协方差的意义和计算公式
  4. 逻辑回归模型预测股票涨跌
  5. 机器学习笔记 线性判别分析(上)
  6. 机器学习笔记 线性判别分析(中)
posted on 2016-06-18 01:21  依然很拉风  阅读(10257)  评论(3编辑  收藏  举报