机器学习中的特征提取:完整指南

在机器学习中,特征提取将原始数据转换为一组有意义的特征,捕获关键信息的同时减少冗余。它可以涉及降维技术和从现有数据中创建新特征的方法。

想象一下,你正在尝试在市场上识别水果。虽然你可以考虑无数属性(重量、颜色、质地、形状、气味等),但你可能意识到仅仅几个关键特征,比如颜色和大小足以区分苹果和橙子。这正是特征提取所做的事情。它帮助你专注于数据中最具信息量的特征。

在进行特征提取时,原始数据被数学转换为一组新特征。这些新特征旨在捕获数据的最重要方面,同时可能降低数据的复杂性。提取出的特征通常代表原始数据中可能并不立即明显的潜在模式或结构。

特征提取

在接下来的部分中,我们将探讨为什么特征提取在机器学习中如此重要,并研究从不同类型的数据中提取特征的各种方法以及它们的代码。如果您想要一些实际示例,请查看我们的Python中的降维课程,其中有一个章节专门讲解特征提取。

为什么特征提取在机器学习中很重要?

特征提取在机器学习中起着重要作用。它可以决定模型成功与否。让我们看看为什么这对构建有效的机器学习模型如此基础。

增强模型准确性和效率

在处理原始数据时,机器学习模型经常难以区分有意义的模式和噪音。特征提取作为数据预处理的一步,可以显著提高模型学习和表现的能力。

模型性能与训练时间

例如,当一个模型在原始数据上达到85%的准确率时,当对精心提取的特征进行训练时,同一个模型可能会达到95%的准确率。这种改进不是来自于改变模型本身,而是来自于为其提供更高质量的输入数据,让模型能够从中学习。

管理高维数据集

现代数据集通常具有数百或数千个特征。这带来了几个挑战,而特征提取有助于解决这些挑战。

  • 维度诅咒: 随着特征数量的增加,数据在特征空间中变得越来越稀疏。这使得模型更难找到有意义的模式。特征提取创建了一个更紧凑的表示,保留了重要关系,同时减少了维度。
  • 高内存使用: 高维数据在处理时需要更多的存储和内存。通过仅提取最相关的特征,我们可以显著减少数据集的内存占用,同时保持其信息价值。
  • 数据可视化:直接可视化超过三个维度的数据是不可能的。特征提取可以将维度降低到两个或三个特征,使得可以将数据结构进行可视化理解。

特征提取通过降低维度同时保留关键信息来解决这些挑战。这种降维将庞大的高维数据转换为更紧凑和可管理的形式,从而提高模型性能。

减少计算复杂度和防止过拟合

特征提取为机器学习模型提供了两个关键优势:

  1. 较低的计算要求
    1. 更少的特性意味着更快的训练时间
    2. 模型部署时内存使用减少
    3. 更高效的预测生成
  2. 更好的泛化能力
    1. 更简单的特征空间有助于防止过拟合
    2. 模型学习到更强健的模式
    3. 在新的、未见过的数据上的性能提升

特征提取与不提取特征

上面的可视化图表说明了特征提取如何带来更简单、更稳健的模型。左侧图表展示了一个复杂模型试图拟合嘈杂的、高维数据,而右侧图表展示了特征提取如何揭示出更清晰、更具泛化性的模式。

使用提取后的特征而不是原始数据,就像为您的模型提供了一个清晰、精炼版本的信息供其学习。这不仅使学习过程更高效,还会导致模型更有可能在实际应用中表现良好。

接下来,让我们看看不同的特征提取方法。

特征提取方法

特征提取方法可以大致分为两种主要方法:手动特征工程和自动特征提取。让我们来看看这两种方法,以了解它们如何帮助将原始数据转化为有意义的特征。

手动特征工程

手动特征工程涉及使用领域专业知识从原始数据中识别和创建相关特征。这种亲身实践的方法依赖于我们对问题和数据的理解,以构建有意义的特征。

图像处理中,手动特征工程可能涉及技术,如边缘检测以识别对象边界,颜色直方图以捕获颜色分布,纹理分析以量化图案,以及形状描述符以表征对象几何形状。

图像特征提取

对于表格数据,手动特征工程涉及创建现有特征之间的交互项,使用对数或多项式函数转换变量,将数据点聚合为有意义的统计数据,并对分类变量进行编码。

表格数据特征提取

这些技术在领域专业知识的指导下,增强了数据表示的质量,并可以显著改善模型性能。

自动特征提取

自动特征提取利用算法在没有明确人类指导的情况下发现和创建特征。这些方法在处理复杂数据集时特别有用,因为手动特征工程可能不切实际或效率低下。

