全文链接:https://tecdat.cn/?p=37450
主成分分析(PCA)作为数据科学中用于可视化和降维的重要工具,在处理具有大量特征的数据集时非常有用。就像我们难以找到时间阅读一本 1000 页的书,而更倾向于 2 到 3 页的总结以抓住整体概貌一样,当数据集中特征过多时,PCA 可以帮助我们减少维度,提高模型训练效率,同时尽可能保留更多信息。例如在图像处理和基因组研究等常见应用中,往往需要处理成千上万甚至数万个列的数据,此时维度灾难可能成为问题,而 PCA 则能发挥重要作用。
降维中的主成分分析法(PCA)
在众多的数据集中,部分变量的研究价值相对有限。为了实现连贯性分析,降维便成为一种必要手段。而在降维过程中,关键在于尽可能地保留原始数据中的有用信息。接下来,以二维数据降为一维为例,对主成分分析法进行介绍。
由于我们所研究的主要问题在于参数之间的相关关系,而这种相关关系主要体现在各个数据点的相对位置方面。需注意的是,数据点的具体位置并不会对其相关关系产生影响。
接下来,我们需要找出对数据影响最大的方向。为此,不妨设定一个单位向量来表示这个方向。然后,将表示各个数据点的向量向该方向进行投影,并求出方差的表达式。
在对数据影响最大的方向上,数据点的分散程度最高,也就是方差最大。在此处,我们运用拉格朗日乘数法来求取最值。从化简后的结果可以看出,我们所寻求的方向正是数据协方差矩阵的特征向量方向。对协方差矩阵进行特征值分解,特征值中较大的那个所对应的特征向量具有重要意义。
一、实现过程
- 数据标准化:首先对数据进行处理,使其每个特征的均值为零,方差为一。
- 这样可以确保数据在后续分析中的稳定性和可比性。
- 协方差矩阵计算:计算标准化后数据的协方差矩阵,该矩阵能够描述特征之间的相关性。
- 协方差矩阵反映了不同特征之间的关联程度。
- 特征值分解:对协方差矩阵进行特征值分解,从而得到特征值和对应的特征向量。
- 特征值和特征向量在主成分分析中起着关键作用。
- 主成分选择:依据特征值的大小,选取前 k 个特征值对应的特征向量,以此构建新的坐标系。
- 选择重要的特征向量可以更好地表示数据的主要信息。
- 数据投影:将原始数据投影到新的坐标系中,进而得到降维后的数据集。
- 通过投影实现数据的降维处理。
二、应用场景
- 图像处理:PCA 可用于图像压缩,在减小图像维度的同时保留主要信息。
- 有助于节省存储空间和提高图像处理效率。
- 金融分析:在金融领域,PCA 可用于降维和风险管理,能够帮助识别资产之间的相关性。
- 为金融决策提供有力支持。
三、优点
- 降维:PCA 能够减小数据的维度,降低存储和计算成本。
- 提高数据处理的效率。
- 去冗余:有助于去除冗余信息,提取出最重要的特征。
- 使数据更加简洁有效。
- 可视化:可将数据可视化,以便更好地理解数据结构和关系。
- 增强对数据的直观认识。
四、缺点
- 信息损失:降维可能会导致信息损失,特别是当较少的主成分用于表示数据时。
- 需要在降维和信息保留之间进行权衡。
- 线性假设:PCA 基于线性假设,可能不适用于非线性数据。
- 对于非线性数据的处理效果有限。
- 选择主成分数量:需要选择保留的主成分数量,这可能是一个主观过程。
- 增加了分析的不确定性。
Python主成分分析PCA、线性判别分析LDA、卷积神经网络分类分析水果成熟状态数据|附代码数据
本文对给定数据集进行多类别分类任务时所采用的各种统计和机器学习技术进行了总结。给定数据集包含 20 个类别,对应 10 种不同的水果及其成熟或未成熟状态。为实现分类任务,首先进行数据可视化,接着进行数据预处理,包括异常值检测技术(如局部异常因子和隔离森林)以及数据缩放技术(如标准缩放器和分位数转换器)。
随后运用降维算法如主成分分析(PCA)和线性判别分析(LDA)以及聚类技术,将聚类 ID 作为额外特征添加到数据集中。最后尝试通过深度学习技术(如卷积神经网络)来提高模型准确性。通过交叉验证评估模型性能,并比较其准确性和计算效率。总体而言,本项目展示了统计机器学习技术在多类别分类任务中的有效性,并强调了异常值检测和降维在提高机器学习模型准确性方面的重要性。
数据加载与重构
- 导入数据:
-
df = pd.read_csv('../../codes/sml/project/train.csv')
-
df.head()
-
-
df = pd.read_csv('../../codes/sml/project/train.csv')
-
df.head()
-
-
将字符串标签转换为代码:
-
categories_list = df[ 'category' ].astype( 'category' ).cat.categories
-
df[ 'category' ] = df[ 'category' ].astype('category').cat.codes
- 拆分数据为特征矩阵和目标向量:
-
-
X = data[:,:-1]
-
y = data[:,-1]
-
print(X.shape)
-
print(y)
去除异常值
使用隔离森林去除异常值:
-
-
from sklearn.ensemble import IsolationForest
-
clf = IsolationForest(max_samples = 100, random_state = 1
多层感知机神经网络
- 数据标准化:
-
-
from sklearn.preprocessing import StandardScaler
-
scaler = StandardScaler()
- 进行主成分分析:
-
-
from sklearn.decomposition import PCA
-
pca = PCA(n_components=363)
-
pca.fit(nn_X_train)
- 进行线性判别分析:
-
-
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
-
lda = LinearDiscriminantAnalysis(n_components=19)
-
lda.fit(nn_X_train, nn_y_train)
-
-
nn_X_train_lda = lda.transform(nn_X_train)
-
nn_X_test_lda = lda.transform(nn_X_test)
- 构建并训练多层感知机模型:
-
-
val_acc = []
-
pca_acc = []
-
lda_acc = []
-
pca_lda_acc = []
-
-
for i in range(40, 44):
-
# clf = MLPClassifier(solver='adam' , alpha=1e-5, random_state=i, max_iter=10000, hidden_layer_sizes=(300, 60))
-
# clf = MLPClassifier(solver='lbfgs' , alpha=1e-5, random_state=i, max_iter=10000, hidden_layer_sizes=(300, 59))
-
# best one till now
-
clf = MLPClassifier(solver='adam' , alpha=1e-5, random_state=i, max_iter=10000, hidden_layer_sizes=(448, 119, 170, 116))
-
-
# clf = MLPClassifier(solver='adam' , alpha=1e-5, random_state=i, max_iter=10000, hidden_layer_sizes=(300, 60))
-
clf.fit(nn_X_train, nn_y_train)
- 输出不同处理方式下的平均准确率:
-
print(sum(val_acc)/len(val_acc))
-
print(sum(pca_acc)/len(pca_acc))
-
print(sum(lda_acc)/len(lda_acc))
-
print(sum(pca_lda_acc)/len(pca_lda_acc))
卷积神经网络
- 特征值归一化:
print(X_train.max())
主成分分析PCA
-
from sklearn.decomposition import PCA
-
pca = PCA(n_components=900)
-
X_train = pca.fit_transform(X_train)
-
X_test = pca.transform(X_test)
-
X_train = X_train.reshape(X_train.shape[0], 30, 30, 1)
-
X_test = X_test.reshape(X_test.shape[0], 30, 30, 1)
LDA
- 进行线性判别分析:
-
# lda = LDA(n_components=18)
-
# X_train = lda.fit_transform(X_train, y_train)
-
# X_test = lda.transform(X_test)
可视化样本
-
plt.figure(figsize=(10,10))
-
for i in range(25):
-
plt.subplot(5,5,i+1)
定义卷积神经网络架构
-
from tensorflow.keras import regularizers
-
-
model = models.Sequential()
-
-
model.add(layers.Conv2D(128, (3, 3), activation
编译卷积神经网络
model.compile(optimizer='adam',
绘制准确率与 epoch 的关系图
-
-
-
test_loss, test_acc = model.evaluate(X_test.reshape(X_test.shape[0], 64, 64, 1), y_test, verbose=2)
10/10 - 0s - loss: 0.9434 - accuracy: 0.7888 - 211ms/epoch - 21ms/step
评估模型并输出结果
-
df_test = pd.read_csv('../../codes/sml/project/test.csv')
-
df_test.head()
结论
通过对多种机器学习和深度学习技术的应用与比较,本文展示了不同方法在多类别分类任务中的性能表现。逻辑回归在公共数据上取得了较高的准确率,而卷积神经网络在私有数据上表现出色。同时,数据预处理中的异常值检测和降维技术对提高模型准确性起到了重要作用。未来,可以进一步探索更先进的模型架构和优化方法,以提高多类别分类任务的性能。
关于分析师
在此对Shixian Ding对本文所作的贡献表示诚挚感谢,他在中国科学技术大学完成了计算机科学与技术(主修)和金融学(辅修)的学位,专注机器学习、数理金融、数据采集、数据挖掘领域。擅长 R 语言、Python、MySQL、Matlab。