机器学习基础之《特征工程(2)—特征工程介绍、特征抽取》

news2024/9/25 13:24:08

一、什么是特征工程

机器学习领域的大神Andrew Ng(吴恩达)老师说“Coming up with features is difficult, time-consuming, requires expert knowledge. “Applied machine learning” is basically feature engineering. ”
注:业界广泛流传:数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已

特征工程是使用专业背景知识和技巧处理数据,使得特征能在机器学习算法上发挥更好的作用的过程
意义:会直接影响机器学习的效果

二、用什么做特征工程

目前就是sklearn

三、特征工程的位置与数据处理的比较

1、pandas
一个数据读取非常方便以及基本的处理格式的工具

2、sklearn
对于特征的处理提供了强大的接口

3、特征工程包含内容
(1)特征抽取
(2)特征预处理
(3)特征降维

4、特征抽取/特征提取
比如有一篇英文短文,要对文章进行分类:
机器学习算法 -- 统计方法 -- 数学公式
数学公式不能处理字符串,要把文本字符串转换成数值的类型
问题:文本类型转换成数值怎么转?

分类船仓位
问题:类型转换成数值?
onehot编码或者哑变量

四、特征提取

1、什么是特征提取
将任意数据(如文本或图像)转换为可用于机器学习的数字特征
注:特征值化是为了计算机更好的去理解数据
(1)字典特征提取(特征离散化)
(2)文本特征提取
(3)图像特征提取(深度学习将介绍)

2、特征提取API
sklearn.feature_extraction

五、字典的特征提取

sklearn.feature_extraction.DictVectorizer(sparse=True, ...)
作用:对字段数据进行特征值化

说明:
vector 数学里是向量,物理里是矢量
matrix 矩阵,二维数组
如果将向量存储在计算机中,可以用一维数组来存储

1、DicVectorizer.fit_transform(X)
X:字段或者包含字典的迭代器
返回值:返回sparse矩阵

2、DicVectorizer.inverse_transform(X)
X:array数组或者sparse矩阵
返回值:转换之前数据格式

3、DicVectorizer.get_feature_names()
返回值:返回类别名称

4、例子
我们对以下数据进行特征提取

[{'city': '北京','temperature':100}
{'city': '上海','temperature':60}
{'city': '深圳','temperature':30}]

上面一行代表feature_names,下面三行就是data
解释一下,如果有三个城市就有3个0,字典排列顺序是几第几个0就变成1,有点像二进制编码
样本是一个三行两列的矩阵,当进行字典特征抽取之后,样本量变成4列了
把城市类别转换成了one-hot编码

5、修改day01_machine_learning.py

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction import DictVectorizer

def datasets_demo():
    """
    sklearn数据集使用
    """
    #获取数据集
    iris = load_iris()
    print("鸢尾花数据集:\n", iris)
    print("查看数据集描述:\n", iris["DESCR"])
    print("查看特征值的名字:\n", iris.feature_names)
    print("查看特征值几行几列:\n", iris.data.shape)
   
    #数据集的划分
    x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=22)
    print("训练集的特征值:\n", x_train, x_train.shape)

    return None

def dict_demo():
    """
    字典特征抽取
    """
    data = [{'city': '北京','temperature':100},{'city': '上海','temperature':60},{'city': '深圳','temperature':30}]
    # 1、实例化一个转换器类
    transfer = DictVectorizer()

    # 2、调用fit_transform()
    data_new = transfer.fit_transform(data)
    print("data_new:\n", data_new)

    return None

if __name__ == "__main__":
    # 代码1:sklearn数据集使用
    #datasets_demo()
    # 代码2:字典特征抽取
    dict_demo()

运行结果:

data_new:
   (0, 1)	1.0
  (0, 3)	100.0
  (1, 0)	1.0
  (1, 3)	60.0
  (2, 2)	1.0
  (2, 3)	30.0

为什么是这个结果:
这个API将X传进来之后,返回sparse矩阵(sparse英文是稀疏的意思,就是稀疏矩阵)
如果设置:transfer = DictVectorizer(sparse=False)
就会得到预想的结果:

