Stanford大学Statistical Learning 公开课——Classification

年初的时候希望今年多学一点python,但是没想到Stanford大学的公开课程这么有意思,提供免费教材及data,免费的教材写得通俗易懂:An Introduction to Statistical Learning with Applications in R。看名字就知道是用R来完成实验的,搞得我欲罢不能,花了些时间来学,实际上没看什么视频,主要看ppt和教程中的实验部分,有点意思,希望能跟完...

其中第1~3部分我很快略过了,从第4部分开始,记录一点笔记,纯流水帐。

Les4--Classification

对于我来说,更多的了解了有哪些方法可以实现分类,并知道如何用R包来实现分类。方法有以下四种:

  • Logistic Regression
  • Linear Discriminant Analysis (LDA)
  • Quadratic Discriminant Analysis (QDA)
  • K-Nearest Neighbors (KNN)

其中逻辑回归使用的函数是基础包中的glm,而LDA与QDA用法完全一致,分别是lda()和qda(),KNN相对复杂,knn()需要四个输入参数.几种分类方法的处理流程都非常接近,预测使用predict()函数,用scale()对数据进行标准化。好吧,后面就是一堆乱七八糟的代码了,留着以后方便查找,依葫芦画瓢...

  • glm()
  • lda()
  • qda()
  • knn()
  • predict()
  • scale()

首先加载需要的包

library(MASS)
library(ISLR)
library(glmnet)
library(class)

  • Logistic Regression

按颜色区分不同的种类

plot(iris,col = iris[,"Species"])

Logistic Regression

glm.fit=glm(Direction~Lag1+Lag2+Lag3+Lag4+Lag5+Volume,data=Smarket,family = binomial) summary(glm.fit) coef(glm.fit)

预测使用predict()函数

glm.probs <- predict(glm.fit,type="response") glm.probs[1:10] contrasts(Direction) glm.pred <- rep("Down",1250) glm.pred[glm.probs>0.5]="Up"

采用table函数生成一个统计表,对比预测效果

table(glm.pred,Direction)

优化模型,以2005年之前的数据训练,预测2005年的走势,然后对比预测和实际效果

train <- Smarket$Year<2005 Smarket.2005 <- Smarket[!train,] dim(Smarket.2005) Direction.2005 <- Direction[!train] 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>0.5]="Up" table(glm.pred,Direction.2005)

只用最好的两个参数Lag1和Lag2

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>0.5]="Up" table(glm.pred,Direction.2005)

预测效果要好一些,但也不理想,也许股市就是这样变化无穷没有规律?

给出两个实际的Lag1和Lag2数值,预测涨跌

predict(glm.fit,newdata = data.frame(Lag1=c(1.2,1.5,-3.0),Lag2=c(1.1,-0.8,2.5)),type="response")

  • Linear Discriminant Analysis and Quadratic Discriminant Analysis

Linear Discriminant Analysis

train <- Smarket$Year<2005 Smarket.2005 <- Smarket[!train,] 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) lda.pred$class table(lda.pred$class,Direction.2005)

Quadratic Discriminant Analysis

qda()与lda()用法完全一致

qda.fit <- qda(Direction~Lag1+Lag2,data=Smarket,subset=train)

  • K-Nearest Neighbors

K-Nearest Neighbors

KNN在class包中,需要四个输入参数,分别是训练样本矩阵,测试样本矩阵,训练样本结论向量以及K值。

train <- (Smarket$Year<2005) library(class) train.X <- cbind(Smarket$Lag1,Smarket$Lag2)[train,] test.X <- cbind(Smarket$Lag1,Smarket$Lag2)[!train,] train.Direction <- Smarket$Direction[train]

设定随机种子

set.seed(1) knn.pred <- knn(train.X,test.X,train.Direction,k=3) table(knn.pred,Smarket$Direction[!train])

  • An Application to Caravan Insurance Data

An Application to Caravan Insurance Data

library(ISLR) attach(Caravan)

用scale()对数据进行标准化

把定性数据(非数值型数据)剔除再标准化

all standardize variables are given a mean of zero and a standard deviation of one.

standardized.X <-scale(Caravan[,-86])

以前面1000个样本作为测试样本,其余作为训练样本

test <- 1:1000 train.X <- standardized.X[-test,] test.X <- standardized.X[test,] train.Y <- Caravan$Purchase[-test] test.Y <- Caravan$Purchase[test] set.seed(1) knn.pred <- knn(train.X,test.X,train.Y,k=5) table(knn.pred,test.Y)

用逻辑回归比较一下

glm.fit <- glm(Purchase~.,data=Caravan,family = binomial,subset=-test) glm.probs <- predict(glm.fit,Caravan[test,],type="response") glm.pred <- rep("No",1000) glm.pred[glm.probs>0.5]="Yes" table(glm.pred,test.Y)

glm.pred <- rep("No",1000) glm.pred[glm.probs>0.25] <- "Yes" table(glm.pred,test.Y)

发表评论

电子邮件地址不会被公开。 必填项已用*标注