logisticregression 参数_分类问题(2):logistic regression

以下内容主要参考:

《An introduction to statistical learning-with applications in R》James et al.

《统计学习导论——基于R语言的应用》王星 等译

【逻辑斯谛回归(logistic regression)】

逻辑斯谛回归对响应变量Y属于哪一类的概率建模,而不是直接对响应变量Y建模。逻辑斯谛函数(logistic function):

c6d58924494a816f7b4c47e41888bcb0.png

对任意X,p(X)的输出结果都在0-1之间。

a6b406b929e9cc817f3591a5c14ea056.png

在一个线型模型中,B1表示X值每增加一个单位时Y的变化量。而在逻辑斯谛回归中,X每增加一个单位,对数发生比的变化为B1。

其中系数B0和B1是未知的。必须通过有效的训练数据来估计这些参数。一般使用极大似然方法估计逻辑斯谛回归模型的系数。

1.data

ISLR包中的smarket数据。该数据集里包括了2001年年初至2005年年末1250天里S&P500股票指数的投资回报率。数据中记录了过去5个交易日中的每个交易日的投资回报率,从Lag1到Lag5,同时也记录了volume(前一日的股票成交量,单位为十亿),today(当日的投资回报率)以及direction(走向,up或者down)。

> library(ISLR)> names(Smarket)[1] "Year"      "Lag1"      "Lag2"      "Lag3"      "Lag4"      "Lag5"      "Volume"    "Today"     "Direction"

2. 数据的描述性统计分析

  • 维度:1250*9

  • summary给出描述性统计分析,最大最小值,分位数等信息。

> dim(Smarket)[1] 1250    9> summary(Smarket)      Year           Lag1                Lag2                Lag3                Lag4           Min.   :2001   Min.   :-4.922000   Min.   :-4.922000   Min.   :-4.922000   Min.   :-4.922000   1st Qu.:2002   1st Qu.:-0.639500   1st Qu.:-0.639500   1st Qu.:-0.640000   1st Qu.:-0.640000   Median :2003   Median : 0.039000   Median : 0.039000   Median : 0.038500   Median : 0.038500   Mean   :2003   Mean   : 0.003834   Mean   : 0.003919   Mean   : 0.001716   Mean   : 0.001636   3rd Qu.:2004   3rd Qu.: 0.596750   3rd Qu.: 0.596750   3rd Qu.: 0.596750   3rd Qu.: 0.596750   Max.   :2005   Max.   : 5.733000   Max.   : 5.733000   Max.   : 5.733000   Max.   : 5.733000        Lag5              Volume           Today           Direction  Min.   :-4.92200   Min.   :0.3561   Min.   :-4.922000   Down:602   1st Qu.:-0.64000   1st Qu.:1.2574   1st Qu.:-0.639500   Up  :648   Median : 0.03850   Median :1.4229   Median : 0.038500              Mean   : 0.00561   Mean   :1.4783   Mean   : 0.003138              3rd Qu.: 0.59700   3rd Qu.:1.6417   3rd Qu.: 0.596750              Max.   : 5.73300   Max.   :3.1525   Max.   : 5.733000

3. 变量之间的相关性分析

  • cor()函数

  • direction是定性的,所以要去掉这一列再计算相关性

> pairs(Smarket)> # cor(Smarket)#direction是定性的,所以出错> cor(Smarket[,-9])#当前回报率与之前回报率相关性几乎为0             Year         Lag1         Lag2         Lag3         Lag4         Lag5      Volume        TodayYear   1.00000000  0.029699649  0.030596422  0.033194581  0.035688718  0.029787995  0.53900647  0.030095229Lag1   0.02969965  1.000000000 -0.026294328 -0.010803402 -0.002985911 -0.005674606  0.04090991 -0.026155045Lag2   0.03059642 -0.026294328  1.000000000 -0.025896670 -0.010853533 -0.003557949 -0.04338321 -0.010250033Lag3   0.03319458 -0.010803402 -0.025896670  1.000000000 -0.024051036 -0.018808338 -0.04182369 -0.002447647Lag4   0.03568872 -0.002985911 -0.010853533 -0.024051036  1.000000000 -0.027083641 -0.04841425 -0.006899527Lag5   0.02978799 -0.005674606 -0.003557949 -0.018808338 -0.027083641  1.000000000 -0.02200231 -0.034860083Volume 0.53900647  0.040909908 -0.043383215 -0.041823686 -0.048414246 -0.022002315  1.00000000  0.014591823Today  0.03009523 -0.026155045 -0.010250033 -0.002447647 -0.006899527 -0.034860083  0.01459182  1.000000000

