年初的时候希望今年多学一点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)