跳至主要内容

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

通过图像、音频和时间序列数据的 Python 实操示例掌握特征提取技术。学习如何将原始数据转化为有意义的特征,并解决机器学习应用中的常见挑战。
· 13分钟 阅读

使用 AI 探索

机器学习中的特征提取将原始数据转换为一组有意义的特征,在捕捉关键信息的同时减少冗余。它既可以包含降维技术,也可以包含从现有数据中构造新特征的方法。

想象一下,您要在市场上识别水果。虽然可以考虑无数属性(重量、颜色、质地、形状、气味等),但您可能会发现,仅凭颜色和大小等几个关键特征就足以区分苹果和橙子。这正是特征提取的作用:帮助您聚焦于数据中最具信息量的特征。

进行特征提取时,原始数据会被数学变换为一组新的特征。这些新特征旨在捕捉数据最重要的方面,同时可能降低其复杂度。提取出的特征通常表示潜在的模式或结构,而这些在原始数据中可能并不直观可见。

feature extraction

特征提取

接下来,我们将探讨特征提取为何在机器学习中如此重要,并结合代码示例,了解针对不同类型数据的多种特征提取方法。若您想进行动手实践,欢迎查看我们的Python 降维课程,其中有一整章专门讲解特征提取。

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

特征提取在机器学习中发挥着重要作用。它往往决定了模型的成败。下面看看它为何是构建有效机器学习模型的基础。

提升模型准确性与效率

在处理原始数据时,机器学习模型往往难以分辨有意义的模式与噪声。特征提取作为数据预处理步骤,能够显著提升模型的学习效果与表现。

Model Performance versus Training Time

模型性能与训练时间对比

例如,同一模型在原始数据上可能只有 85% 的准确率,而在精心提取的特征上训练后,准确率可能达到 95%。这种提升并非来自模型结构的改变,而是源于提供了更高质量的输入数据。

应对高维数据集

现代数据集常常包含数百甚至数千个特征,由此带来的一些挑战可通过特征提取来解决。

  • 维度诅咒:随着特征数量增加,数据在特征空间中愈发稀疏,模型更难发现有意义的模式。特征提取可构建更紧凑的表示,在降低维度的同时保留重要关系。
  • 高内存占用:高维数据在处理时需要更多存储和内存。仅提取最相关特征可显著降低数据集的内存占用,同时保持其信息价值。
  • 数据可视化:三维以上的数据无法直接可视化。特征提取可将维度降至二维或三维,使我们能通过绘图直观理解数据结构。

特征提取通过在保留关键信息的同时降低维度,解决了上述挑战。降维将庞杂的高维数据转化为更紧凑、可管理的形式,从而提升模型性能。

降低计算复杂度并防止过拟合

特征提取为机器学习模型带来两项关键收益:

  1. 更低的计算需求
    1. 更少的特征意味着更快的训练
    2. 模型部署时的内存占用更低
    3. 预测生成更高效
  2. 更好的泛化能力
    1. 更简洁的特征空间有助于防止过拟合
    2. 模型学习到更稳健的模式
    3. 在新、未见过的数据上表现更佳

Feature Extractions versus Without Feature Extraction

使用特征提取与不使用特征提取的对比

上图展示了特征提取如何促成更简洁、更稳健的模型。左图显示了一个复杂模型试图拟合嘈杂的高维数据;右图则展示了特征提取如何揭示更清晰、可泛化的模式。

使用提取后的特征而非原始数据,就像为模型提供了更清晰、提炼过的信息来源。这不仅让学习过程更高效,也更可能产出能在真实应用中表现良好的模型。

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

特征提取的方法

特征提取大致可分为两类:手动特征工程与自动化特征提取。下面分别介绍这两类方法,了解它们如何将原始数据转化为有意义的特征。

手动特征工程

手动特征工程依赖领域专家知识,从原始数据中识别并构造相关特征。这是一种动手式方法,基于对问题与数据的理解来打造有意义的特征。