data_new:
 [[  0.   1.   0. 100.]
 [  1.   0.   0.  60.]
 [  0.   0.   1.  30.]]

怎么看稀疏矩阵:某些矩阵中,非0元素远少于0元素。典型存储方法:三元组法,(行,列,元素值)
就是标注了稀疏矩阵中的非零元素的位置以及对应的值,通俗点讲:0行1列的数值是1,在预想结果里就能找到
好处是节省内存,提高加载效率

增加打印特征名:

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction import DictVectorizer

def datasets_demo():
    """
    sklearn数据集使用
    """
    #获取数据集
    iris = load_iris()
    print("鸢尾花数据集:\n", iris)
    print("查看数据集描述:\n", iris["DESCR"])
    print("查看特征值的名字:\n", iris.feature_names)
    print("查看特征值几行几列:\n", iris.data.shape)
   
    #数据集的划分
    x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=22)
    print("训练集的特征值:\n", x_train, x_train.shape)

    return None
 
def dict_demo():
    """
    字典特征抽取
    """
    data = [{'city': '北京','temperature':100},{'city': '上海','temperature':60},{'city': '深圳','temperature':30}]
    # 1、实例化一个转换器类
    transfer = DictVectorizer(sparse=False)

    # 2、调用fit_transform()
    data_new = transfer.fit_transform(data)
    print("data_new:\n", data_new)
    print("特征名字:\n", transfer.get_feature_names())

    return None

if __name__ == "__main__":
    # 代码1:sklearn数据集使用
    #datasets_demo()
    # 代码2:字典特征抽取
    dict_demo()
data_new:
 [[  0.   1.   0. 100.]
 [  1.   0.   0.  60.]
 [  0.   0.   1.  30.]]
特征名字:
 ['city=上海', 'city=北京', 'city=深圳', 'temperature']

六、文本特征提取

1、作用
对文本数据进行特征值化
单词作为特征,特征词

2、方法一:CountVectorizer
sklearn.feature_extraction.text.CountVectorizer(stop_words=[])
返回值:返回词频矩阵

3、CountVectorizer.fit_transform(X)
X:文本或者包含文本字符串的可迭代对象
返回值:返回sparse矩阵

4、CountVectorizer.inverse_transform(X)
X:array数组或者sparse矩阵
返回值:转换之前的数据格式

5、CountVectorizer.get_feature_names()
返回值:单词列表

6、例子
我们对一下数据进行特征提取

["life is short,i like python",
"life is too long,i dislike python"]

为什么没有i,因为api设计的时候认为单词做分类或情感分析意义不大

7、修改day01_machine_learning.py

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction import DictVectorizer
from sklearn.feature_extraction.text import CountVectorizer

def datasets_demo():
    """
    sklearn数据集使用
    """
    #获取数据集
    iris = load_iris()
    print("鸢尾花数据集:\n", iris)
    print("查看数据集描述:\n", iris["DESCR"])
    print("查看特征值的名字:\n", iris.feature_names)
    print("查看特征值几行几列:\n", iris.data.shape)
   
    #数据集的划分
    x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=22)
    print("训练集的特征值:\n", x_train, x_train.shape)

    return None
 
def dict_demo():
    """
    字典特征抽取
    """
    data = [{'city': '北京','temperature':100},{'city': '上海','temperature':60},{'city': '深圳','temperature':30}]
    # 1、实例化一个转换器类
    transfer = DictVectorizer(sparse=False)

    # 2、调用fit_transform()
    data_new = transfer.fit_transform(data)
    print("data_new:\n", data_new)
    print("特征名字:\n", transfer.get_feature_names())

    return None

def count_demo():
    """
    文本特征抽取
    """
    data = ["life is short,i like like python", "life is too long,i dislike python"]
    # 1、实例化一个转换器类
    transfer = CountVectorizer()
    # 2、调用fit_transform()
    data_new = transfer.fit_transform(data)
    print("data_new:\n", data_new.toarray())
    print("特征名字:\n", transfer.get_feature_names()) 

    return None


