测试概述
该实验的目的是测试LDA(Linear Discriminant Analysis,线性判别分析)的降维效果(主要是训练时间),同时引入了PCA(Principal components analysis,主成分分析)作为比较。
程序比较简单,降维算法和训练算法均是调用python的sklearn库的函数,所有代码都在程序中给出。
每次使用相同数据集,通过三种不同方式测试,分别是直接训练、PCA降维后训练、LDA降维后训练。
文件说明
code |
测试程序文件夹,内含LDA_test.py程序 |
dataset |
测试数据集文件夹 |
output |
测试结果截图文件夹 |
测试环境
操作系统 |
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)
测试过程
运行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对样本降维后的训练时间都减少了,PCA降维后准确率有一定降低,LDA降维后的准确率都和直接训练的结果变化不大,使用axa系列数据集时,LDA降维后的效果比直接训练更好一些。总的来说,PCA和LDA对样本降维后训练都更快,但LDA降维后的分类效果更好。
来源:https://blog.csdn.net/qq_33187136/article/details/99693523