0


机器学习之特征提取

主成分分析

主成分分析是一种强大的数据处理技术。它之所以能够通过去除冗余和噪声来提高模型的泛化能力,原因在于数据中的冗余和噪声往往在某些维度上表现得较为明显。通过计算协方差矩阵的特征值和特征向量,我们能够找到数据中变化最大的方向。例如,在图像识别任务中,原始图像数据可能具有非常高的维度,比如每个像素都是一个维度。但其中很多维度可能包含的是相似或重复的信息,这就是冗余。而噪声可能来自于图像采集过程中的干扰等。

选取方差最大的几个方向作为新坐标轴,就像是在复杂的数据空间中找到了最具代表性的“主干道”。比如在分析消费者的购买行为数据时,可能存在多个变量描述消费者的特征,如年龄、收入、购买频率等。通过主成分分析PCA 降维,可以将这些变量综合成几个主要的成分,更清晰地展现消费者的行为模式。将原始数据映射到新坐标轴上实现降维,不仅减少了数据处理的复杂性,还能够突出数据的主要特征。这对于后续的模型训练和分析非常有益。

以下是一个使用 Python 的

  1. scikit-learn

库实现主成分分析的示例代码:

  1. from sklearn.decomposition import PCA
  2. import numpy as np
  3. # 生成示例数据
  4. X = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
  5. # 创建并拟合 PCA 模型
  6. pca = PCA(n_components=2) # 设定保留的主成分数量为 2
  7. pca.fit(X)
  8. # 对数据进行降维
  9. X_transformed = pca.transform(X)
  10. print("原始数据:")
  11. print(X)
  12. print("降维后的数据:")
  13. print(X_transformed)

自编码器

自编码器就像是一个神奇的魔术师,它能将复杂的数据压缩成简洁的低维表示,同时还能从这个压缩后的表示中重构出原始数据。想象一下,把一堆杂乱无章的东西塞进一个小盒子里,然后还能再把它们完好无损地取出来,这就是自编码器的魅力所在。通过最小化重构误差来训练自编码器,就像是在教它如何更好地“打包”和“解压”数据,让它学会捕捉数据中的关键特征。这些提取到的特征可以用于各种后续任务,比如分类、回归,还能提高模型的泛化能力,让模型在面对新数据时也能表现出色。所以说,自编码器是特征提取的一把好手,能为机器学习任务打下坚实的基础。

以下是一个使用 Python 的

  1. TensorFlow

库实现简单自编码器的示例代码:

  1. import tensorflow as tf
  2. from tensorflow.keras.datasets import mnist
  3. from tensorflow.keras.models import Model
  4. from tensorflow.keras.layers import Input, Dense
  5. # 加载 MNIST 数据集
  6. (x_train, _), (x_test, _) = mnist.load_data()
  7. # 数据预处理
  8. x_train = x_train.astype('float32') / 255.
  9. x_test = x_test.astype('float32') / 255.
  10. x_train = x_train.reshape((len(x_train), np.prod(x_train.shape[1:])))
  11. x_test = x_test.reshape((len(x_test), np.prod(x_test.shape[1:])))
  12. # 定义输入层
  13. input_img = Input(shape=(784,))
  14. # 编码器
  15. encoded = Dense(128, activation='relu')(input_img)
  16. encoded = Dense(64, activation='relu')(encoded)
  17. # 解码器
  18. decoded = Dense(128, activation='relu')(encoded)
  19. decoded = Dense(784, activation='sigmoid')(decoded)
  20. # 构建自编码器模型
  21. autoencoder = Model(input_img, decoded)
  22. # 单独定义编码器模型
  23. encoder = Model(input_img, encoded)
  24. # 定义解码器模型
  25. encoded_input = Input(shape=(64,))
  26. decoder_layer = autoencoder.layers[-2](encoded_input)
  27. decoder_layer = autoencoder.layers[-1](decoder_layer)
  28. decoder = Model(encoded_input, decoder_layer)
  29. # 编译模型
  30. autoencoder.compile(optimizer='adam', loss='binary_crossentropy')
  31. # 训练模型
  32. autoencoder.fit(x_train, x_train, epochs=50, batch_size=256, shuffle=True, validation_data=(x_test, x_test))
  33. # 对测试数据进行编码和解码
  34. encoded_imgs = encoder.predict(x_test)
  35. decoded_imgs = decoder.predict(encoded_imgs)

在这个示例中,我们使用 MNIST 数据集训练一个自编码器,尝试学习数据的压缩表示,并能够从压缩后的表示中重构出原始数据。


线性判别分析

一种有监督的降维技术,LDA将数据投影到低维空间,使得同类数据投影点尽可能接近,而不同类数据尽可能远离,从而实现降维和分类,与PCA不同,LDA在降维时考虑了数据的类别标签,因此更适合于分类任务中的特征提取。它的目标是找到一个投影方向,将数据投影到低维空间中,使得同类数据的投影点尽可能接近,而不同类数据的投影点尽可能远离。这样一来,我们就可以在降低维度的同时,保持数据的分类信息,使得数据更容易被分类。与主成分分析(PCA)不同,LDA 在降维时考虑了数据的类别标签。PCA 主要关注数据的方差最大化,而 LDA 则更关注类间的可分性。在分类任务中,LDA 非常适合用于特征提取。通过将高维数据投影到低维空间,我们可以提取出对分类最有帮助的特征,从而提高分类器的性能。举个例子,假设我们有一组包含不同种类水果的图像数据,LDA 可以帮助我们找到一个投影方向,使得苹果的图像在投影后聚在一起,橘子的图像也聚在一起,而苹果和橘子的图像则在投影空间中分得很开。这样,我们就可以更容易地对这些水果进行分类。


卷积神经网络

卷积层通过卷积核在图像上滑动并进行计算,提取出图像的局部特征。这些特征图就像是图像的“指纹”,包含了从低级到高级的各种信息,比如边缘、纹理、形状,甚至是物体的部分。随着网络层数的增加,CNN 能够逐渐提取更复杂、更抽象的特征。这就好比是一层一层地剥开图像的“神秘面纱”,让我们更好地理解图像的内容。在图像识别、分类等任务中,CNN 的这种特征提取能力非常有效。它可以自动学习到图像中的关键特征,从而帮助我们准确地识别图像中的物体、场景等。比如说,在识别猫和狗的图片时,CNN 可以通过学习猫和狗的不同特征,比如它们的外形、颜色、纹理等,来准确地判断图片中是猫还是狗。


词嵌入

在自然语言处理中,词嵌入是一种将单词映射到高维向量空间的技术,使得语义上相似的单词在向量空间中距离较近。常用的词嵌入模型包括Word2Vec、GloVe和BERT等。这些模型可以将文本数据转换为数值型特征,用于后续的机器学习任务


循环神经网络及其变体

循环神经网络及其变体特别适用于处理序列数据。RNN通过内部的循环结构,能够捕捉序列中的时间依赖性,从而提取序列中的特征。其变体如LSTM和GRU通过引入门控机制,解决了传统RNN在处理长序列时易出现的梯度消失或爆炸问题,进一步提升了特征提取的能力


本文转载自: https://blog.csdn.net/faderbitch/article/details/140758668
版权归原作者 faderbic 所有, 如有侵权,请联系我们删除。

“机器学习之特征提取”的评论:

还没有评论