if __name__ == "__main__":
    # 代码1:sklearn数据集使用
    #datasets_demo()
    # 代码2:字典特征抽取
    #dict_demo()
    # 代码3:文本特征抽取
    count_demo()

运行结果:

data_new:
 [[0 1 1 2 0 1 1 0]
 [1 1 1 0 1 1 0 1]]
特征名字:
 ['dislike', 'is', 'life', 'like', 'long', 'python', 'short', 'too']

统计每个样本特征词出现的个数

8、中文文本特征抽取

问题:如果我们将数据替换成中文?
那么得到的结果是把整句作为了一个词,手工打空格则不支持单个中文词!
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/731632.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

看完这篇 教你玩转渗透测试靶机Vulnhub——Hackable: III

Vulnhub靶机hackableII渗透测试详解 Vulnhub靶机介绍:Vulnhub靶机下载:Vulnhub靶机安装:Vulnhub靶机漏洞详解:①:信息收集:②:端口敲门:③:SSH暴力破解:④&am…

java入门概念个人理解之package与import浅析

java入门概念个人理解之package与import浅析 由于近来学习java,遇到了一些在c上没有的概念,将它记http://录下,以自己复习使用,如有不理解妥之处,望大家批评指导。资料均由网上经过自己整合理解而来,如有侵…

Permission denied (publickey,password)问题的解决办法

[15:29:00.146] Terminal shell path: C:\WINDOWS\System32\cmd.exe [15:29:01.703] > root59.110.21.45: Permission denied (publickey,password). 解决: RSA key 登录方法/home/user/ 目录下建立 .ssh/ 文件夹 cd ~/ mkdir .ssh # 注意.ssh文件夹的权限 ch…

STM32+PWM+输入捕获测频

外部时钟,主频64M 定时器1 通道1发出PWM波 频率1K 定时器2 通道1输入捕获,上升沿触发 串口 /* USER CODE BEGIN 0 */ uint32_t time_up_num0;//上升沿计数 float time_frequency;//频率 /* USER CODE END 0 */ 初始换打开定时器 /* USER CODE BEGIN 2 …

ubuntu系统字体太小调整方法,亲测有效,2分钟解决!

背景:我们在ubuntu系统下写程序时,文件夹及文档的字体太小,看起来很累眼,现将字体调大方法记录如下,只需2分钟即可解决!! 1、打开终端,安装gnome-tweaks sudo apt install gnome-t…

express框架使用express-generator工具

1.全局安装 npm install -g express-generator 2.检测是否安装成功 express -h 3. 快速创建Express应用程序的工具 express -e express-generator 说明:express-e和express-generator都是用于快速创建Express应用程序的工具。express-e是一个命令行工具&#xff0…

基于深度学习的高精度球场足球检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要:基于深度学习的高精度球场足球检测识别系统可用于日常生活中或野外来检测与定位球场足球目标,利用深度学习算法可实现图片、视频、摄像头等方式的球场足球目标检测识别,另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5…

什么是操作系统

操作系统(Operating System) 什么是操作系统 操作系统是一组做计算机资源管理的软件的统称。目前常见的操作系统有:Windows系列、Unix系列、Linux系列、OSX系列、Android系列、iOS系列、鸿蒙等 操作系统的定位 操作系统的基本功能 操作系统由…

【报告】从GLM-130B到ChatGLM:大模型预训练与微调学习记录

本文主要是记录《【报告】从GLM-130B到ChatGLM:大模型预训练与微调》此次讲座的汇报内容,如有不适请联系删除即可,总结记录内容纯粹为了后面学习使用方便,文档性质的资料还是要比看视频更加方便的。

将Json结构展平

