字典特征抽取的应用场景: - 数据集当中,类别特征比较多的情况下 - 将数据集的特征转换为字典类型 - DictVectorizer转换 - 如果本身拿到的数据就是字典类型,则使用字典特征抽取。
先导包:import sklearn 特征提取api:sklearn.feature_extraction 字典特征抽取: -- 属于类别的特征,转化为one-hot编码 sklearn.feature_extraction.DictVectorizer() # 形成一个转换器,将字典转化为数值 - vector 数学里叫向量,物理里叫矢量 - 矩阵 matrix 二维数组 - 向量 vector 一维数组 - DictVectorizer() 实例化 - DictVectorizer.fit_transform(X), 字典或者包含字典的迭代器放进去。返回值返回的是 sparse矩阵 - DictVectorizer.inverse_transform(X), X 是 array 数组或者 sparse 矩阵,返回值是 转换之前的数据格式 - DictVectorizer.get_feature_names(), 返回类别名称
举例子:
from sklearn import feature_extraction
def dict_demo():
"""
字典特征抽取
:return:
"""
data = [{"city": "shanghai", "temperature": 40},
{"city": "beijing", "temperature": 30},
{"city": "shenzhen", "temperature": 60}]
# 实例化一个转换器类
DictVectorizer = feature_extraction.DictVectorizer(sparse=False)
# 调用 fit_transform 方法,将字典转化为数值
data_new = DictVectorizer.fit_transform(data) # 返回一个 sparse 矩阵
"""
data_new is:
(0, 1) 1.0
(0, 3) 40.0
(1, 0) 1.0
(1, 3) 30.0
(2, 2) 1.0
(2, 3) 60.0
上述是一个稀疏矩阵,稀疏矩阵是将非 0 值按位置表示出来,节省内存,提高加载效率。如果不想用这种形式出现,则在转换器中,将 sparse 设置为 false,则以二维数组的形式展现。
data_new is:
[[ 0. 1. 0. 40.]
[ 1. 0. 0. 30.]
[ 0. 0. 1. 60.]]
"""
print("data_new is: \n", data_new)
# 获取特征名字
# ['city=beijing', 'city=shanghai', 'city=shenzhen', 'temperature']
print("feature names is: \n", DictVectorizer.get_feature_names())
if __name__ == '__main__':
dict_demo()
feature names is:
['city=beijing', 'city=shanghai', 'city=shenzhen', 'temperature']
data_new is:
[[ 0. 1. 0. 40.]
[ 1. 0. 0. 30.]
[ 0. 0. 1. 60.]]
上面这两个矩阵的解释,data_new 是3行4列的矩阵,为什么呢?因为有 4 个特征,所以就有 4 列。
第一列,如果 city 是北京,则是 1,否则是 0。
第二列,如果 city 是上海,则是 1,否则是 0。
第三列,如果 city 是深圳,则是 1,否则是 0。
data = [{"city": "shanghai", "temperature": 40}, {"city": "beijing", "temperature": 30}, {"city": "shenzhen", "temperature": 60}]
我们的 data 数据,
第1个样本的 city 是上海,不是北京,所以0
第2个样本的 city 是北京,是北京,所以1
第3个样本的 city 是 深圳,不是北京,所以0
所以data_new的第一列是 010。