分类一、前言
在分类之前,首要的任务就是确定标签。下图是数据的第一列的散点图,看见第一列即为分类标签,分别是 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)等算法进行分类。二、分类算法
- 支持向量机(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%,可见支持向量机在维度特别高时表现性能并不好。
- 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 次。
- 线性判别分析(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 所以不存在多重共线性。