根据上面的结果可知,前几日的投资回报率与当日的投资回报率相关系数接于0。这也就是说当前的投资回报率与先前的投资回报率之间的相关性很小。唯一一对强相关的关系是year和volume。我们通过绘制volume的散点图发现volume呈现出增长趋势,也就是说2001-2005年平均每日股票成交量在增长。

a2357358af9f9573c765043473dfe196.png

4. logistic regression

4.1. 系数估计

通过LAG1到LAG5和volume拟合logistic regression model来预测direction。

glm()函数用于拟合广义线性模型(GLM),其中包含了logistic regression model.

glm函数的用法与lm函数类似,不同之处在于必须输入参数family=binomial,该命令的功能是请求R软件执行logistic回归,不使用其他类型的广义线性模型。

结果中最小的p值是Lag1的系数,预测变量负的系数表明如果市场昨天的投资回报率是正的,那么今日的市场可能不会上涨。然而,p值为0.145仍然是比较大的,远远大于0.05,所以没有充分的证据表明Lag1和direction之间有确切的关联性。

> glm.fits=glm(Direction~Lag1+Lag2+Lag3+Lag4+Lag5+Volume,data=Smarket,family=binomial)> #glm函数用于拟合广义线性模型,family=binomial> summary(glm.fits)Call:glm(formula = Direction ~ Lag1 + Lag2 + Lag3 + Lag4 + Lag5 +     Volume, family = binomial, data = Smarket)Deviance Residuals:    Min      1Q  Median      3Q     Max  -1.446  -1.203   1.065   1.145   1.326Coefficients:             Estimate Std. Error z value Pr(>|z|)(Intercept) -0.126000   0.240736  -0.523    0.601Lag1        -0.073074   0.050167  -1.457    0.145Lag2        -0.042301   0.050086  -0.845    0.398Lag3         0.011085   0.049939   0.222    0.824Lag4         0.009359   0.049974   0.187    0.851Lag5         0.010313   0.049511   0.208    0.835Volume       0.135441   0.158360   0.855    0.392(Dispersion parameter for binomial family taken to be 1)    Null deviance: 1731.2  on 1249  degrees of freedomResidual deviance: 1727.6  on 1243  degrees of freedomAIC: 1741.6Number of Fisher Scoring iterations: 3

调用coef函数获得拟合模型的系数,同时也可用summary来获取拟合模型的其他方面的信息,比如系数的p值等。

> coef(glm.fits)#用于输出拟合模型系数 (Intercept)         Lag1         Lag2         Lag3         Lag4         Lag5       Volume -0.126000257 -0.073073746 -0.042301344  0.011085108  0.009358938  0.010313068  0.135440659 > summary(glm.fits)$coef                Estimate Std. Error    z value  Pr(>|z|)(Intercept) -0.126000257 0.24073574 -0.5233966 0.6006983Lag1        -0.073073746 0.05016739 -1.4565986 0.1452272Lag2        -0.042301344 0.05008605 -0.8445733 0.3983491Lag3         0.011085108 0.04993854  0.2219750 0.8243333Lag4         0.009358938 0.04997413  0.1872757 0.8514445Lag5         0.010313068 0.04951146  0.2082966 0.8349974Volume       0.135440659 0.15835970  0.8552723 0.3924004> summary(glm.fits)$coef[,4](Intercept)        Lag1        Lag2        Lag3        Lag4        Lag5      Volume   0.6006983   0.1452272   0.3983491   0.8243333   0.8514445   0.8349974   0.3924004

