ISLR第四章-logistic LDA QDA

ISLR第四章的理解

为什么线性回归不可用

通常,两个以上定性变量不能用线性回归建立模型
线性模型不能保证预测值在0,1之间

The Logistic Model

logistic function

p(X)=eβ0+β1X1+eβ0+β1X

odds 发生比

p(X)1p(X)=eβ0+β1X

范围为0到

log-odds-logit

log(p(X)1p(X))=β0+β1X

The left-hand side is called the log-odds or logit. We see that the logistic regression model (4.2) has a logit that is linear in X.

使用极大似然法估计回归系数,对虚拟变量也适用

(β0,β1)=i:yi=1p(xi)i:yi=0(1p(xi))

Logistic回归实质:发生概率除以没有发生概率再取对数。就是这个不太繁琐的变换改变了取值区间的矛盾和因变量自变量间的曲线关系。

Multiple Logistic Model

p(X)=eβ0+β1X1++βnXn1+eβ0+β1X1++βnXn

定义 混淆现象
只用一个预测变量得到的结果可能与多个预测变量得到的结果完全不一样,如书中讲的student系数的例子,在这些因素具有相关性时更加明显。

Linear Discriminant Analysis

优点:

  1. 当类别的区分度很高的时候,logistic regress的参数不稳定,而这点linear Discriminant Analysis不存在。我的理解是0-1的中间区域数据分布不均匀,中间有很大空白导致的。
  2. 如果样本量n比较小,并且服从正态分布,linear Discriminant Analysis更稳定,也就是logistic不适用,我的理解是正态分布概率密度函数是已知的,这样更好计算概率。
  3. 分类结果多于两类的情况,linear Discriminant Analysis应用更加普遍。

运用贝叶斯定理进行分类

贝叶斯定理

px(X)=Pr(Y=k|X=x)=πkfk(x)Ki=1πifi(x)

正态分布密度函数

fk(x)=12πσexp(12σ2k(xμk)2)

把正态分布密度函数代入可得,贝叶斯分类器把观测分到使

δk(x)=xμkσ2μ2k2σ2+logπk

最大的一组类别中。但实际上,这是一个理想模型,实际上很少使用,参数需要进行估计。
LDA使用以下参数估计


μ^k=1ni:yi=kxi

σ^2=1nKKk=1i:yi=k(xiμ^k)2

π^k=nkn

其中n为观测总量, nk 为属于第k类的量, μk 为第k类观测的均值。
贝叶斯决策边界

x=μ1+μ22

其中,以上限制条件是假设LDA分类器假设所有分类的 σ

拓展到多元的情况,把多元高斯分布密度函数

f(x)=1(2π)p/2||1/2exp(12(xμ)T1(xμ))

代入可得

δk(x)=xT1μk12μTk1μk+logπk

是一个矩阵形式。

灵敏度:被正确判别违约者的比例;
特异度:被正确判别没有违约者的比例。

Roc曲线
分类器的性能表现是通过 ROC 曲线下面的面积 (area under the ROC curve , AUC)来表示的,该曲线能够涵盖所有可能的阈值。一个理想的 ROC 曲线会紧贴左上角,所以 AUC 越大,分类器越好。

QDA

QDA分类器也是假设每一类观测都服从一个高斯分布,和LDA不同的是第一类的协方差矩阵可以不同.
假设要观测的第k类分布形如 X~N (μk,k) ,其中 k 为其协方差矩阵,此时分类器把X = x分入使

δk(x)=12xT1kx+xT1kμk12μTk1kμk12log|k|+logπk

最大的那一类。和LDA不同,这是一个二次和形式。

当有p个变量时,预测协方差矩阵需要p(p+1)/2个参数,QDA因为每个分类允许协方差矩阵不同,所以需要的参数个数为Kp(p+1)/2个参数。

当数据量较少时,LDA比QDA更好用。这一点在LDA和logistic对比里有提到。

分类方法的比较

These six examples illustrate that no one method will dominate the others in every situation. When the true decision boundaries are linear, then the LDA and logistic regression approaches will tend to perform well. When the boundaries are moderately non-linear, QDA may give better results.
Finally, for much more complicated decision boundaries, a non-parametric
approach such as KNN can be superior. But the level of smoothness for a
non-parametric approach must be chosen carefully.

实验

Logistic Regression

#########载入数据########
library(ISLR)
names(Smarket)
dim(Smarket)
summary(Smarket)
paires(Smarket)
cor(Smarket[,-9])                   #计算相关系数
attach(Smarket)
plot(Volume)
#########载入数据结束########

#########logistic regression######### 


# glm函数用于拟合广义线性模型,其中就包括logistic regression
glm.fit =glm( Direction~Lag1+ Lag2+ Lag3+Lag4+ Lag5+Volume ,
                 data=Smarket , family = binomial )
summary(glm.fit)

coef(glm.fit)                       #获取拟合模型的系数
summary(glm.fit)$coef
summary(glm.fit)$coef[,4]

# 使用predict()函数预测概率,type="response"表示输出概率P(Y=1|X)
glm.probs = predict(glm.fit, type="response")
glm.probs[1:10]                     #输出前10个预测概率
contrasts(Direction)                #创建虚变量,1表示UP