在图像处理中,手动特征工程可能包括:用边缘检测识别物体边界、用颜色直方图刻画颜色分布、用纹理分析量化图案、用形状描述子表征几何特性。

image feature extraction

图像特征提取

对于表格数据,手动特征工程包括:构造特征之间的交互项、通过对数或多项式函数变换变量、将数据点聚合为有意义的统计量,以及对类别变量进行编码。

Tabular data Feature Extraction

表格数据特征提取

这些在领域知识指导下的技术能提升数据表示质量,并显著改善模型性能。

自动化特征提取

自动化特征提取使用算法在没有明确人工指导的情况下发现并生成特征。当数据集复杂、手动工程不切实际或效率低下时,这些方法尤其有用。

常见的自动化方法包括:

主成分分析(PCA):将数据变换为一组互不相关的成分,每个成分捕捉最大剩余方差。该方法特别适合降维,在简化结构的同时保留数据中的关键信息。

Principal Component Analysis(PCA)

主成分分析(PCA)

自编码器:通过学习数据的压缩表示来捕捉非线性关系的神经网络。对于高维数据集尤其有效,传统线性方法在此类问题上可能不够理想。

为简化特征工程任务,各类工具与库不断涌现。例如,Scikit-learn 的分解模块提供多种降维方法,PyCaret 提供自动化特征选择能力。

手动与自动化方法各有优势。下面看看各自的长处。

手动工程

自动化提取

融入领域知识

可扩展性

特征可解释

处理复杂模式

精细化控制

降低人为偏见

针对特定需求定制

发现隐含关系

在手动与自动化方法之间进行选择,通常取决于数据集复杂度、领域专家资源、可解释性要求、计算资源与时间约束等因素。

当数据集极其复杂或时间与资源有限时,自动化方法能快速生成有用特征。相反,当具备领域知识且强调可解释性时,手动方法更可取,可针对当前问题进行定制化工程。

在实践中,许多成功的机器学习项目结合使用两种方法:用领域知识指导特征工程,同时借助自动化方法发掘人类专家未必能立即察觉的附加模式。

下一节我们将了解多个领域中的常见特征提取技术。

特征提取技术

不同类型数据需要针对其特性优化的特征提取技术。下面看看各类数据中最常用的技术。

Feature Extraction Techniques

特征提取技术

图像特征提取

图像特征提取将原始像素数据转化为能捕捉关键信息的表示。现代计算机视觉中主要有三类技术:传统方法、深度学习方法与统计方法。

Image Feature Extraction Methods

图像特征提取方法

下面逐一介绍这些方法。

传统计算机视觉方法

尺度不变特征变换(SIFT)是一种稳健的方法,用于检测图像中的独特局部特征。它通过识别关键点并生成具备以下性质的描述子来工作:

  • 对图像缩放与旋转不变
  • 对光照变化部分不变
  • 对局部几何畸变具有鲁棒性

SIFT 算法通过多个阶段处理图像。首先进行尺度空间极值检测,以识别对尺度不变的潜在关键点。随后关键点定位对这些候选点进行精确定位并剔除不稳定点。

接着进行方向分配,为每个关键点确定一致的方向以确保旋转不变性。最后生成关键点描述子,基于局部图像梯度创建独特的描述子,从而实现图像间的稳健匹配。

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

随后将图像划分为小单元,对每个单元构建梯度方向直方图以概括局部结构。最后在更大的块上对这些直方图进行归一化,以增强对光照与对比度变化的鲁棒性,从而得到适用于目标检测与识别的稳健特征描述子。

深度学习方法

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

Feature Extraction with CNN

用 CNN 进行特征提取

CNN 通过层级结构学习特征:早期层检测边缘与颜色等基础视觉元素;中间层组合这些元素以识别图案与形状;更深层则捕捉复杂物体并促进场景理解。

迁移学习使我们能够复用在大型数据集上训练得到的预学习特征,在数据有限的情况下尤为有价值。

统计方法

统计方法能从图像中提取全局与局部模式,助力稳健的图像分析与解读。

