特征工程中的三大向量化工具详解
在文本处理和特征工程中,`TfidfVectorizer`、`CountVectorizer` 和 `DictVectorizer` 是常用的工具,用于将原始数据转换为机器学习模型可用的数值特征。以下是它们的核心区别、用法及示例:
1. CountVectorizer(词频向量化)
功能与原理
- 作用:将文本转换为词频矩阵,统计每个词在文档中的出现次数。
- 核心步骤:
- 分词:将文本按空格或规则切分为单词。
- 构建词表:基于所有文档生成词表(词汇表)。
- 生成词频矩阵:每行表示一个文档,每列表示一个词,值为词频。
关键参数
参数 | 说明 |
stop_words | 过滤停用词(如 "the", "is") |
max_features | 仅保留词表中前 N 个高频词 |
ngram_range | 是否提取 N-gram(如 (1,2) 包含单词和双词组合) |
token_pattern | 通过正则表达式控制分词规则(如 r"(?u)\b\w\w+\b" 过滤单字词)。 |
示例代码
from sklearn.feature_extraction.text import CountVectorizer
corpus = ["I love machine learning.","Machine learning is fun!","I hate boring lectures."
]
# 初始化向量化器
vectorizer = CountVectorizer(stop_words="english")
# # 调整参数:禁用停用词过滤,允许包含单字词
# vectorizer = CountVectorizer(
# stop_words=None, # 不过滤停用词
# token_pattern=r"(?u)\b\w+\b" # 允许单字词(如 "I")
# )
X = vectorizer.fit_transform(corpus)
# 输出词表和词频矩阵
print("词表:", vectorizer.get_feature_names_out())
print("词频矩阵:\n", X.toarray())
输出
词表: ['boring' 'fun' 'hate' 'learning' 'lectures' 'love' 'machine']
词频矩阵:[[0 0 0 1 0 1 1] # "love", "machine", "learning"[0 1 0 1 0 0 1] # "fun", "machine", "learning"[1 0 1 0 1 0 0]] # "boring", "hate", "lectures"
- 代码中设置了 stop_words="english",因此常见停用词(如 "I"、"is"、"." 等)被排除在词表外
- 词频矩阵的列数严格等于词表长度,每个列对应词表中的一个词,统计其在各文档中的出现次数。
2. TfidfVectorizer(TF-IDF 向量化)
功能与原理
- 作用:在词频基础上,计算 TF-IDF 值(词频-逆文档频率),衡量词的重要性。
- 公式:
- TF (词频):词在文档中的出现频率(频数 / 词表长度)。
- IDF (逆文档频率):log(总文档数 / 包含该词的文档数)。
- TF-IDF:TF * IDF,降低常见词的权重,突出重要词。
注意:TF-IDF值越低越重要(因为要做分类,值高了表明这个词出现太频繁了,不能作为分类的依据)
关键参数
与 CountVectorizer 相同,额外支持:
参数 | 说明 |
stop_words | 过滤停用词(如 "the", "is") |
max_features | 仅保留词表中前 N 个高频词 |
ngram_range | 是否提取 N-gram(如 (1,2) 包含单词和双词组合) |
token_pattern | 通过正则表达式控制分词规则(如 r"(?u)\b\w\w+\b" 过滤单字词)。 |
use_idf | 是否启用 IDF 计算(默认为 True) |
smooth_idf | 对 IDF 做平滑处理(避免除零错误) |
示例代码
from sklearn.feature_extraction.text import TfidfVectorizer
corpus = ["I love machine learning.","Machine learning is fun!","I hate boring lectures."
]
# 初始化 TF-IDF 向量化器
vectorizer = TfidfVectorizer(stop_words="english")
X = vectorizer.fit_transform(corpus)
# 输出 TF-IDF 矩阵
print("TF-IDF 矩阵:\n", X.toarray().round(2))
输出
TF-IDF 矩阵:[[0. 0. 0. 0. 0.85 0.53] # "love" 和 "machine"("machine" 在多个文档出现,权重较低)[0. 0.74 0. 0. 0. 0.67] # "fun" 和 "machine"[0.66 0. 0.52 0.52 0. 0. ]] # "boring", "hate", "lectures"
3. DictVectorizer(字典向量化)
功能与原理
- 作用:将 字典形式 的特征数据转换为数值矩阵,支持混合类型特征(数值型 + 类别型)。
- 核心步骤:
关键参数
参数 | 说明 |
sparse | 是否返回稀疏矩阵(默认为 True) |
示例代码
from sklearn.feature_extraction import DictVectorizer
data = [{"age": 25, "gender": "M", "city": "Beijing"},{"age": 30, "gender": "F", "city": "Shanghai"},{"age": 28, "gender": "M", "city": "Guangzhou"}
]
# 初始化向量化器
vectorizer = DictVectorizer(sparse=False)
X = vectorizer.fit_transform(data)
# 输出特征名和矩阵
print("特征名:", vectorizer.get_feature_names_out())
print("数值矩阵:\n", X)
输出
特征名: ['age', 'city=Beijing', 'city=Guangzhou', 'city=Shanghai', 'gender=F', 'gender=M']
数值矩阵:[[25. 1. 0. 0. 0. 1.] # age=25, city=Beijing, gender=M[30. 0. 0. 1. 1. 0.] # age=30, city=Shanghai, gender=F[28. 0. 1. 0. 0. 1.]] # age=28, city=Guangzhou, gender=M
对比总结
工具 | 输入类型 | 核心功能 | 适用场景 |
CountVectorizer | 文本列表 | 生成词频矩阵 | 文本分类、词频分析 |
TfidfVectorizer | 文本列表 | 生成 TF-IDF 矩阵 | 文本分类、信息检索 |
DictVectorizer | 字典列表 | 将混合类型特征转换为数值矩阵 | 结构化数据(数值 + 类别特征) |
选择建议
1.文本数据:
- 简单词频统计 → CountVectorizer
- 需要评估词重要性 → TfidfVectorizer
2. 结构化数据:
- 包含数值和类别特征 → DictVectorizer
3.高维稀疏数据:
- 优先使用 sparse=True 节省内存。