Scikit-learn Python机器学习 - 字典特征提取-DictVectorizer
锋哥原创的Scikit-learn Python机器学习视频教程:
2026版 Scikit-learn Python机器学习 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili
课程介绍
本课程主要讲解基于Scikit-learn的Python机器学习知识,包括机器学习概述,特征工程(数据集,特征抽取,特征预处理,特征降维等),分类算法(K-临近算法,朴素贝叶斯算法,决策树等),回归与聚类算法(线性回归,欠拟合,逻辑回归与二分类,K-means算法)等。
字典特征提取-DictVectorizer
将特征名称和值映射为字典的列表转换为数值矩阵,非常适合处理混合类型的特征。
DictVectorizer
是一个非常有用的工具,它用于将特征名称到特征值的映射字典(例如列表)转换为 scikit-learn 模型可以使用的数值矩阵。它的强大之处在于能同时处理分类特征(进行One-Hot编码)和数值特征(保持原值),非常适用于处理混合类型的特征或从类似JSON结构的数据中提取特征。
核心参数详解
-
dtype
(默认numpy.float64
)
-
作用: 指定输出数组的数据类型。
-
说明: 为了节省内存,你可以将其设置为更小的数值类型,例如
np.float32
或np.int32
。因为特征矩阵中会包含原始的数值型特征,所以通常不使用bool
类型。
-
separator
(默认=
)
-
作用: 用于构造输出矩阵中特征名称的分隔符字符串。当转换分类特征时,
DictVectorizer
会生成形如[特征名][分隔符][类别名]
的新列名。 -
示例:
-
有一个特征
‘animal’
,其值为‘cat’
。 -
默认
separator=‘=’
会生成新特征名:‘animal=cat’
。 -
如果设置
separator=‘_’
,则会生成:‘animal_cat’
。
-
-
用途: 主要用于控制输出特征名的可读性和格式。
-
sparse
(默认True
)
-
作用: 决定转换后的输出是稀疏矩阵还是密集矩阵(numpy数组)。
-
可选值:
-
True
(默认): 返回scipy.sparse
稀疏矩阵。这是默认行为,因为One-Hot编码会产生大量0值,使用稀疏矩阵可以极大地节省内存。 -
False
: 返回常规的numpy.ndarray
密集数组。这样更易于查看和理解,但当特征维度很高时,可能会消耗巨大内存。
-
-
注意: 这个参数与新版
OneHotEncoder
的sparse_output
功能相同,但名称不同。
-
sort
(默认True
)
-
作用: 在拟合时是否对特征名称进行排序。
-
可选值:
-
True
(默认): 对生成的特征名称(列名)进行排序。这能保证每次运行的结果一致,可重现性好。 -
False
: 不排序,特征列的顺序将由Python字典的随机性决定(在Python 3.6+中,字典是有序的,但顺序取决于插入顺序)。通常不推荐设置为False
,除非你非常关心特征列的原始顺序。
-
我们来看一个示例:
from sklearn.feature_extraction import DictVectorizer# 示例数据,列表中的每个元素都是一个字典,代表一个样本
data = [{'age': 25, 'city': 'New York', 'income': 50000},{'age': 30, 'city': 'Boston', 'income': 65000},{'age': 35, 'city': 'New York', 'income': 75000}
]# 初始化 DictVectorizer
dict_vectorizer = DictVectorizer(sparse=True)# 学习并转换数据
X_dict = dict_vectorizer.fit_transform(data)print("转换后的特征矩阵:")
print(X_dict)
# 稀疏矩阵输出:
# Coords Values
# (0, 0) 25.0
# (0, 2) 1.0
# (0, 3) 50000.0
# (1, 0) 30.0
# (1, 1) 1.0
# (1, 3) 65000.0
# (2, 0) 35.0
# (2, 2) 1.0
# (2, 3) 75000.0print("\n特征名称:")
print(dict_vectorizer.get_feature_names_out())
# 输出:['age', 'income', 'city=Boston', 'city=New York']
# 它自动将数值型特征 'age', 'income' 保留,将类别型特征 'city' 进行了 One-Hot 编码。