例如,颜色直方图表示图像中的颜色分布,具备旋转与尺度不变性,适用于图像分类与检索等任务。

纹理分析利用灰度共生矩阵(GLCM)等技术捕捉重复模式与表面特性,适用于材料识别与场景分类等应用。

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

方法选择取决于多种因素:需与任务需求相匹配,考虑可用的计算资源,并兼顾对可解释性的要求。

此外,还要考虑数据集特性——如规模、噪声水平与复杂度——以及所需的不变性(如尺度、旋转与光照不变性)。

音频特征提取

想象让计算机像人类一样理解语音——梅尔频率倒谱系数(MFCC)正是为此而来。

MFCC 是一类特殊的音频特征,以类似人耳处理方式分解声音。它尤其有效,因为它聚焦于人类最敏感的频率范围。可以把它看作把声音翻译为一种计算机与人类听觉都觉得有意义的格式。

mfcc feature extraction

梅尔频率倒谱系数

流程从将音频信号分割为短时片段开始,通常为 20–40 毫秒。对每个片段,我们应用一系列数学变换,将原始声波转换为频率成分。精彩之处在于:我们并非一视同仁地处理所有频率,而是使用所谓的 Mel 标度。

这个公式看起来可能很复杂,但它只是将频率映射为更符合人类听觉感知的刻度。我们对低频差异更敏感,对高频差异则较不敏感,Mel 标度正是对此进行建模。

在语音识别中,MFCC 是理解“谁在说话”和“说了什么”的基础。当您对手机语音助手说话时,它很可能使用 MFCC 来处理您的声音。这些系数有助于捕捉每个人声音的独特特征,因此在说话人识别系统中非常重要。

对于语音情感分析,MFCC 有助于检测表征情绪的微妙语音变化。它们可以捕捉音高、语调与语速的变化,从而判断某人是愉快、悲伤、愤怒或平静。例如,在客服通话分析中,MFCC 能根据说话方式而非仅凭用词来识别客户满意度。

时间序列特征提取

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

time series feature extraction

时间序列特征提取方法

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

统计方法通过捕捉时间特性来补充频域分析。常见特征包括移动平均、标准差与趋势成分。这些技术在金融预测中尤为强大,可用于识别市场趋势与异常。

例如,在股票市场分析中,将傅里叶特征与统计量结合可同时揭示长期趋势与周期模式。类似地,在工业场景中,这些方法通过分析随时间变化的传感器数据模式来帮助检测设备异常。

特征提取的工具与库

下面看看一些可让特征提取实现更便捷高效的核心工具。

Tools and Libraries for Feature Extraction

特征提取的工具与库

在图像处理方面,OpenCV 与 scikit-image 提供了实现各类特征提取技术的完整工具,这些库高效实现了前文提到的 SIFT、HOG 等算法。采用深度学习方法时,TensorFlow 与 PyTorch 等框架不可或缺。若想入门,可从我们的OpenCV 教程开始。

音频处理任务可借助 LibROSA 等库来简化,特别是在提取 MFCC 与其他声学特征方面表现出色。PyAudioAnalysis 则以更高层的接口扩展了音频分析能力。

对于时间序列数据,tsfresh 与 Featuretools 可自动化特征提取流程。这些库能从时序数据中自动生成并选择相关特征,使您能把精力更多放在建模而非特征工程上。

特征提取示例

让我们通过一些实操示例把所学用起来。我们先从计算机视觉中最常见的应用之一——图像特征提取——开始。

使用 OpenCV 进行图像特征提取

首先,导入必要的库

# Import required libraries
import cv2
import numpy as np
import matplotlib.pyplot as plt

现在,加载一张图像以提取相关特征。本例中,我们将使用一张从互联网下载的哥斯拉图片。

# Load the image
image = cv2.imread('godzilla.jpg')

# Convert BGR to RGB (OpenCV loads in BGR format)
image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

