3.特征工程-特征抽取、特征预处理、特征降维

news2024/12/26 11:57:13

文章目录

  • 环境配置(必看)
  • 头文件引用
    • 1.数据集: sklearn
      • 代码
      • 运行结果
    • 2.字典特征抽取: DictVectorizer
      • 代码
      • 运行结果
        • 稀疏矩阵
    • 3.文本特征抽取(英文文本): CountVectorizer()
      • 代码
      • 运行结果
    • 4.中文文本分词(中文文本特征抽取使用)
      • 代码
      • 运行结果
    • 5.中文文本特征抽取
      • 代码
      • 运行结果
    • 6.文本特征抽取: TfidfVectorizer
      • 代码
      • 运行结果
    • 7.归一化:MinMaxScaler
      • 代码
      • 运行结果
    • 8.标准化: StandardScaler
      • 代码
      • 运行结果
    • 9.过滤低方差特征: VarianceThreshold
      • 代码
      • 运行结果
        • 结果1:threshold=0时运行的结果
        • 结果2:threshold=10时运行的结果
    • 10.数据降维: StandardScaler
      • 代码
      • 运行结果
      • n_components=2
      • n_components=0.95 代表保留95%的特征
  • 本章学习资源

环境配置(必看)

Anaconda-创建虚拟环境的手把手教程相关环境配置看此篇文章,本专栏深度学习相关的版本和配置,均按照此篇文章进行安装。

头文件引用

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, TfidfVectorizer
from sklearn.preprocessing import MinMaxScaler, StandardScaler
from sklearn.decomposition import PCA
from sklearn.feature_selection import VarianceThreshold
from scipy.stats import pearsonr
import pandas as pd
import jieba

1.数据集: sklearn

代码

1.load_iris() 获取鸢尾花数据集,数据集的形状为(150, 4)
2.train_test_split()调用划分数据集的函数,test_size=0.2意思是将150个数据中的20%划分为测试集,剩下的80%为训练集。从代码运行的图中 x_train.shape: (120, 4)可以看出,训练集为150 * 0.8 = 120个
3.其他的打印,可以自己运行程序去看一下

def datasets_demo():
    """
    获取鸢尾花数据集
    :return:
    """
    # 获取鸢尾花数据集
    iris = load_iris()
    print(f"鸢尾花数据集的返回值: {iris}")
    # print("查看数据集描述: \n", iris["DESCR"])
    print(f"查看特征值的名字:{iris.feature_names}")
    # print(f"查看特征值:{iris.data} \n 特征值的形状:{iris.data.shape}")
    print(f"标签组:{iris.target}")
    print(f"标签名:{iris.target_names}")

    # 数据集划分 特征数据 目标数据 测试集比例 随机种子
    x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=20)
    print(f"x_train: \n {x_train} \n x_train.shape: {x_train.shape}")
    return None

运行结果

鸢尾花数据集的返回值:
在这里插入图片描述
在这里插入图片描述

查看特征值的名字、标签组、标签名
在这里插入图片描述
划分数据集后,训练集的形状
在这里插入图片描述

2.字典特征抽取: DictVectorizer

代码

1.从运行结果可以看出,'city’有北京、上海、深圳三个类别,对应one-hot编码就是001 010 100三种情况;'temperature’只有就是顺应数值。
2.DictVectorizer()默认返回的是稀疏矩阵,结果在下边的运行结果中。其中的:
(0, 1) 1.0
(1, 0) 1.0
(2, 2) 1.0
可以看出是对应非稀疏矩阵的坐标位置。
3.数据需要处理成字典的类型才可以使用DictVectorizer()

def dict_demo():
    """
    字典特征抽取: DictVectorizer
    :return:
    """
    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

运行结果

在这里插入图片描述

稀疏矩阵

在这里插入图片描述

3.文本特征抽取(英文文本): CountVectorizer()

代码

1.CountVectorizer()没有像DictVectorizer()通过输入参数来控制是否返回稀疏矩阵,而是通过data_new.toarray()来转换为非稀疏矩阵
2.CountVectorizer(stop_words=[“is”, “too”]),可以通过入参stop_words=[“is”, “too”]来控制不统计某些单词。

def count_demo():
    """
    文本特征抽取: CountVectorizer
    :return:
    """
    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)
    # data_new.toarray()生成非稀疏矩阵
    print("data_new:\n", data_new.toarray())
    print("特征名字: \n", transfer.get_feature_names())
    return None

运行结果

在这里插入图片描述

4.中文文本分词(中文文本特征抽取使用)

代码

1.运行函数: cut_word(“我爱北京天安门”), 得到运行结果

def cut_word(text):
    """
    中文分词: 我爱北京天安门
    :param text:
    :return:
    """
    # jieba.cut(text)对字符串进行分词处理
    # " ".join() 转换为字符串
    tmp = " ".join(list(jieba.cut(text)))
    print(f"{tmp}\n{type(tmp)}")

    return tmp

