计算机系统应用教程网站

网站首页 > 技术文章 正文

数据特征处理之字典型数据(One-hot编码)

btikc 2024-09-25 15:14:37 技术文章 18 ℃ 0 评论

数据源存储的数据格式有多种形式,如文本型,数值型,JSON…, 其中JSON类型数据在python中也被称为字典类型,本篇文章则介绍的是字典型数据的特征抽取(特征值化)


仍然是借助机器学习工具模块sklearn来完成字典型型数据的特征抽取

# -*- coding:utf-8 -*-

# @Author: 数据与编程之美
# @File: dictionary.py

from sklearn.feature_extraction import DictVectorizer

def dict():
    """
    字典型数据特征值化
    :return:
    """

    dic = DictVectorizer()

    data = dic.fit_transform([{'name': '李四', 'age': 18},
                              {'name': '张三', 'age': 30},
                              {'name': '王五', 'age': 21}])

    # 输出词条列表
    print(dic.get_feature_names())

    # 输出特征值化后的数据
    print(data)

if __name__ == "__main__":

    dict()

输出结果如下

结果分析说明:

转换后的数据结果是以坐标的形式来显示

上述的坐标值数据结构其实是一个稀疏矩阵(Sparse matrix),意思是元素大部分为零的矩阵,稀疏矩阵还有一个明显的特征就是只存储非零数据,这样做的目的是使运算速度更快和压缩存储达到节省空间,其实它和下图的本质是一样的

其中,行数是字典的个数,列数是转换后的特征列表值种类个数。

第0行,第0列存储的值是18,换种解释就是在第一个字典数据中,age值是18就转换为18

第0行,第1列存储的值是0,意思是第一个字典数据中,没有张三记为0

第0行,第2列存储的值是1,意思是第一个字典数据中,有李四记为1

第0行,第3列存储的值是0,意思是第一个字典数据中,没有王五记为0

规律:

1、字典类型数据中,数值型(age)在转换后的特征列表中是以key作为特征名称的,而对于(name)这样的文字型(类似的还有:性别)数据而是以每种value值作为单独的一个特征名称放入特征列表中;

2、典类型数据中,数值型数据是多少转换后的值就是多少,文本型有对应的值就用1表示,没有就用0来表示(专业术语叫:One-hot编码、热编码


平常呢,对于输出稀疏矩阵这样的结果看起来很不直观,此时我们给DictVectorizer()加上参数sparse=False,再看看下结果

此时结果已变为我们常见的二维矩阵形式

结果分析说明

在没有加入参数sparse=False之前,字典数据特征值化后的结果是一个稀疏矩阵(sparse matrix),加入参数后变成了我们常见的二维矩阵形式,其实这两者结果没有什么本质上不同,只不过稀疏矩阵是以坐标的形式展示数据,并且只显示数据不为0的坐标,这样做的目的是使节约内存以及快速读取计算。


针对上述提及的One-hot编码的处理风格,我们再看看个例子会更加理解

现有一数据集如下:

特征有:name、Sex、Hobby、Height等。对于这样的数据是不能输入到算法中的,有时候我们会给每种数据做一个标记,如种类特别多的标记的数字也越多,此时对于这样数据集,因为0、1、2、3、4、5、6等标记的不同可能会产生优先级的臆想,为了消除这种现象,于是就有了One-hot编码,通过特征重构,将有的得标记为1,没有的标记为0。


以上内容就是字典型数据进行特征值化的具体操作方法,案例很简单,思想很重要。

---END---

首发地址: 公众号:数据与编程之美

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表