# Display the original image
plt.imshow(image_rgb)
plt.title('Original Image')
plt.axis('off')
plt.show()

输出:

在应用边缘检测之前,我们需要先预处理图像,步骤如下:

# Convert the image to grayscale
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# Apply Gaussian blur to reduce noise
blurred = cv2.GaussianBlur(gray_image, (5, 5), 0)

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

# Apply Canny edge detection
edges = cv2.Canny(blurred, threshold1=100, threshold2=200)

# Display the results
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 进行安装:

# Install required libraries
# Run these commands in your terminal or command prompt
pip install librosa
pip install numpy
pip install matplotlib

LibROSA 是一款专为音乐与音频分析设计的强大库,我们先导入它及其他必要的库:

# Import required libraries
import librosa
import librosa.display
import numpy as np
import matplotlib.pyplot as plt

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

# Load the audio file
# Duration is limited to 10 seconds for this example
audio_path = 'audio_sample.wav'
y, sr = librosa.load(audio_path, duration=10)

# Display the waveform
plt.figure(figsize=(10, 4))
plt.plot(y)
plt.title('Audio Waveform')
plt.show()

输出:

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

# Extract MFCC features
mfccs = librosa.feature.mfcc(y=y, sr=sr, n_mfcc=13)

# Display the 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 进行特征提取:

# Install required libraries
# Run these commands in your terminal or command prompt
pip install tsfresh
pip install pandas
pip install numpy
pip install matplotlib
pip install yfinance

接下来导入库并抓取一些真实的金融数据:

# Import required libraries
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

我们以苹果公司的股票数据为例:

# Download Apple's stock data for the last 2 years
aapl = yf.Ticker("AAPL")
df = aapl.history(period="2y")

# Prepare the data in the format tsfresh expects
df_tsfresh = pd.DataFrame({
    'id': [0] * len(df),  # Each time series needs an ID
    'time': range(len(df)),
    'closing_price': df['Close']  # We'll use closing prices
})

# Display first few rows of our data
print("Original stock data shape:", df_tsfresh.shape)
print("\nFirst few rows:")
print(df_tsfresh.head())

输出:

现在从金融时间序列中提取特征:

# Set up the feature extraction parameters
extraction_settings = MinimalFCParameters()

# Extract features automatically
extracted_features = extract_features(df_tsfresh, 
                                   column_id='id', 
                                   column_sort='time',
                                   column_value='values',
                                   default_fc_parameters=extraction_settings)

# Display the extracted features
print("\nExtracted features shape:", extracted_features.shape)
print("\nExtracted features:")
print(extracted_features.head())

输出:

这里我们使用MinimalFCParameters()来指定要提取的特征,得到一组基础而有意义的时间序列特征,如均值、方差与趋势特征,这些有助于理解数据中的模式。

特征提取的挑战

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

当数据集很大时,高维性与计算资源受限的问题时常出现。例如,从高分辨率图像或长音频文件中提取特征会消耗大量内存和算力。

由无关或冗余特征导致的过拟合也是常见问题。当提取了过多特征时,模型可能学习到噪声而非有意义的模式。这在图像与音频处理中尤为常见,因为可能会生成成千上万的特征。

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

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

这些挑战需要在特征丰富度与计算效率之间进行权衡与平衡。

结论

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

准备深入学习?不妨看看以下资源:

特征提取常见问答

特征提取与特征选择有何区别?

特征提取是从现有数据中创建新特征;特征选择是从已有特征中挑选最相关的部分。

特征提取能降低过拟合吗?

是的。特征提取通过构建更紧凑的数据表示来降低过拟合。

特征提取如何提升模型性能?

它能降低数据复杂度并突出重要模式,从而提升模型准确性与效率。

我应当在何时使用特征提取?

当您面对高维数据,或需要捕捉数据中的关键模式时,应使用特征提取。

作者

Rajesh Kumar

我是一名数据科学内容写作者,热衷于创作与 AI/ML/DS 相关的内容。我也会探索新的 AI 工具并撰写相关文章。

主题