6.1 特征提取
Scikit-learn 特征提取从入门到精通:数值、文本、图像与参数调优
本教程全面介绍Scikit-learn中的特征提取方法,包括无监督数值特征提取、文本特征提取使用CountVectorizer和TfidfVectorizer(词袋/TF-IDF)、图像特征提取(基础像素和HOG特征),以及参数调优技巧如停用词和词频阈值。适合机器学习新手学习。
特征提取在Scikit-learn中的全面应用
简介
特征提取是机器学习预处理的核心步骤,旨在将原始数据转换为更有信息量的特征,以提升模型性能。Scikit-learn提供了多种工具来处理数值、文本和图像数据。本章将系统讲解特征提取的基本概念和实际应用,适合初学者快速上手。
数值特征提取
数值特征提取通常是无监督的,直接基于原始数据。在Scikit-learn中,你可以使用原始数值数据,或通过简单转换如归一化(MinMaxScaler)和标准化(StandardScaler)来调整特征。
- 直接使用原始数据:对于大多数模型,如线性回归或决策树,可以直接输入数值特征。
- 示例代码:
import numpy as np from sklearn.preprocessing import StandardScaler # 假设X是数值数据的数组 X = np.array([[1, 2], [3, 4], [5, 6]]) scaler = StandardScaler() X_scaled = scaler.fit_transform(X)
文本特征提取
文本特征提取将文本数据转换为数值向量,常用方法包括词袋模型和TF-IDF。Scikit-learn提供了CountVectorizer和TfidfVectorizer。
CountVectorizer(词袋模型)
词袋模型统计文本中每个词出现的频率,忽略语法和词序。
- 参数调优:通过设置停用词(如常见无意义词)和词频阈值来优化。
- 示例代码:
from sklearn.feature_extraction.text import CountVectorizer corpus = ['我爱学习机器学习', '机器学习很有趣'] vectorizer = CountVectorizer(stop_words=['的', '是']) # 设置停用词 X_counts = vectorizer.fit_transform(corpus) print(vectorizer.get_feature_names_out()) # 输出词汇表
TfidfVectorizer(TF-IDF)
TF-IDF(词频-逆文档频率)改进词袋模型,通过加权减少常见词的影响,突出重要词。
- 示例代码:
from sklearn.feature_extraction.text import TfidfVectorizer vectorizer = TfidfVectorizer(stop_words=['的', '是']) X_tfidf = vectorizer.fit_transform(corpus)
图像特征提取
图像特征提取将图像数据转换为数值特征,方法包括基础像素特征和更高级的HOG特征。
基础像素特征
将图像像素值展平为一维向量。假设图像已预处理为NumPy数组。
- 示例代码:
import numpy as np from PIL import Image # 加载图像并展平像素 img = Image.open('image.jpg').convert('L') # 转换为灰度 img_array = np.array(img).flatten() # 展平为向量
HOG(Histogram of Oriented Gradients)特征
HOG特征捕捉图像边缘方向信息,常用于对象检测。在Scikit-learn中,可以使用skimage.feature.hog或其他库生成HOG特征,然后与Scikit-learn模型结合。
- 示例代码(使用scikit-image):
from skimage.feature import hog from skimage import data, color image = color.rgb2gray(data.astronaut()) # 示例图像 hog_features = hog(image, orientations=9, pixels_per_cell=(8, 8), cells_per_block=(2, 2))
特征提取器的参数调优
参数调优能显著提升特征提取效果,尤其在文本特征中常见。
- 停用词:移除无关词汇,减小特征维度,如英语中的“the”、“and”。在Scikit-learn中,通过
stop_words参数设置内置列表或自定义列表。 - 词频阈值:使用
min_df(最小文档频率)和max_df(最大文档频率)过滤罕见或常见词。例如,min_df=0.01忽略出现在少于1%文档中的词。 - 示例:结合之前文本提取,优化停用词和词频。
vectorizer = TfidfVectorizer(stop_words='english', min_df=0.01, max_df=0.95) X_optimized = vectorizer.fit_transform(corpus)
总结
特征提取是机器学习成功的关键一环。Scikit-learn提供了丰富的工具来处理不同类型的数据。实践时,先从基础方法开始,逐步尝试参数调优以优化性能。下一章将深入讨论特征选择和降维技术,进一步提升你的模型。
提示:在实际项目中,总是通过交叉验证和评估指标来调整参数,避免过拟合。