测试概述
该实验的主要目的是测试LDA(Linear Discriminant Analysis,线性判别分析)和PCA(Principal components analysis,主成分分析)的降维效果(主要是训练时间)。训练模型使用SVM算法。降维(PCA LDA)和训练(SVM)均是调用python的sklearn库,所有代码都在程序中给出。
每次使用相同数据集,通过三种不同方式测试,分别是直接训练、PCA降维后训练、LDA降维后训练。
测试环境
操作系统 | win10 64位 |
CPU | AMD Ryzen 5 2600x 6-core 3.60GHz |
内存 | 16GB |
IDE/编辑器 | PyCharm |
Python版本 | 3.6 |
LDA_test.py代码
import numpy as np
from pandas import read_csv
import time
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.decomposition import PCA
from sklearn.svm import SVC
from sklearn import preprocessing
import warnings
warnings.filterwarnings("ignore")
def sklearn_SVM(X, y, X_t, y_t):
"""
sklearn的SVM
:param X: 训练集x
:param y: 训练集y
:param X_t: 测试集x
:param y_t: 测试集y
:return:
"""
clf = SVC() # C=1,kernel='rbf',gamma=auto
t1 = time.time()
clf.fit(X, y)
t2 = time.time()
score = clf.score(X_t, y_t)
print("训练时间:%fs" % (t2 - t1))
print("支持向量:", clf.n_support_)
print("准确率:", score)
def sklearn_PCA(X, y):
"""
sklearn的PCA
:param X: 样本集x
:param y: 样本集y
:return: 降维后x
"""
pca = PCA(n_components=1) # n_components 降至的维数
X_new = pca.fit_transform(X, y)
return X_new
def sklearn_LDA(X, y):
"""
sklearn的LDA
:param X: 样本集x
:param y: 样本集y
:return: 降维后x
"""
lda = LinearDiscriminantAnalysis(n_components=1) # n_components 降至的维数 [1,n_classes-1)对于2分类问题只能降到1维
X_new = lda.fit_transform(X, y)
return X_new
if __name__ == '__main__':
path = "../dataset_DR/" # 数据集路径
dataset = "a5a.csv" # 训练集
dataset_t = "a5a.t.csv" # 测试集
print("当前训练集:", dataset)
data = read_csv(path + dataset, header=-1).values
data_t = read_csv(path + dataset_t, header=-1).values
print("训练集大小:", data.shape)
print("测试集大小:", data_t.shape)
X = data[:, :-1]
y = data[:, -1]
X_t = data_t[:, :-1]
y_t = data_t[:, -1]
positive_point = y.tolist().count(1)
negative_point = y.tolist().count(-1)
print("负类:", negative_point)
print("正类:", positive_point)
# 归一化
x = preprocessing.MinMaxScaler().fit_transform(X)
x_t = preprocessing.MinMaxScaler().fit_transform(X_t)
# 直接训练
print("-----------------------------------")
print(" 直接训练 ")
sklearn_SVM(x, y, x_t, y_t)
print("-----------------------------------")
print(" PCA降维 ")
t1 = time.time()
X_new = sklearn_PCA(x, y)
Xt_new = sklearn_PCA(x_t, y_t)
t2 = time.time()
print("sklearn_PCA降维运行时间:%fs" % (t2 - t1))
sklearn_SVM(X_new, y, Xt_new, y_t)
print("-----------------------------------")
print(" LDA降维 ")
t1 = time.time()
X_new = sklearn_LDA(x, y)
Xt_new = sklearn_LDA(x_t, y_t)
t2 = time.time()
print("sklearn_LDA降维运行时间:%fs" % (t2 - t1))
sklearn_SVM(X_new, y, Xt_new, y_t)
测试过程
修改数据集路径,每次测试需要修改训练集和测试集名称,运行PCA_LDA_test.py
测试结果
本次实验使用人工的和真实的数据集,其中summer_10000是人工的3维数据集,axa系列是libsvm dataset的二分类数据集。每次实验使用相同的数据集用三种不同的方法训练和测试,结果如下表所示
统计量
数据 集及 其大小 | 负类 正类 | 训练时间(s) | 支持向量 | 准确率(%) | ||||||
| PCA | LDA |
| PCA | LDA |
| PCA | LDA | ||
summer-10000 10000 ,3 | 8160 1840 | 0.338 | 0.605 | 0.564 | 855 852 | 1862 1840 | 818 812 | 96.90 | 80.15 | 93.63 |
a5a 6414 ,123 | 4845 1569 | 1.97 | 0.75 | 0.54 | 1308 1308 | 1589 1464 | 1089 1014 | 84.15 | 80.69 | 84.74 |
a6a 11220 ,123 | 8528 2692 | 7.59 | 2.16 | 2.18 | 2181 2164 | 2589 2471 | 1849 1797 | 84.16 | 80.48 | 84.73 |
a7a 16100 ,123 | 12182 3918 | 18.34 | 3.82 | 3.18 | 3094 3066 | 3573 3459 | 2650 2571 | 84. 58 | 80.52 | 84.84 |
a8a 22696 ,123 | 17190 5506 | 38.30 | 7.25 | 6.01 | 4287 4258 | 4971 4864 | 3731 3652 | 85 | 80.43 | 85.44 |
a9a 32561 ,123 | 24720 7841 | 74.76 | 13.02 | 11.56 | 5992 5962 | 7018 6933 | 5231 5152 | 84.81 | 80.17 | 84.89 |
测试结论
- PCA和LDA对样本降维后的训练时间都降低了
- axa系列数据集,PCA降维后再训练的准确率降低了4%左右,LDA降维后的准确率基本不变;summer-10000数据集,PCA降维后在训练的准确率降低了16%左右,LDA降低了3%左右
- PCA降维后再训练的支持向量增加,LDA降维后的支持向量减少,且都随着样本集的增大而增加/减少的更多。
总结,PCA和LDA对样本降维后训练都更快了,但LDA降维后的分类效果更好。