通常,两个以上定性变量不能用线性回归建立模型
线性模型不能保证预测值在0,1之间
logistic function
odds 发生比
范围为0到 ∞
log-odds-logit
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.
使用极大似然法估计回归系数,对虚拟变量也适用
Logistic回归实质:发生概率除以没有发生概率再取对数。就是这个不太繁琐的变换改变了取值区间的矛盾和因变量自变量间的曲线关系。
定义 混淆现象
只用一个预测变量得到的结果可能与多个预测变量得到的结果完全不一样,如书中讲的student系数的例子,在这些因素具有相关性时更加明显。
优点:
贝叶斯定理
正态分布密度函数
把正态分布密度函数代入可得,贝叶斯分类器把观测分到使
最大的一组类别中。但实际上,这是一个理想模型,实际上很少使用,参数需要进行估计。
LDA使用以下参数估计
σ^2=1n−K∑Kk=1∑i:yi=k(xi−μ^k)2
π^k=nkn
其中n为观测总量, nk 为属于第k类的量, μk 为第k类观测的均值。
贝叶斯决策边界
其中,以上限制条件是假设LDA分类器假设所有分类的 σ相同,也就是均值不同,方差相同的正态分布
拓展到多元的情况,把多元高斯分布密度函数
代入可得
是一个矩阵形式。
灵敏度:被正确判别违约者的比例;
特异度:被正确判别没有违约者的比例。
Roc曲线
分类器的性能表现是通过 ROC 曲线下面的面积 (area under the ROC curve , AUC)来表示的,该曲线能够涵盖所有可能的阈值。一个理想的 ROC 曲线会紧贴左上角,所以 AUC 越大,分类器越好。
QDA分类器也是假设每一类观测都服从一个高斯分布,和LDA不同的是第一类的协方差矩阵可以不同.
假设要观测的第k类分布形如 X~N (μk,∑k) ,其中 ∑k 为其协方差矩阵,此时分类器把X = x分入使
最大的那一类。和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.
#########载入数据########
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")
##########载入上一节数据########
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)
##########载入上一节数据########
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%,目前最高
##########载入上一节数据########
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