基于R语言的机器学习数据分析——以酒类数据为例

前言:本文只是针对R语言在数据分析方面做简单的展示,采用一些简单的机器学习方法对数据进行分析。

数据来源:数据来源于UCI机器学习数据库,里面包含大量的免费数据集,可以进行数据应用与分析;本文采用的数据是酒质数据,可以进行免费下载。
下载下来后有三个文件,两个csv文件分别是白酒和红酒的数据,names文件是对变量进行说明;每隔csv文件包含12个变量,其中前11个为数值型变量,也是自变量,最后一个quality变量为分类型变量,也是此数据集的因变量。本文仅采用白酒数据集进行分析。

数据导入:首先将数据导入到R中(我是先把csv文件另存为txt文件,在导入到R中,因为原始的CSV文件所有数据都放在一列的)

#导入数据
data <- read.csv("D:/Users/Administrator/Desktop/wine+quality/winequality-white.txt", sep=";")
summary(data)

数据预处理:summary()函数可以简单对每个变量进行分析,包含最大值、最小值、中位数等等
在这里插入图片描述
可以看到quality变量是数值型变量,我们要将其转化为分类变量,可以将6分以下的定为B级,6分及以上的定为A级,这样就是一个二分类变量了

for (i in 1:nrow(data)) {
if (data$quality[i]<6) {
  data$quality[i]="B"
} else {
  data$quality[i]="A"
}
}
#将quality变量转化为因子
data$quality<-factor(data$quality)

变量相关性:很多时候我们需要观察自变量之间的相关性,如果变量之间存在强相关关系,可能会引起多重共线性。下面展示变量间两两的相关关系。代码可参考这里

tdc<-cor (data[,-12], method="pearson")
corrplot(tdc)
corrplot(tdc, method = "ellipse", type = "upper",
         tl.col = "black", tl.cex = 0.8, tl.srt = 45,tl.pos = "lt")
corrplot(tdc, method = "number", type = "lower",
         tl.col = "n", tl.cex = 0.8, tl.pos = "n",
         add = T)

testRes = cor.mtest(data[,-12], method="pearson",conf.level = 0.95)
corrplot(tdc, method = "color",
         tl.col = "black", tl.cex = 0.8, tl.srt = 45,tl.pos = "lt",
         p.mat = testRes$p, diag = T, type = 'upper',
         sig.level = c(0.001, 0.01, 0.05), pch.cex = 1.2,
         insig = 'label_sig', pch.col = 'grey20', order = 'AOE')
corrplot(tdc, method = "number", type = "lower",
         tl.col = "n", tl.cex = 0.8, tl.pos = "n",order = 'AOE',
         add = T)

在这里插入图片描述
```````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````
在这里插入图片描述

```````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````
在这里插入图片描述
可以看出,还是有很多变量之间存在着较强的相关关系,那么在建模前要想办法消除这种关系。一般来说可以用特征选择,即选择相关变量中的某一些进行建模;或者进行降维(PCA,lasso等方法,ridge可以消除变量间的多重共线性)。这里的话我们采用PCA(主成分分析)进行降维处理。

PCA降维
主成分分析的原理这里就不多做赘述,具体可以参考这里
在进行PCA之前,要对数据进行标准化,以消除量纲之间的差距:

df<-data[,-12]
res.pca <- prcomp(df,scale. = T)
get_eig(res.pca)

在这里插入图片描述
最后一列代表的是累计方差贡献率
碎石图可以直观的看出成各分方差解释比例。

fviz_screeplot(res.pca, addlabels = TRUE, ylim = c(0, 40))

在这里插入图片描述

# 变量分别可视化
fviz_pca_var(res.pca, 
             col.var="contrib",   # 根据贡献度着色       
             gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),          
             repel = TRUE           
)

在这里插入图片描述
可以看出,前6个成分已经解释了8成以上变化,这是一个可以接受的范围,所以我们保留至前6个主成分。

对变换后的数据作为自变量

X<-res.pca$x[,1:6]
data1<-data.frame(X,data[,12])
colnames(data1)<-c(paste("X",1:6,sep = ""),"Y")

预测建模:原始数据经过降维处理后,就可以进行预测建模了,注意到这里是一个分类问题,常用的机器学习方法有logistics回归、决策树、随机森林、SVM等等。先要对数据进行划分,分为训练集和测试集,一般是7/3分或者8/2分,然后在训练集上训练模型,在测试集上验证模型的好坏。

# 设置随机数种子,以确保结果可重复
set.seed(123)
# 计算训练集和测试集的观测数量
train_size <- round(0.8 * nrow(data1))
test_size <- nrow(data1) - train_size

# 随机抽样选取训练集的行索引
train_rows <- sample(1:nrow(data1), train_size)

# 根据训练集的行索引获取训练集和测试集
train_set <- data1[train_rows, ]
test_set <- data1[-train_rows, ]

下面给出了使用常用的机器学习算法进行模型训练的方法:

# 1. 逻辑回归(Logistic Regression):
# 创建模型
model_glm <- glm(Y ~ ., data = train_set, family = binomial)

# 预测
predictions_glm <- predict(model_glm, newdata = test_set, type = "response")
# 将预测概率值映射为二分类结果
threshold <- 0.5 # 阈值
predicted_classes <- ifelse(predictions_glm >= threshold, "B", "A")

# 通过table函数计算混淆矩阵
confusion_matrix <- table(test_set$Y, predicted_classes)

# 打印混淆矩阵
print(confusion_matrix)


# 2. 决策树(Decision Tree):
# 创建模型
library(rpart)
model_dt <- rpart(Y~ ., data = train_set)

# 预测
predictions_dt <- predict(model_dt, newdata = test_set, type = "class")
# 通过table函数计算混淆矩阵
confusion_matrix <- table(test_set$Y, predictions_dt)

# 打印混淆矩阵
print(confusion_matrix)


# 3. 随机森林(Random Forest):
# 创建模型
library(randomForest)
model_rf <- randomForest(Y ~ ., data = train_set)

# 预测
predictions_rf <- predict(model_rf, newdata = test_set)
# 通过table函数计算混淆矩阵
confusion_matrix <- table(test_set$Y, predictions_rf)

# 打印混淆矩阵
print(confusion_matrix)


# 4. 支持向量机(Support Vector Machine,SVM):
# 创建模型
library(e1071)
model_svm <- svm(Y ~ ., data = train_set)

# 预测
predictions_svm <- predict(model_svm, newdata = test_set)
# 通过table函数计算混淆矩阵
confusion_matrix <- table(test_set$Y, predictions_svm)

# 打印混淆矩阵
print(confusion_matrix)

然后可以通过混淆矩阵计算出每个模型在测试集下的准确率、精确率、召回率等评价指标:
在这里插入图片描述
可以看出,svm的效果最为显著,准确率能达到8成以上;当然这只是最简单的模型比较方法,实际操作可能还需用到交叉验证等方法。

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值