R语言分类(SVM KNN LDA等)与回归代码+原始数据+分析报告

分类一、前言

在分类之前,首要的任务就是确定标签。下图是数据的第一列的散点图,看见第一列即为分类标签,分别是 0~9 这是个整数。

 图 1 数据标签值的探究  在具体分类之前,我首先了解了一下数据结。一共有 2007 行训练例子,256 个维度。对于维度比较大的数据,在分类之前降低维度是十分有意义的。在降低数据集维度的同时,保证其中包含的主要信息是相似的。一方面,降低维度,能进行数据压缩,减少数据存储所需空间,另一方面,也能减少计算所需时间。维度少则计算量减少,还可以使用一些不适合对高纬度数据使用的算法。此外,也有助于去除噪声,提高模型性能。去除了不必要的冗余特征,将数据维度减少到

2 维或者 3 维,进行可视化。

 降低数据维度的算法有很多中,其中主成分分析算法是一常用的降低数据维度算法。其核心思想是将 n 维特征映射到 k 维上(k < n),将这 k 维成为主元,是重新构造出来的 k 维特征(如下图所示)。

 

 图 2 主成分分析示意图 

对数据进行主成分分析可得如下结构,可以看到,大于第 20 列的属性对结果的影响已经非常非常小。

 

图 2 主成分分析结果

对于多分类问题, Logistic 回归算法不适用于多分类,因此采用支持向量机(Support Vector Machine,SVM),k 近邻算法(k-Nearest Neighbor,KNN)以及线性判别分析(Linear Discriminant Analysis,LDA)等算法进行分类。二、分类算法

  1. 支持向量机(Support Vector Machine,SVM)

图 3 以前两个属性值作为特征的分类尝试,可见很难分离。

# SVM 支持向量机

install.packages("e1071")   library(e1071)  

# 训练模型

model <- svm(V1 ~., data = train.data) summary(model)

# 使用训练好的模型预测

pred <- predict(model, test.data) mean(abs(pred - test.data$V1) <= 0.5) 

# 预测准确率为 63.2%

 

图 4 核心 R 程序及模型参数。

 

由于属性多,维度高,很难可视化,因此对训练好的模型参数做了观察:通过 summary 函数可以得到关于模型的相关信息,其中,SVM-Type 项目说明本模型的类别为 eps-regression 分类器。SVM-Kernel 项目说明本模型所使用的核函数为高斯内积函数且核函数中参数 gamma 的取值为 0.00390625。而且我们还可以看到,模型找到了 3527 个支持向量.。最终模型预测准确率为 63.2%,可见支持向量机在维度特别高时表现性能并不好。

 

 

  1. k 近邻算法(k-Nearest Neighbor,KNN)

 在 k 近邻算法中,当训练集、最近邻值 k、距离度量、决策规则等确定下来时,整个算法实际上是利用训练集把特征空间划分成一个个子空间,训练集中的每个样本占据一部分空间。对最近邻而言,当测试样本落在某个训练样本的领域内,就把测试样本标记为这一类。

 

# KNN 近邻分类

library(class)

set.seed(3) ## 设立随机种子

# K 个近邻投票,欧氏距离

pred <- knn(as.matrix(train.data[,-1]) , as.matrix(test.data[,-1]) , train.data$V1 , k = 7) table <- table(pred , test.data$V1) mean(pred == test.data$V1)

#预测准确率为 94.17.0%

install.packages("gmodels")  

library(gmodels)

CrossTable(x = test.data$V1, y = pred, prop.chisq = F)

 

 

5 k 近邻算法核心 R 代码以及原理示意图

创建双向交叉表(gmodels 包的 CrossTable()函数)来评估模型的性能

 

6 双向交叉表评估模型的性能

上图左上角的格子表示真阴性(True Negative),这里表示分类器结果和实际结果一致认为是良性的情况,如 0 被预测为 0 的有 354 次,被预测为 2 的有 2 次。

 

  1. 线性判别分析(Linear Discriminant Analysis,LDA)

 因为 LDA 是二类分类器,需要推广到多类的问题。常用的方法 one-vs-all 方法训练 K 个分类器。

# LDA方法

library(MASS)

model <- lda(V1 ~ . , data = train.data) model

pred <- predict(model , test.data) table(pred$class , test.data$V1) mean(pred$class == test.data$V1) barplot(table)

#预测准确率为 88.54%

 

7 线性判别分析算法核心 R 代码以及原理示意图每个判别函数的百分比如下图:

 图 8 每个判别函数的百分比关联矩阵以及由 Barplot()得到条形图如下:

 

 

图 9 关联矩阵以及由 Barplot()得到条形图

 三、总结

 对比三种分类算法可知,k 近邻算法得到的结果准确率最高,为 94.17.0%,而线性判别分析分类得到的模型准确率为 88.54%;SVM得到的模型准确率最差,为 63.2%。 

回归分析数据描述:数据集:swiss,瑞士生育率于经济指标,结构如下:

 相关分析如下:

 回归诊断如下图所示:

 

 

我们可以明显的看出瑞士生育率与教育和考试成负相关,相关性较大,将它们的关系可视化:

 

误差的独立性,线性,同方差性如下:

 综合检验结果如下:

 

检验多重共线性:根号下 vif>2 则表明有多重共线性, 由下图可知都小于 2 所以不存在多重共线性。

 

  • 24
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

用数据说话用数据决策

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值