运行结果

在这里插入图片描述

5.中文文本特征抽取

代码

1.需要调用cut_word()进行分词,然后再进行特征抽取
2.中文文本特征抽取与英文文本抽取唯一的不同就是分词,后续是一样的处理
3.与TfidfVectorizer()计算出的结果不同,CountVectorizer()统计的是特征出现的个数,TfidfVectorizer()统计的是特征的重要程度

def count_chinses_demo():
    """
    中文文本特征提取,自动分词
    :return:
    """
    # 将中文文本进行分词
    data = ["一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。",
            "我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。",
            "如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]

    data_new = []
    for sent in data:
        data_new.append(cut_word(sent))

    print(f"data_new = \n{data_new}")
    # 1.实例化一个转换器类
    transfer = CountVectorizer()
    # 2.调用fit_transform()
    data_final = transfer.fit_transform(data_new)
    # data_final.toarray()生成非稀疏矩阵
    print("data_final:\n", data_final.toarray())
    print("特征名字: \n", transfer.get_feature_names())
    
    return None

运行结果

在这里插入图片描述

6.文本特征抽取: TfidfVectorizer

代码

1.TfidfVectorizer(stop_words=[“is”, “too”]),可以通过入参stop_words=[“is”, “too”]来控制不统计某些单词。
2.计算出的结果矩阵,是代表各个特征的重要程度

def tfidf_demo():
    """
    用TF-IDF的方法进行文本特征抽取
    :return:
    """
    # 将中文文本进行分词
    data = ["一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。",
            "我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。",
            "如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]

    data_new = []
    for sent in data:
        data_new.append(cut_word(sent))

    # 1.实例化一个转换器类
    transfer = TfidfVectorizer()
    # 2.调用fit_transform()
    data_final = transfer.fit_transform(data_new)
    print("data_final:\n", data_final.toarray())
    print("特征名字: \n", transfer.get_feature_names())
    return None

运行结果

在这里插入图片描述

7.归一化:MinMaxScaler

代码

1.需要dating.txt数据的可以把邮箱留在评论区
2.如果样本的最大值或者最小值是异常点,对归一化的结果有很大的影响,所以对数据进行处理更建议使用下边的标准化

def minmax_demo():
    """
    归一化
    :return:
    """
    # 1、获取数据
    data = pd.read_csv("dating.txt")
    # 获取前3列数据
    data = data.iloc[:, :3]
    # print("data:\n", data)

    # 2、实例化一个转换器类
    # feature_range=[2, 3] 归一化放缩的范围[2, 3]
    transfer = MinMaxScaler(feature_range=[2, 3])

    # 3、调用fit_transform
    # data数据的形状(n_samples, n_features)  行:样本数   列:特征数
    data_new = transfer.fit_transform(data)
    print("data_new:\n", data_new)

    return None

运行结果

可以看到归一化后的数值全部在[2, 3]范围内,通过MinMaxScaler的入参feature_range=[2, 3]来进行调整
在这里插入图片描述

8.标准化: StandardScaler

代码

1.处理之后,对于每列来说,所有数据都聚集在均值为0,标准差为1的附近

def stand_demo():
    """
    标准化
    :return:
    """
    # 1、获取数据
    data = pd.read_csv("dating.txt")
    data = data.iloc[:, :3]
    # print("data:\n", data)

    # 2、实例化一个转换器类
    transfer = StandardScaler()

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

运行结果

在这里插入图片描述

9.过滤低方差特征: VarianceThreshold

代码

1.pearsonr()得出皮尔逊相关系数,相关系数r的值介于-1至1之间

  1. r > 0,表示两变量正相关, r < 0,两变量负相关;
  2. |r| = 1,表示两变量为完全正相关, r = 0,表示两变量无相关关系;
    2.相关系数,只看第一个值即可,不需要看第二个值。例如:
    相关系数: (-0.004389322779936271, 0.8327205496564927)
    只看-0.004389322779936271即可。
def variance_demo():
    """
    过滤低方差特征
    :return:
    """
    # 1、获取数据
    data = pd.read_csv("factor_returns.csv")
    data = data.iloc[:, 1:-2]
    print("data:\n", data)

    # 2、实例化一个转换器类
    transfer = VarianceThreshold(threshold=10)

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

    # 计算某两个变量之间的相关系数
    r1 = pearsonr(data["pe_ratio"], data["pb_ratio"])
    print("相关系数:\n", r1)
    r2 = pearsonr(data['revenue'], data['total_expense'])
    print("revenue与total_expense之间的相关性:\n", r2)

    return None

运行结果

结果1:threshold=0时运行的结果

可以看到数据原本是具有9个特征,设置threshold=0后,过滤掉0个特征,还剩下9个特征
在这里插入图片描述

结果2:threshold=10时运行的结果

可以看到数据原本是具有9个特征,设置threshold=10后,过滤掉2个特征,还剩下7个特征
在这里插入图片描述

10.数据降维: StandardScaler

StandardScaler()的作用:数据维数压缩,尽可能降低原数据的维数(复杂度),损失少量的信息

代码

1.n_components=2减少到2个特征,代码中是将4个特征减少到2个特征

def pca_demo():
    """
    PCA降维:主成分分析
    :return:
    """
    data = [[2, 8, 4, 5], [6, 3, 0, 8], [5, 4, 9, 1]]

    # 1.实例化一个转换器类
    # n_components 1.整数:留下特征数   2.小数: 保留特征的百分比
    transfer = PCA(n_components=2)
    # 2.调用fit_transform()
    data_new = transfer.fit_transform(data)
    print("data_new:\n", data_new)

    return None

运行结果

n_components=2

在这里插入图片描述

n_components=0.95 代表保留95%的特征

从结果看,保留95%的信息依旧还保留2个特征,说明这个PCA的方法还是不错的!
在这里插入图片描述

本章学习资源

黑马程序员3天快速入门python机器学习
我是跟着视频进行的学习,欢迎大家一起来学习!

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

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

相关文章

一款功能强大且免费的Windows系统优化工具

TweakPower是一款功能强大的Windows系统优化工具&#xff0c;旨在帮助用户提升电脑性能、清理垃圾文件、备份数据以及修复系统问题。该软件提供了多种实用功能&#xff0c;包括内存管理、垃圾清理、数据备份、数据擦除、硬盘维护和性能调度调整等。 TweakPower的主要界面或仪表…

如意玲珑支持发行版再添新成员,openEuler安装使用如意玲珑操作指南

查看原文 如意玲珑&#xff08;Linyaps&#xff09;项目已与开放原子开源基金会完成捐赠协议签署&#xff0c;目前如意玲珑已成为基金会的正式孵化期项目。 如意玲珑是开源软件包格式&#xff0c;用于替代 deb、rpm等包管理工具&#xff0c;实现应用包管理、分发、容器、集成开…

数据产品价值评估体系搭建

00前言 随着数据在企业的重要性越来越高&#xff0c;数据赋予的价值和意义在企业内部也深入人心&#xff0c;不仅纳入到了企业战略中去&#xff0c;在日常的工作中&#xff0c;各个业务部门也会不断的提出五花八门的数据需求&#xff08;数据分析、数据治理、数据应用等等&…

qt-01安装

qt5.15安装 版本链接5.15Qt5.15.2镜像QTCreater Launching Debugger 错误 版本链接5.15 https://download.qt.io/archive/online_installers/4.5/ Qt5.15.2镜像 https://mirrors.tuna.tsinghua.edu.cn/qt/online/qtsdkrepository/windows_x86/desktop/qt5_5152/ https://m…

插入数据优化 ---大批量数据插入建议使用load

一.insert优化 1.批量插入 2.手动提交事务 3.主键顺序插入 二.大批量插入数据 如果一次性需要插入大批量数据,使用insert语句插入性能较低,此时可以使用MySQL数据库提供的load指令进行插入。操作如下 1.客户端连接服务端时,加入参数 --local-infine mysql --local-infine…

AllReduce通信库;Reduce+LayerNorm+Broadcast 算子;LayerNorm(层归一化)和Broadcast(广播)操作;

目录 AllReduce通信库 一、定义与作用 二、常见AllReduce通信库 三、AllReduce通信算法 四、总结 Reduce+LayerNorm+Broadcast 算子 1. Reduce 算子 2. LayerNorm 算子 3. Broadcast 算子 组合作用 LayerNorm(层归一化)和Broadcast(广播)操作 提出的创新方案解析 优点与潜在…

私有化部署 Dify+Ollama并使用qwen2快速搭建 AI 应用

私有化部署 DifyOllama并使用qwen2快速搭建 AI 应用 Dify 是一款开源的大语言模型(LLM) 应用开发平台。它融合了后端即服务&#xff08;Backend as Service&#xff09;和 LLMOps 的理念&#xff0c;使开发者可以快速搭建生产级的生成式 AI 应用。即使你是非技术人员&#xff…

5.8软件工程基础知识-项目管理

项目管理 范围管理产品范围和项目范围管理过程WBS练习题 进度管理基本原则过程活动资源估算 软件规模估算方法进度安排关键路径法练习题 成本管理过程成本的类型练习题 软件配置管理配置项配置基线配置数据库练习题 质量管理过程质量模型软件评审软件容错技术练习题 风险管理宏…

java基础概念10-数组

一、什么是数组 二、数组的定义和初始化 2-1、数组的定义 2-2、数组的初始化 初始化&#xff1a;就是在内存中&#xff0c;为数组容器开辟空间&#xff0c;并将数据存入容器中的过程。 1、静态初始化 【注意】&#xff1a; 数字一旦初始化后&#xff0c;数组的长度不可改变&a…

Python 如何进行Web抓取(BeautifulSoup, Scrapy)

Web抓取&#xff08;Web Scraping&#xff09;是一种从网站提取数据的技术。Python有许多用于Web抓取的库&#xff0c;其中最常用的是BeautifulSoup和Scrapy。 BeautifulSoup BeautifulSoup是一个用于解析HTML和XML文档的Python库&#xff0c;适合处理简单的Web抓取任务。它将…

Occlusion in Augmented Reality

1.Occlusion in Augmented Reality 笔记来源&#xff1a; 1.Occlusion handling in Augmented Reality context 2.Occlusion in Augmented Reality 3.Real-Time Occlusion Handling in Augmented Reality Based on an Object Tracking Approach 4.Occlusion Matting: Realisti…

SQLTools插件下载与使用说明

SQLTools是一个专注于SQL优化与管理的plsql developer插件&#xff0c;目的是把一些常用的SQL收集在一起&#xff0c;方便快速解决问题&#xff0c;提高工作效率。 当在SQL或PACKAGE窗口,或者选中表时&#xff0c;会有两个右键菜单&#xff1a; SQLTools聚焦在SQL方面&#xf…

unity 程序做一个折叠菜单

第一次遇到这种需求&#xff0c;本来以为很难&#xff0c;没想到试了一下以后没啥难度&#xff0c;所以记录一下 首先新建一个scroll view&#xff0c;然后在content里面添加vertical layout group和content size fitter这两个组件。&#xff08;vertical layout group 的 spac…

前端常用的性能优化方案

目录 性能分析工具lighthouseWebpack Bundle分析 开发阶段按需引入路由懒加载 打包阶段打包配置减少包体积配置压缩分包 资源预加载/预请求 部署阶段开启http2静态资源缓存gzip压缩 性能优化主要在三个阶段进行&#xff1a;开发阶段、开发结束后的打包阶段、项目部署上线阶段 首…

动态规划例题

目录 A.小红组比赛 B.小红升装备 A.小红组比赛 思路 &#xff1a;经典的多重背包问题&#xff0c;这里将dp[ i ][ j ]定义为前 i 场比赛的难度 j 是否可能&#xff0c;所以dp只需用0 1 表示&#xff0c;然后遍历dp[ n ][ j ]即可。 代码&#xff1a; void solve() { cin&g…

TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE(Transformer 在图像中的应用)翻译

摘要 虽然Transformer架构已成为自然语言处理任务的实际标准&#xff0c;但其在计算机视觉领域的应用仍然有限。在计算机视觉中&#xff0c;注意力机制要么与卷积网络结合使用&#xff0c;要么用于替换卷积网络的某些组件&#xff0c;同时保持其整体结构不变。我们证明了这种对…

抖音网红老阳:temu选品师好做吗?

抖音网红老阳近期分享了关于成为TEMU选品师的话题&#xff0c;引发了不少人的关注和讨论。那么&#xff0c;成为TEMU选品师究竟是一种怎样的体验?这项工作适合大多数人吗? 首先&#xff0c;TEMU选品师的工作内容主要集中在拼多多跨境电商平台上&#xff0c;这是一种新兴的电商…

VS Code 扩展之——私有扩展管理(Private Extension Manager)

为什么需要私有扩展的管理器&#xff1f; 和 Eclipse IDE的插件开发类似&#xff0c;VS Code&#xff08;Visual Studio Code&#xff09;也可以很容易的对VS Code编辑器进行创建和扩展新功能&#xff0c;这些扩展可以涵盖代码片段、主题、语言支持、调试器等多个方面。 VS Co…

昂科烧录器支持TI德州仪器的32位微控制器TMS320F28032

芯片烧录行业领导者-昂科技术近日发布最新的烧录软件更新及新增支持的芯片型号列表&#xff0c;其中TI德州仪器的32位微控制器TMS320F28032已经被昂科的通用烧录平台AP8000所支持。 C2000™ 32位微控制器针对处理、感应和驱动进行了优化&#xff0c;可提高实时控制应用&#x…

IDEA全局搜索Jar包中内容

IDEA全局搜索Jar包中内容 【一】下载源码【二】搜索内容【1】按文件名搜索【2】全局关键字搜索【3】方法引用 【一】下载源码 想要搜索Jar中关键字&#xff0c;必须先把jar包源码下载下来&#xff0c;否则搜不到。 Preferences --> Maven --> Importing&#xff0c;根据…