常见的自动化方法包括:

主成分分析(PCA):将数据转换为一组不相关的主成分,每个主成分捕获最大的剩余方差。这种方法特别适用于降维,因为它保留了数据中的基本信息同时简化了其结构。

主成分分析(PCA)

自编码器:这是一种神经网络,能够学习数据的压缩表示,捕捉非线性关系。它们在高维数据集上特别有效,而传统的线性方法可能会失效。

各种工具和库已经出现,以简化特征工程任务。例如,Scikit-learn 的分解模块提供了一系列降维方法,而 PyCaret 提供了自动特征选择功能。

手动和自动方法各有其优势。让我们来看看每种方法的优点。

手动工程

自动提取

领域知识整合

可伸缩性

可解释特征

处理复杂模式

精细控制

减少人为偏见

定制特定需求

发现隐藏关系

手动和自动方法之间的选择往往取决于诸如数据集复杂性、领域专业知识的可用性、可解释性要求、计算资源和时间限制等因素。

对于高度复杂的数据集或时间和资源有限的情况,自动化方法可以快速生成有用的特征。相反,当具有领域专业知识并且可解释性是重点时,手动方法可能更可取,允许量身定制的特征工程与手头问题密切对齐。

在实践中,许多成功的机器学习项目结合了这两种方法,利用领域专业知识指导特征工程,同时利用自动化方法发现可能不会立即显而易见的额外模式。

在接下来的部分中,我们将看看各个领域中的几种特征提取技术。

特征提取技术

每种类型的数据都需要针对其独特特征优化的特征提取技术。让我们看看不同类型数据的最常见技术。

特征提取技术

图像特征提取

图像特征提取将原始像素数据转换为有意义的表示,捕捉基本的视觉信息。现代计算机视觉中使用的技术主要分为三大类:传统方法、基于深度学习的方法和统计方法。

图像特征提取方法

让我们看看每种方法。

传统计算机视觉方法

尺度不变特征变换(SIFT)是一种在图像中检测显著局部特征的强大方法。它通过识别关键点并生成描述符来工作,这些描述符:

  • 不受图像缩放和旋转影响
  • 对光照变化部分不变
  • 对局部几何失真具有鲁棒性

SIFT算法通过几个阶段处理图像。它从尺度空间极值检测开始,以识别不变于尺度的潜在关键点。接下来,关键点定位通过精确定位这些候选点的确切位置并丢弃不稳定点。

在此之后,定位分配为每个关键点确定一致的定位,确保旋转不变性。最后,关键点描述符生成基于局部图像梯度的独特描述符,促进图像之间的稳健匹配。

另一种方法是定向梯度直方图(HOG)。它通过分析图像中的梯度模式来捕获局部形状信息。该过程从计算整个图像的梯度开始,以突出边缘细节。

图像被划分为小单元,对于每个单元,创建一个梯度方向的直方图来总结局部结构。最后,这些直方图在更大的块中进行归一化,以确保对光照和对比度变化的鲁棒性,从而生成一个强健的特征描述符,适用于物体检测和识别等任务。

深度学习方法

卷积神经网络(CNN)改变了我们进行特征提取的方式,通过自动学习层次化表示。

使用CNN进行特征提取

CNN通过其分层结构学习特征。在早期层中,它们检测基本的视觉元素,如边缘和颜色。中间层将这些元素组合起来识别模式和形状,而更深层则捕捉复杂对象并实现场景理解。

迁移学习使我们能够利用那些在大型数据集上训练的预先学习特征,使其在处理有限数据时特别有价值。

统计方法

统计方法从图像中提取全局和局部模式,促进了强大的图像分析和解释。

例如,颜色直方图表示图像中颜色的分布,并提供旋转和尺度不变特征,使其在图像分类和检索等任务中特别有用。

纹理分析使用灰度共生矩阵(GLCM)等技术捕捉重复的模式和表面特征,这对于材料识别和场景分类等应用非常有效。

此外,边缘检测通过Sobel、Canny和Laplacian算子等方法识别边界和显著的强度变化,在目标检测和形状分析中起着至关重要的作用。

特征提取方法的选择取决于几个因素。它应与您的任务特定要求保持一致,考虑可用的计算资源,并考虑解释性的需求。

此外,数据集的特征——如其大小、噪音水平和复杂性——起着至关重要的作用,所需的不变性属性如尺度、旋转和光照也同样重要。

音频特征提取

想象一下,试图教计算机像人类一样理解语音。这就是梅尔频率倒谱系数(MFCC)发挥作用的地方。