4.2. 结果预测

  • predict函数用来预测在给定预测变量下市场上涨的概率。

  • 选项type="response"是明确告诉R输出概率P(Y=1|X),而不必输出其他信息,比如分对数等信息。

  • 默认输出的是市场上涨的概率,因为contrasts函数表明R创建了一个哑变量,1代表up上涨。

> glm.probs=predict(glm.fits,type="response")#type="response"表示明确输出概率> glm.probs[1:10]        1         2         3         4         5         6         7         8         9        10 0.5070841 0.4814679 0.4811388 0.5152224 0.5107812 0.5069565 0.4926509 0.5092292 0.5176135 0.4888378 > contrasts(Direction)#创建哑变量     UpDown  0Up    1

为了预测特定某一天市场上涨还是下跌,必须将预测的概率转换为类别。下面两行命令建立了一个类向量的预测,以预测的市场上涨概率比0.5大还是小为依据。

创建一个1250个down元素组成的向量,将预测市场上涨率超过0.5的元素转变为up。

  • table()函数可产生混淆矩阵来判断有多少观测被正确或者错误地分类了。

  • 混淆矩阵中对角线元素表示正确预测,非对角线元素代表错误分类预测。

  • mean()函数可以计算正确预测的比例。

所以结果表明正确预测了市场52.2%的时间的动向变化。

> glm.pred=rep("Down",1250)> glm.pred[glm.probs>.5]="Up"> table(glm.pred,Direction)#混淆矩阵        Directionglm.pred Down  Up    Down  145 141    Up    457 507> (507+145)/1250[1] 0.5216> mean(glm.pred==Direction)#表示正确预测的比例[1] 0.5216

4.3. training and test

这个预测值是拟合logistic模型对建模所使用的的数据集的预测值。但是,实践中,我们对拟合模型所用数据上的模型运用效果不感兴趣,而是对未来日子里不确定的动态更感兴趣。

因此,我们用2001-20014年之间的观测做训练集train,余下的2005年数据做测试集test。

!是对布尔向量中所有元素取反。

!=表示不等,所以最后一行命令是计算测试错误率。

test data上的预测正确率为0.48,错误率为0.52,这个错误率很高!这是因为,一般很少用前几日的投资回报率来预测未来市场的表现。这个例子只是为了演示R中logistic regression的用法。
> train=(Year<2005)> Smarket.2005=Smarket[!train,]> train=(Year<2005)> Smarket.2005=Smarket[!train,]> dim(Smarket.2005)[1] 252   9> Direction.2005=Direction[!train]> glm.fits=glm(Direction~Lag1+Lag2+Lag3+Lag4+Lag5+Volume,data=Smarket,family=binomial,subset=train)> glm.probs=predict(glm.fits,Smarket.2005,type="response")> glm.pred=rep("Down",252)> glm.pred[glm.probs>.5]="Up"> table(glm.pred,Direction.2005)        Direction.2005glm.pred Down Up    Down   77 97    Up     34 44> mean(glm.pred==Direction.2005)[1] 0.4801587> mean(glm.pred!=Direction.2005)[1] 0.5198413

因为原始的logistic regression中,lag1和lag2的p值最小,表现出了最佳的预测能力。所以我们使用lag1和lag2来建立logistic regerssion model。

predict()函数预测新的给定预测变量的direction。

> glm.fits=glm(Direction~Lag1+Lag2,data=Smarket,family=binomial,subset=train)> glm.probs=predict(glm.fits,Smarket.2005,type="response")> glm.pred=rep("Down",252)> glm.pred[glm.probs>.5]="Up"> table(glm.pred,Direction.2005)        Direction.2005glm.pred Down  Up    Down   35  35    Up     76 106> mean(glm.pred==Direction.2005)[1] 0.5595238> 106/(106+76)[1] 0.5824176> predict(glm.fits,newdata=data.frame(Lag1=c(1.2,1.5),Lag2=c(1.1,-0.8)),type="response")        1         2 0.4791462 0.4960939

扫码关注,交流分享~~~

b9c0a2c39293054352ace5f820507ada.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值