前言 技术群里面一个哥们在群里提了一个问题,怎么把Json的树形结构展平成一层 在线Json格式化工具 将这个JSON 展平成这样 代码 使用方法 static void Main(string[] args) {//将测试对象转换成测试Jsonvar json JsonConvert.SerializeObject(new{Id 1,Name …

【数据分析 - 基础入门之NumPy⑤】NumPy基本操作 - 二

知识目录 前言一、聚合函数二、矩阵操作2.1 算术运算2.2 线性代数2.3 其他数学操作 三、广播机制3.1 广播的原则3.2 案例 四、排序五、文件操作结语相关导读 前言 大家好!本期给大家带来的是【数据分析 - 基础入门之NumPy⑤】NumPy基本操作 - 二,收录于…

t113i不查网线启动,内核[ cut here ]崩溃问题解决

前言 环境介绍: 1.编译环境 Ubuntu 18.04.5 LTS 2.SDK T113-i_v1.0 3.单板 迅龙TLT113-EVM-A1.1-000 自制底板 # 一、现象 插上网线启动,内核打印信息正常 不插网线启动,内核存在CPU崩溃打印[ cut here ] 二、问题根因 根据错误…

超详细JDK下载与安装步骤

目录 一、创建软件文件夹 二、安装软件 三、配置环境变量 四、 测试环境变量 一、创建软件文件夹 c盘目录创建devloop/Java/jdk1.8文件夹和devloop/Java/jre1.8文件夹 二、安装软件 打开jdk安装包 选择下一步 三、配置环境变量 右击此电脑,点击属性 点击高级系…

leetcode 513. 找树左下角的值

2023.7.7 题意要求是最底层的节点,则用层序遍历是最合适的,每一层遍历将元素放入一个数组中,等到最后一层遍历完之后,取这个数组的第一个元素即为所求节点值。 下面上代码: class Solution { public:int findBottomLe…

OpenCV在一张图片上以不同的透明度添加另一张图片

// 包含必要的OpenCV头文件 #include <opencv2/opencv.hpp> #include <opencv2/highgui/highgui.hpp> using namespace cv;// 定义全局变量 #define WINDOW_NAME "线

ACL 2023|如何智能生成吸引人又符合实际的标题?

夕小瑶科技说 原创 作者 | 小戏、Python 标题生成&#xff0c;乍一看似乎并不是一个复杂的任务&#xff0c;要数据简单的爬虫就可以获得许多标题-文本对&#xff0c;要评价通过用户点击与浏览的次数就多少可以区分“好标题”与“坏标题”&#xff0c;万事俱备使用一些经典的监…

Tomcat安装与配置(详细教程)

一、安装Tomcat服务器 1.下载地址&#xff08;Tomcat官网&#xff09;http://tomcat.apache.org/ 2.将下载的zip文件解压到指定的目录&#xff08;例如&#xff1a;D盘&#xff0c;目录不要有中文&#xff09; D:\apache-tomcat-9.0.43 二、配置Tomcat环境变量 &#xff08;…

Scrap爬虫框架集成Selenium来解析动态网页

1、爬虫项目单独使用scrpay框架的不足 当前网站普遍采用了javascript 动态页面&#xff0c;特别是vue与react的普及&#xff0c;使用scrapy框架定位动态网页元素十分困难&#xff0c;而selenium是最流行的浏览器自动化工具&#xff0c;可以模拟浏览器来操作网页&#xff0c;解…

金融时间序列预测方法合集:CNN、LSTM、随机森林、ARMA预测股票价格(适用于时序问题)、相似度计算、各类评判指标绘图(数学建模科研适用)

项目设计集合&#xff08;人工智能方向&#xff09;&#xff1a;助力新人快速实战掌握技能、自主完成项目设计升级&#xff0c;提升自身的硬实力&#xff08;不仅限NLP、知识图谱、计算机视觉等领域&#xff09;&#xff1a;汇总有意义的项目设计集合&#xff0c;助力新人快速实…

Junit 快速入门

✏️作者&#xff1a;银河罐头 &#x1f4cb;系列专栏&#xff1a;JavaEE &#x1f332;“种一棵树最好的时间是十年前&#xff0c;其次是现在” 目录 为什么学 JunitJunit 相关技术注解TestDisabledBeforeAll, AfterAllBeforeEach, AfterEach 参数化单参数CSV 获取参数多参数方…