R语言如何进行线性判别分析?
判别分析是一种有监督的训练方法。对于线性判别,先是将样本点投影到一维空间,也就是直线上,若效果不明显,就可以考虑增加一个维度,变成二维空间,如果还是不明显,就继续增加维度。
在R语言中,MASS软件包中的lda()是实现线性判别的核心函数。下面将通过一个简单实例来进行介绍。
1 读取数据集。
sz_data=read.csv("sz_data.csv",head=T,encoding="utf-8")
head(sz_data);dim(sz_data) #查看数据的前几行和数据维度
2 进行数据预处理。在实际应用中,如果数据有缺失值,需要先按照一定的方法先对缺失值进行处理。这里我们直接划分训练集和测试集,并且随机抽取70%的样本作为训练集。
n=0.7*nrow(sz_data) #作为训练集的样本量
sub_train=sample(nrow(sz_data),n)#随机抽取n个样本
data_train=sz_data[sub_train,-1]#训练集
data_test=sz_data[-sub_train,-1]#测试集
head(data_train);dim(data_train)
head(data_test);dim(data_test)
3 线性判别分析。没有MASS安装包的要先安装MASS包。
fit_lda1=lda(is_rise~.,data_train) #判别分析公式
names(fit_lda1) #查看lda()可给出的输出项名称
fit_lda1$prior #查看本次执行过程中所使用的先验概率
fit_lda1$counts #查看数据集data_train中各类别的样本量
fit_lda1$means #查看各变量在每一类别中的均值
fit_lda1 #输出判别分析的各项结果
plot(fit_lda1) #判别规则可视
从运行结果可以看出,本次线性判别将样本点投射到了一维空间(LD1)。结果中展示了先验概率、各类别样本量,以及各变量在每一类别中的均值。
图形中展示了is_rise取值为0和1时,分布具有一定的差异性。
4 对测试集进行预测。
pre_lda1=predict(fit_lda1,data_test)
data_test$pre_rise=pre_lda1$class #输出类别预测结果
head(data_test) #查看含有预测结果的数据
5 验证模型准确性。
table(data_test$is_rise,pre_lda1$class) #生成is_rise的预测值和实际值的混淆矩阵
error_lda1=sum(pre_lda1$class!=data_test$is_rise)/nrow(data_test);error_lda1#计算错误率
混淆矩阵中,对角线上的数据是被准确判别了的。计算出的错误率在15%以下,具有较高的准确性。