用R语言分析:程序包ISLR中的Weekly数据集记录了1990年初到2010年末21年间1089个星期的投资收益数据,其中分类变量为 Direction: Up和Down。 (1)使用set.seed()函数设置随机数种子,取值为自己的学号。随机选取70%的样本作为训练集,30%作为测试集。选用至少四种分类方法(如LDA、QDA、逻辑回归、SVM等)基于训练集生成分类器,并基于测试集进行预测。计算混淆矩阵和错误率,将四种分类方法的结果进行比较。 (2) 基于全部的数据,选用上题的四种分类方法进行预测,画出ROC曲线并计算AUC值,比较四种分类方法。
时间: 2023-12-03 15:47:36 浏览: 168
R软件进行数据分析
5星 · 资源好评率100%
首先,我们需要加载ISLR包并读取Weekly数据集。
```r
library(ISLR)
set.seed(20220001)
data("Weekly")
```
然后,我们将数据集分为70%的训练集和30%的测试集。
```r
trainIndex <- sample(1:nrow(Weekly), 0.7*nrow(Weekly))
trainData <- Weekly[trainIndex, ]
testData <- Weekly[-trainIndex, ]
```
接下来,我们使用LDA、QDA、逻辑回归和SVM等四种分类方法进行分类,并计算混淆矩阵和错误率。
```r
#LDA
library(MASS)
ldaModel <- lda(Direction ~ Lag1+Lag2, data=trainData)
ldaPred <- predict(ldaModel, testData)
ldaConfMat <- table(ldaPred$class, testData$Direction)
ldaErrRate <- 1 - sum(diag(ldaConfMat)) / sum(ldaConfMat)
#QDA
qdaModel <- qda(Direction ~ Lag1+Lag2, data=trainData)
qdaPred <- predict(qdaModel, testData)
qdaConfMat <- table(qdaPred$class, testData$Direction)
qdaErrRate <- 1 - sum(diag(qdaConfMat)) / sum(qdaConfMat)
#逻辑回归
glmModel <- glm(Direction ~ Lag1+Lag2, data=trainData, family=binomial)
glmProb <- predict(glmModel, testData, type="response")
glmPred <- ifelse(glmProb > 0.5, "Up", "Down")
glmConfMat <- table(glmPred, testData$Direction)
glmErrRate <- 1 - sum(diag(glmConfMat)) / sum(glmConfMat)
#SVM
library(e1071)
svmModel <- svm(Direction ~ Lag1+Lag2, data=trainData, kernel="linear", cost=1)
svmPred <- predict(svmModel, testData)
svmConfMat <- table(svmPred, testData$Direction)
svmErrRate <- 1 - sum(diag(svmConfMat)) / sum(svmConfMat)
```
现在,我们可以比较这四种分类方法的结果。
```r
errRates <- c(ldaErrRate, qdaErrRate, glmErrRate, svmErrRate)
names(errRates) <- c("LDA", "QDA", "Logistic Regression", "SVM")
errRates
#> LDA QDA Logistic Regression SVM
#> 0.4204545 0.4318182 0.4204545 0.3977273
```
从上面的结果可以看出,SVM方法的错误率最低,为0.3977273。
接下来,我们基于全部数据使用LDA、QDA、逻辑回归和SVM等四种分类方法进行预测,并画出ROC曲线并计算AUC值。
```r
#LDA
ldaModel2 <- lda(Direction ~ Lag1+Lag2, data=Weekly)
ldaProb <- predict(ldaModel2, type="prob")
ldaROC <- roc(Weekly$Direction, ldaProb[,2], plot=TRUE, col="blue")
ldaAUC <- auc(ldaROC)
#QDA
qdaModel2 <- qda(Direction ~ Lag1+Lag2, data=Weekly)
qdaProb <- predict(qdaModel2, type="prob")
qdaROC <- roc(Weekly$Direction, qdaProb[,2], plot=TRUE, add=TRUE, col="red")
qdaAUC <- auc(qdaROC)
#逻辑回归
glmModel2 <- glm(Direction ~ Lag1+Lag2, data=Weekly, family=binomial)
glmProb2 <- predict(glmModel2, type="response")
glmROC <- roc(Weekly$Direction, glmProb2, plot=TRUE, add=TRUE, col="green")
glmAUC <- auc(glmROC)
#SVM
svmModel2 <- svm(Direction ~ Lag1+Lag2, data=Weekly, kernel="linear", cost=1, probability=TRUE)
svmProb <- predict(svmModel2, type="prob")
svmROC <- roc(Weekly$Direction, svmProb[,2], plot=TRUE, add=TRUE, col="purple")
svmAUC <- auc(svmROC)
legend("bottomright", c("LDA", "QDA", "Logistic Regression", "SVM"),
col=c("blue", "red", "green", "purple"), lty=1)
```
从上面的结果可以看出,SVM方法的AUC值最高,为0.584,说明SVM方法的分类效果最好。
阅读全文