glm.pred = rep("Down", 1250)        #建立一个由1250个Down元素组成的向量
# glm.pred
glm.pred[glm.probs >.5]="Up"        #概率超过0.5的设置为Up


table(glm.pred, Direction)          #输出混淆矩阵
mean(glm.pred==Direction)
# Direction
# glm.pred Down  Up
# Down  145 141
# Up    457 507
#以上训练都是在同一个数据集上进行的



train=(Year<2005)                   #建立一个2001-2004年之间的观测数据
#train
Smarket.2005 = Smarket[!train,]     #把2005年前的设置为TRUE,2005年后的设置为FALSE
dim(Smarket.2005)
Direction.2005 = Direction[!train]
#Direction.2005

#使用新数据重新训练
glm.fit =glm ( Direction~Lag1+ Lag2+ Lag3+Lag4+ Lag5+Volume , data=Smarket , family = binomial , subset =train )
glm.probs = predict (glm.fit , Smarket.2005 , type ="response")

glm.pred = rep("Down",252)
glm.pred[glm.probs>.5]="Up"

table(glm.pred, Direction.2005)
mean(glm.pred== Direction.2005)     #输出正确率
mean(glm.pred!=Direction.2005)      #输出错误率 0.52
#结果并不理想

#从上面的结果可以看出,变量Lag1的p值最小,因此,去除其他变量,重新拟合模型
glm.fit =glm ( Direction~Lag1+Lag2 , data=Smarket ,family =binomial ,subset = train )
glm.probs = predict (glm.fit , Smarket.2005 , type ="response")
glm.pred = rep("Down",252)
glm.pred[glm.probs>.5]="Up"

table(glm.pred, Direction.2005)
mean(glm.pred== Direction.2005)     #输出正确率

#使用特定数值进行预测
predict (glm.fit , newdata = data.frame ( Lag1=c (1.2 ,1.5) ,Lag2=c(1.1 , -0.8) ),type ="response")

LDA

##########载入上一节数据########
library(ISLR)
#dim(Smarket)
contrasts(Direction)                #创建虚变量,1表示UP

train=(Year<2005)                   #建立一个2001-2004年之间的观测数据
#train
Smarket.2005 = Smarket[!train,]     #把2005年前的设置为TRUE,2005年后的设置为FALSE
dim(Smarket.2005)
Direction.2005 = Direction[!train]

#lda函数在MASS库中
library (MASS )


#对2005年以前的数据进行拟合
lda.fit =lda ( Direction~Lag1+Lag2 , data=Smarket ,subset = train )
#lda.fit
#plot(lda.fit)


lda.pred= predict(lda.fit , Smarket.2005)
names (lda.pred)
#predict函数返回一个三元列表
#   class:预测
#   posterior:后验概率
#   x:


lda.class =lda.pred$class
table (lda.class , Direction.2005)
mean(lda.class==Direction.2005)

sum(lda.pred$posterior[,1]>=.5)
sum(lda.pred$posterior[,1]<.5)


lda.pred$posterior[1:20,1]
lda.class[1:20]

sum(lda.pred$posterior[,1]>.9)

QDA

##########载入上一节数据########
library(ISLR)
#dim(Smarket)
contrasts(Direction)                #创建虚变量,1表示UP

train=(Year<2005)                   #建立一个2001-2004年之间的观测数据
#train
Smarket.2005 = Smarket[!train,]     #把2005年前的设置为TRUE,2005年后的设置为FALSE
dim(Smarket.2005)
Direction.2005 = Direction[!train]

#qda函数在MASS库中
library (MASS )


#使用qda进行拟合
qda.fit =qda( Direction~Lag1+Lag2 , data=Smarket ,subset = train )
#qda.fit

qda.class = predict (qda.fit , Smarket.2005) $class
table (qda.class , Direction.2005)
mean(qda.class==Direction.2005)
# 正确率60%,目前最高

KNN

##########载入上一节数据########
library(ISLR)
#dim(Smarket)
contrasts(Direction)                #创建虚变量,1表示UP

train=(Year<2005)                   #建立一个2001-2004年之间的观测数据
#train
Smarket.2005 = Smarket[!train,]     #把2005年前的设置为TRUE,2005年后的设置为FALSE
#dim(Smarket.2005)
Direction.2005 = Direction[!train]

#KNN
library(class)

train.X = cbind(Lag1, Lag2)[train,]
test.X = cbind(Lag1, Lag2)[!train,]
train.Direction = Direction[train]

set.seed(1)
knn.pred = knn(train.X, test.X, train.Direction, k=1)
table(knn.pred, Direction.2005)
# k=1时,正确率50%

knn.pred = knn(train.X, test.X, train.Direction, k=3)
table(knn.pred, Direction.2005)
# k=3,正确率53%

最后一个应用,代码报错

Error: object ‘Purchase’ not found

相关链接

LDA QDA http://blog.csdn.net/g090909/article/details/50197331
高斯判别分布 http://blog.csdn.net/hujingshuang/article/details/46357543

你可能感兴趣的:(machine,learning)