当前位置: 首页 > news >正文

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

文章目录

  • 环境配置(必看)
  • 头文件引用
    • 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_transformdata_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_transformdata_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机器学习
我是跟着视频进行的学习,欢迎大家一起来学习!

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 第一阶段面试问题(后半部分)
  • java之IO篇——File、字节流、字符流
  • 【IO】使用有名管道实现,一个进程用于给另一个进程发消息,另一个进程收到消息后,展示到终端上,并且将消息保存到文件上一份
  • 新书速览|AI创意商业广告设计:Adobe Firefly + Photoshop
  • 现代前端架构介绍(第一部分):App是如何由不同的构建块构成的
  • 数据中台建设之数据汇聚与数据交换
  • Apache Pig: 高级数据处理平台
  • 【开源】嵌入式Linux(IMX6U)应用层综合项目(1)--云平台调试APP
  • 网络流算法:最大流问题
  • SparkSQL---编程模型的操作,数据加载与落地及自定义函数的使用
  • 最新全国各省市水系矢量数据(2024年更新)
  • 【教学类-73-02】20240805广口瓶(宽口瓶)02
  • 类和对象——日期类实现
  • 从一到无穷大 #32 TimeCloth,云上的快速 Point-in-Time Recovery
  • [Meachines] [Easy] shocker CGI-BIN Shell Shock + Perl权限提升
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • Android开发 - 掌握ConstraintLayout(四)创建基本约束
  • EOS是什么
  • ES学习笔记(12)--Symbol
  • GitUp, 你不可错过的秀外慧中的git工具
  • Java小白进阶笔记(3)-初级面向对象
  • js ES6 求数组的交集,并集,还有差集
  • Mysql5.6主从复制
  • python3 使用 asyncio 代替线程
  • Python利用正则抓取网页内容保存到本地
  • REST架构的思考
  • 编写高质量JavaScript代码之并发
  • 大数据与云计算学习:数据分析(二)
  • 动态魔术使用DBMS_SQL
  • 基于Android乐音识别(2)
  • 使用Swoole加速Laravel(正式环境中)
  • 数据科学 第 3 章 11 字符串处理
  • 学习JavaScript数据结构与算法 — 树
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • Java数据解析之JSON
  • #pragma once
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • (26)4.7 字符函数和字符串函数
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (Forward) Music Player: From UI Proposal to Code
  • (HAL库版)freeRTOS移植STMF103
  • (Java数据结构)ArrayList
  • (pytorch进阶之路)扩散概率模型
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (转)Sublime Text3配置Lua运行环境
  • 、写入Shellcode到注册表上线
  • ... 是什么 ?... 有什么用处?
  • .NET C# 使用 iText 生成PDF
  • .net framework4与其client profile版本的区别
  • .Net Redis的秒杀Dome和异步执行
  • .NET WebClient 类下载部分文件会错误?可能是解压缩的锅