MFCC是一种特殊的音频特征,以类似于我们耳朵处理声音的方式分解声音。它们特别有效,因为它们专注于人类最敏感的频率。可以把它们看作是将声音翻译成计算机和人类听觉都能理解的格式。

梅尔频率倒谱系数

这个过程开始时将音频信号分解成短片段,通常长度为20-40毫秒。对于每个片段,我们应用一系列数学变换,将原始声波转换为频率成分。这里变得有趣的是,我们并不是平等对待所有频率,而是使用一种称为梅尔尺度的东西。

这个公式看起来很复杂,但实际上只是将频率映射到人类感知声音的方式。我们的耳朵更擅长检测较低频率的差异,而不是较高频率,Mel刻度考虑了这种自然偏好。

在语音识别中,MFCC是理解说话者身份和内容的基础。当您与手机的虚拟助手交谈时,它很可能在使用MFCC来处理您的语音。这些系数有助于捕捉每个人声音的独特特征,使它们对说话者识别系统至关重要。

在语音情感分析中,MFCC有助于检测表达情绪的微妙变化。它们可以捕捉到音调、语气和说话速度的变化,这些变化可能表明某人是快乐的、悲伤的、愤怒的还是中立的。例如,在分析客服电话时,MFCC可以帮助根据说话方式而不仅仅是说话内容来识别客户满意度水平。

时间序列特征提取

在处理时间序列数据时,提取有意义的特征有助于我们捕捉随时间演变的模式和趋势。让我们看看一些用于将原始时间序列数据转换为有用特征的关键技术。

时间序列特征提取方法

傅里叶变换将时间序列数据分解为其频率成分,揭示隐藏的周期性模式。公式为:

统计方法通过捕捉时间特征来补充频率分析。常见特征包括移动平均、标准差和趋势分量。这些技术在财务预测中特别强大,可以帮助识别市场趋势和异常。

例如,在股市分析中,将傅里叶特征与统计量结合可以揭示长期趋势和周期模式。同样,在工业环境中,这些方法通过分析随时间变化的传感器数据模式有助于检测设备异常。

特征提取工具和库

让我们来看看一些基本工具,这些工具使得实现这些特征提取方法变得简单而高效。

特征提取的工具和库

对于图像处理,OpenCV 和 scikit-image 提供了全面的工具,用于实现各种特征提取技术。这些库提供了 SIFT、HOG 和我们之前讨论的其他算法的高效实现。当使用深度学习方法时,TensorFlow 和 PyTorch 等框架变得不可或缺。您可以通过我们的 OpenCV 教程了解更多信息。

音频处理任务通过像LibROSA这样的库得到了简化,它在提取MFCC和其他声学特征方面表现出色。PyAudioAnalysis通过音频分析任务的高级接口扩展了这些功能。

对于时间序列数据,tsfresh和Featuretools自动化了特征提取过程。这些库可以自动生成和选择相关特征,使您可以更专注于模型开发而不是特征工程。

特征提取示例

让我们通过一些实践示例来应用我们的知识。我们将从图像特征提取开始,这是计算机视觉中最常见的应用之一。

使用OpenCV进行图像特征提取

首先,让我们导入必要的库

# 导入所需库 import cv2 import numpy as np import matplotlib.pyplot as plt

现在,让我们加载一幅图像来提取相关特征。在这个例子中,我们将使用从互联网上下载的哥斯拉的图像

# 加载图像 image = cv2.imread('godzilla.jpg') # 将 BGR 转换为 RGB(OpenCV 以 BGR 格式加载) image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # 显示原始图像 plt.imshow(image_rgb) plt.title('Original Image') plt.axis('off') plt.show()

输出:

在应用边缘检测之前,我们需要预处理我们的图像。我们按照以下步骤进行:

# 将图像转换为灰度 gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 应用高斯模糊以减少噪声 blurred = cv2.GaussianBlur(gray_image, (5, 5), 0)

最后,让我们应用 Canny 边缘检测算法并可视化结果:

# 应用Canny边缘检测 edges = cv2.Canny(blurred, threshold1=100, threshold2=200) # 显示结果 plt.figure(figsize=(10, 5)) plt.subplot(1, 2, 1) plt.imshow(image_rgb) plt.title('Original Image') plt.axis('off') plt.subplot(1, 2, 2) plt.imshow(edges, cmap='gray') plt.title('Edge Detection') plt.axis('off') plt.tight_layout() plt.show()

输出:

Canny边缘检测器帮助我们识别图像中重要的边界和特征,这些可以用于进一步分析或作为机器学习模型的输入。

使用LibROSA从音频中提取MFCC

在我们开始处理音频文件之前,我们需要安装所需的库。由于LibROSA不包含在Python的标准库中,我们将使用pip进行安装:

# 安装所需的库 # 在您的终端或命令提示符中运行这些命令 pip install librosa pip install numpy pip install matplotlib

LibROSA是一个专为音乐和音频分析设计的强大库,因此让我们首先导入它以及其他必要的库:

# 导入所需的库 import librosa import librosa.display import numpy as np import matplotlib.pyplot as plt

声音文件以波形格式包含大量信息。为了处理这些数据,我们首先需要将其加载到我们的程序中。LibROSA 帮助我们通过将音频文件转换为可以分析的格式来实现这一点:

# 加载音频文件 # 本示例的时长限制为 10 秒 audio_path = 'audio_sample.wav' y, sr = librosa.load(audio_path, duration=10) # 显示波形 plt.figure(figsize=(10, 4)) plt.plot(y) plt.title('Audio Waveform') plt.show()

输出:

现在我们已经加载了音频,接下来需要从中提取有意义的特征。我们的耳朵自然会将声音分解为不同的频率成分,而 MFCC 模仿了这一过程。我们使用 librosa 的特征提取函数来计算这些系数:

# 提取 MFCC 特征 mfccs = librosa.feature.mfcc(y=y, sr=sr, n_mfcc=13) # 显示 MFCC plt.figure(figsize=(10, 4)) librosa.display.specshow(mfccs, x_axis='time') plt.colorbar(format='%+2.0f dB') plt.title('MFCC') plt.show()

输出:

在这里,我们设置n_mfcc=13,因为前13个系数通常捕捉了在诸如语音识别等任务中有帮助的声音中最重要的方面。生成的可视化展示了这些特征随时间的变化,亮色代表较高的值。

使用tsfresh从时间序列数据中提取特征

首先,让我们安装所需的库。我们将使用yfinance来获取金融数据,以及tsfresh用于特征提取:

# 安装所需的库 # 在您的终端或命令提示符中运行这些命令 pip install tsfresh pip install pandas pip install numpy pip install matplotlib pip install yfinance

现在让我们导入我们的库并获取一些真实的金融数据:

# 导入所需的库 import pandas as pd import numpy as np from tsfresh import extract_features from tsfresh.feature_extraction import MinimalFCParameters import matplotlib.pyplot as plt import yfinance as yf

让我们获取一些真实的股票市场数据。我们将以苹果公司的股票数据为例:

# 下载过去2年的苹果股票数据 aapl = yf.Ticker("AAPL") df = aapl.history(period="2y") # 准备数据以符合tsfresh的格式要求 df_tsfresh = pd.DataFrame({ 'id': [0] * len(df), # 每个时间序列都需要一个ID 'time': range(len(df)), 'closing_price': df['Close'] # 我们将使用收盘价 }) # 显示我们数据的前几行 print("Original stock data shape:", df_tsfresh.shape) print("\nFirst few rows:") print(df_tsfresh.head())

输出:

现在让我们从我们的金融时间序列数据中提取特征:

# 设置特征提取参数 extraction_settings = MinimalFCParameters() # 自动提取特征 extracted_features = extract_features(df_tsfresh, column_id='id', column_sort='time', column_value='values', default_fc_parameters=extraction_settings) # 显示提取的特征 print("\nExtracted features shape:", extracted_features.shape) print("\nExtracted features:") print(extracted_features.head())

输出:

在这里,我们使用MinimalFCParameters()来指定要提取的特征。这为我们提供了一组基本的有意义的时间序列特征,如均值、方差和趋势特征,这对于理解我们数据中的模式至关重要。

特征提取中的挑战

在进行特征提取时,我们经常会遇到挑战。

在处理大型数据集时,通常会出现高维度和计算限制。例如,从高分辨率图像或长音频文件中提取特征可能会消耗大量内存和处理能力。

由于不相关或多余的特征而导致过拟合是另一个常见挑战。当提取了太多特征时,模型可能会学习噪音而非有意义的模式。这在图像和音频处理中特别常见,可能会生成成千上万的特征。

要克服这些挑战,请考虑以下策略:

  • 利用领域知识选择相关特征
  • 应用特征选择方法来降低维度
  • 根据数据类型实施适当的特征工程技术

这些挑战需要仔细考虑和权衡特性丰富性与计算效率之间的关系。

结论

特征提取是机器学习中的一项基本技能,它将原始数据转化为有意义的表示。通过我们在OpenCV、LibROSA和tsfresh中的实际示例,我们已经看到如何从不同类型的数据中提取特征。通过了解这些技术及其挑战,我们可以构建有效的机器学习模型。

准备深入了解吗?查看这些资源:

Source:
https://www.datacamp.com/tutorial/feature-extraction-machine-learning