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

【sklearn(01)】数据集加载、划分,csv文件创建,特征工程,无量纲化

目录

  • sklearn数据集
    • 玩具数据集
    • 现实世界数据集
    • 加载玩具数据集
    • 获取现实世界数据集
  • 本地csv数据
    • 创建csv文件
    • pandas加载csv
  • 数据集划分
  • 特征工程
    • 步骤
    • 特征工程API
    • DictVectorizer 字典列表特征提取
      • API
    • CountVectorizer 文本特征提取
      • API
      • 英文文本提取
      • 中文文本提取
    • TfidfVectorizer TF-IDF文本特征词的重要程度特征提取
      • 算法
      • API
      • 示例
  • 无量纲化-预处理
    • MinMaxScaler 归一化
    • normalize归一化
    • StandardScaler 标准化
    • 注意点

sklearn数据集

玩具数据集

数据量小,数据在sklearn库的本地,只要安装了sklearn,不用上网就可以获取
在这里插入图片描述

现实世界数据集

数据量大,数据只能通过网络获取
在这里插入图片描述

加载玩具数据集

示例:鸢尾花数据

from sklearn.datasets import load_iris
iris = load_iris()	#鸢尾花数据	#返回一个Bunch对象

iris字典中有几个重要属性:

# data 特征
# feature_names 特征描述
# target  目标
# target_names  目标描述
# DESCR 数据集的描述
# filename 下后到本地保存后的文件名

鸢尾花数据集介绍

特征有:

​ 花萼长 sepal length

​ 花萼宽sepal width

​ 花瓣长 petal length

​ 花瓣宽 petal width

三分类:

​ 0-Setosa山鸢尾

​ 1-versicolor变色鸢尾

​ 2-Virginica维吉尼亚鸢尾
在这里插入图片描述

获取现实世界数据集

(1)所有现实世界数据,通过网络才能下载后,默认保存的目录可以使用下面api获取。实际上就是保存到home目录

from sklearn import datasets
datasets.get_data_home()  #查看数据集默认存放的位置

(2)下载时,有可能回为网络问题而出问题,要“小心”的解决网络问题,不可言……

(3)第一次下载会保存的硬盘中,如果第二次下载,因为硬盘中已经保存有了,所以不会再次下载就直接加载成功了。

示例:获取20分类新闻数据

(1)使用函数: sklearn.datasets.fetch_20newsgroups(data_home,subset)

(2)函数参数说明:

  • data_home
None这是默认值,下载的文件路径为 “C:/Users/ADMIN/scikit_learn_data/20news-bydate_py3.pkz”
自定义路径例如 “./src”, 下载的文件路径为“./20news-bydate_py3.pkz”
  • subset
“train”,只下载训练集
“test”,只下载测试集
“all”, 下载的数据包含了训练集和测试集
  • return_X_y,决定着返回值的情况
False,这是默认值
True,

函数返值说明:

当参数return_X_y值为False时, 函数返回Bunch对象,Bunch对象中有以下属性*data:特征数据集, 长度为18846的列表list, 每一个元素就是一篇新闻内容, 共有18846篇*target:目标数据集,长度为18846的数组ndarray, 第一个元素是一个整数,整数值为[0,20)*target_names:目标描述,长度为20的list*filenames:长度为18846的ndarray, 元素为字符串,代表新闻的数据位置的路径当参数return_X_y值为True时,函数返回值为元组,元组长度为2, 第一个元素值为特征数据集,第二个元素值为目标数据集
  • 代码
from sklearn.datasets import fetch_20newsgroups #这是一个20分类的数据
news = fetch_20newsgroups(data_home=None,subset='all')
print(len(news.data)) #18846
print(news.target.shape) #(18846,)
print(len(news.target_names)) #20
print(len(news.filenames)) #18846

本地csv数据

创建csv文件

  • 方式1:打开计事本,写出如下数据,数据之间使用英文下的逗号, 保存文件后把后缀名改为csv

csv文件可以使用excel打开

, milage,Liters,Consumtime,target
40920,8.326976,0.953952,3
14488,7.153469,1.673904,2
26052,1.441871,0.805124,1
75136,13.147394,0.428964,1
  • 方式2:创建excel 文件, 填写数据,以csv为后缀保存文件
    在这里插入图片描述

pandas加载csv

使用pandas的read_csv(“文件路径”)函数可以加载csv文件,得到的结果为数据的DataFrame形式

pd.read_csv("./src/ss.csv")

数据集划分

**sklearn.model_selection.train_test_split(*arrays,options)

参数
(1) *array 这里用于接收1到多个"列表、numpy数组、稀疏矩阵或padas中的DataFrame"。	
(2) **options, 重要的关键字参数有:test_size 值为0.0到1.0的小数,表示划分后测试集占的比例random_state 值为任意整数,表示随机种子,使用相同的随机种子对相同的数据集多次划分结果是相同的。否则多半不同strxxxx 分层划分,填y
2 返回值说明返回值为列表list, 列表长度与形参array接收到的参数数量相关联, 形参array接收到的是什么类型,list中对应被划分出来的两部分就是什么类型

特征工程

特征工程是将任意数据(如文本或图像)转换为可用于机器学习的数字特征,比如:字典特征提取(特征离散化)、文本特征提取、图像特征提取。

步骤

  • 特征提取, 如果不是像dataframe那样的数据,要进行特征提取,比如字典特征提取,文本特征提取

  • 无量纲化(预处理)

    • 归一化
    • 标准化
  • 降维

    • 底方差过滤特征选择

    • 主成分分析-PCA降维

特征工程API

  • 实例化转换器对象,转换器类有很多,都是Transformer的子类, 常用的子类有:
DictVectorizer  	字典特征提取
CountVectorizer 	文本特征提取
TfidfVectorizer 	TF-IDF文本特征词的重要程度特征提取 
MinMaxScaler 		归一化
StandardScaler 		标准化
VarianceThreshold 	底方差过滤降维
PCA  				主成分分析降维
  • 转换器对象调用fit_transform()进行转换, 其中fit用于计算数据,transform进行最终转换

fit_transform()可以使用fit()和transform()代替

data_new = transfer.fit_transform(data)
可写成
transfer.fit(data)
data_new = transfer.transform(data)

DictVectorizer 字典列表特征提取

稀疏矩阵

稀疏矩阵是指一个矩阵中大部分元素为零,只有少数元素是非零的矩阵。
由于稀疏矩阵中零元素非常多,存储和处理稀疏矩阵时,通常会采用特殊的存储格式,以节省内存空间并提高计算效率。
三元组表 (Coordinate List, COO):三元组表就是一种稀疏矩阵类型数据,存储非零元素的行索引、列索引和值:

(行,列) 数据

(0,0) 10

(0,1) 20

(2,0) 90

(2,20) 8

(8,0) 70

表示除了列出的有值, 其余全是0
非稀疏矩阵(稠密矩阵)

非稀疏矩阵,或称稠密矩阵,是指矩阵中非零元素的数量与总元素数量相比接近或相等,也就是说矩阵中的大部分元素都是非零的。在这种情况下,矩阵的存储通常采用标准的二维数组形式,因为非零元素密集分布,不需要特殊的压缩或优化存储策略。

API

  • 创建转换器对象:

    sklearn.feature_extraction.DictVectorizer(sparse=True)

    参数:

    sparse=True返回类型为csr_matrix的稀疏矩阵

    sparse=False表示返回的是数组,数组可以调用.toarray()方法将稀疏矩阵转换为数组

  • 转换器对象:

    转换器对象调用fit_transform(data)函数,参数data为一维字典数组或一维字典列表,返回转化后的矩阵或数组

    转换器对象get_feature_names_out()方法获取特征名

CountVectorizer 文本特征提取

API

sklearn.feature_extraction.text.CountVectorizer

​ 构造函数关键字参数stop_words,值为list,表示词的黑名单(不提取的词)

fit_transform函数的返回值为稀疏矩阵

英文文本提取

from sklearn.feature_extraction.text import CountVectorizer
import pandas as pddata=["stu is well, stu is great", "You like stu"]#创建转换器对象, you和is不提取
transfer = CountVectorizer(stop_words=["you","is"])#进行提取,得到稀疏矩阵
data_new = transfer.fit_transform(data)
print(data_new)import pandas
pandas.DataFrame(data_new.toarray(), index=["第一个句子","第二个句子"],columns=transfer.get_feature_names_out())

中文文本提取

a.中文文本不像英文文本,中文文本文字之间没有空格,所以要先分词,一般使用jieba分词.

b.下载jieba组件, (不要使用conda)
在这里插入图片描述
c.jieba的基础

import jieba
from sklearn.feature_extraction.text import CountVectorizerdef cut(text):return " ".join(list(jieba.cut(text)))data = ["教育学会会长期间坚定支持民办教育事业!","热忱关心、扶持民办学校发展","事业做出重大贡献!"]
data_new = [cut(v) for v in data]transfer = CountVectorizer(stop_words=['期间', '做出']) 
data_final = transfer.fit_transform(data_new)print(data_final.toarray())#把非稀疏矩阵转变为稀疏矩阵
print(transfer.get_feature_names_out())#import pandas as pd
pd.DataFrame(data_final.toarray(), columns=transfer.get_feature_names_out())

在这里插入图片描述

TfidfVectorizer TF-IDF文本特征词的重要程度特征提取

算法

词频(Term Frequency, TF), 表示一个词在当前篇文章中的重要性

逆文档频率(Inverse Document Frequency, IDF), 反映了词在整个文档集合中的稀有程度
在这里插入图片描述

API

sklearn.feature_extraction.text.TfidfVectorizer(stop_words=[])

​ 构造函数关键字参数stop_words,表示词特征黑名单

fit_transform函数的返回值为稀疏矩阵

示例

代码与CountVectorizer的示例基本相同,仅仅把CountVectorizer改为TfidfVectorizer即可

示例中data是一个字符串list, list中的第一个元素就代表一篇文章.

import jieba
import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizerdef cut_words(text):return " ".join(list(jieba.cut(text)))data = ["教育学会会长期间,坚定支持民办教育事业!",  "扶持民办,学校发展事业","事业做出重大贡献!"]
data_new = [cut_words(v) for v in data]transfer = TfidfVectorizer(stop_words=['期间', '做出',"重大贡献"]) 
data_final = transfer.fit_transform(data_new)pd.DataFrame(data_final.toarray(),columns=transfer.get_feature_names_out())

在这里插入图片描述
在这里插入图片描述
补充:在sklearn库中 TF-IDF算法做了一些细节的优化

词频 (TF)

词频是指一个词在文档中出现的频率。通常有两种计算方法:

  1. 原始词频:一个词在文档中出现的次数除以文档中总的词数。
  2. 平滑后的词频:为了防止高频词主导向量空间,有时会对词频进行平滑处理,例如使用 1 + log(TF)
  3. 在 TfidfVectorizer 中,TF 默认是:直接使用一个词在文档中出现的次数也就是CountVectorizer的结果

逆文档频率 (IDF)

逆文档频率衡量一个词的普遍重要性。如果一个词在许多文档中都出现,那么它的重要性就会降低。

IDF 的计算公式是:

IDF(t)=log⁡⁡(总文档数包含词t的文档数+1)IDF(t)=\log⁡(\dfrac{总文档数}{包含词t的文档数+1})IDF(t)=log(包含词t的文档数+1总文档数)

在 TfidfVectorizer 中,IDF 的默认计算公式是:

IDF(t)=log⁡⁡(总文档数+1包含词t的文档数+1)+1IDF(t)=\log⁡(\dfrac{总文档数+1}{包含词t的文档数+1})+1IDF(t)=log(包含词t的文档数+1总文档数+1)+1

在 TfidfVectorizer 中还会进行归一化处理(采用的L2归一化)

L2归一化

x1归一化后的数据=x1x12+x22+...xn2x_1归一化后的数据=\dfrac{x_1}{\sqrt{x_1^2+x_2^2+...x_n^2}}x1归一化后的数据=x12+x22+...xn2x1

x可以选择是行或者列的数据

无量纲化-预处理

无量纲,即没有单位的数据

无量纲化包括"归一化"和"标准化", 为什么要进行无量纲化呢?

这是一个男士的数据表:

编号id身高 h收入 s体重 w
11.75(米)15000(元)120(斤)
21.5(米)16000(元)140(斤)
31.6(米)20000(元)100(斤)

假设算法中需要求它们之间的欧式距离, 这里以编号1和编号2为示例:

L=(1.75−1.5)2+(15000−16000)2+(120−140)2L = \sqrt{(1.75-1.5)^2+(15000-16000)^2+(120-140)^2}L=(1.751.5)2+(1500016000)2+(120140)2

从计算上来看, 发现身高对计算结果没有什么影响, 基本主要由收入来决定了,但是现实生活中,身高是比较重要的判断标准. 所以需要无量纲化.

MinMaxScaler 归一化

通过对原始数据进行变换把数据映射到指定区间(默认为0-1)

sklearn.preprocessing.MinMaxScaler(feature_range)

参数:feature_range=(0,1) 归一化后的值域,可以自己设定

fit_transform函数归一化的原始数据类型可以是list、DataFrame和ndarray, 不可以是稀疏矩阵

fit_transform函数的返回值为ndarray
在这里插入图片描述
这里的 𝑥min 和 𝑥max 分别是每种特征中的最小值和最大值,而 𝑥是当前特征值,𝑥scaled 是归一化后的特征值。

若要缩放到其他区间,可以使用公式:x=x*(max-min)+min;

比如 [-1, 1]的公式为:在这里插入图片描述
在这里插入图片描述

normalize归一化

from sklearn.preprocessing import normalize
normalize(data, norm=‘l2’, axis=1)
#data是要归一化的数据
#norm是使用那种归一化:“l1” “l2” "max
#axis=0是列 axis=1是行

  • <1> L1归一化
    绝对值相加作为分母,特征值作为分子
  • L2归一化
    平方相加作为分母,特征值作为分子
  • <3> max归一化
    max作为分母,特征值作为分子

StandardScaler 标准化

标准化是一种数据预处理技术,也称为数据归一化或特征缩放。它的目的是将不同特征的数值范围缩放到统一的标准范围,以便更好地适应一些机器学习算法,特别是那些对输入数据的尺度敏感的算法。

sklearn.preprocessing.StandardScale

与MinMaxScaler一样,原始数据类型可以是list、DataFrame和ndarray

fit_transform函数的返回值为ndarray, 归一化后得到的数据类型都是ndarray

from sklearn.preprocessing import StandardScaler
#不能加参数feature_range=(0, 1)
transfer = StandardScaler()
data_new = transfer.fit_transform(data) #data_new的类型为ndarray

最常见的标准化方法是Z-score标准化,也称为零均值标准化。它通过对每个特征的值减去其均值,再除以其标准差,将数据转换为均值为0,标准差为1的分布。这可以通过以下公式计算:在这里插入图片描述
其中,z是转换后的数值,x是原始数据的值,μ是该特征的均值,σ是该特征的 标准差

注意点

在数据预处理中,特别是使用如StandardScaler这样的数据转换器时,fitfit_transformtransform这三个方法的使用是至关重要的,它们各自有不同的作用:

  1. fit:
    • 这个方法用来计算数据的统计信息,比如均值和标准差(在StandardScaler的情况下)。这些统计信息随后会被用于数据的标准化。
    • 你应当仅在训练集上使用fit方法。
  2. fit_transform:
    • 这个方法相当于先调用fit再调用transform,但是它在内部执行得更高效。
    • 它同样应当仅在训练集上使用,它会计算训练集的统计信息并立即应用到该训练集上。
  3. transform:
    • 这个方法使用已经通过fit方法计算出的统计信息来转换数据。
    • 它可以应用于任何数据集,包括训练集、验证集或测试集,但是应用时使用的统计信息必须来自于训练集。

当你在预处理数据时,首先需要在训练集X_train上使用fit_transform,这样做可以一次性完成统计信息的计算和数据的标准化。这是因为我们需要确保模型是基于训练数据的统计信息进行学习的,而不是整个数据集的统计信息。

**一旦scaler对象在X_train上被fit,它就已经知道了如何将数据标准化。**这时,对于测试集X_test,我们只需要使用transform方法,因为我们不希望在测试集上重新计算任何统计信息,也不希望测试集的信息影响到训练过程。如果我们对X_test也使用fit_transform,测试集的信息就可能会影响到训练过程。

总结来说:我们常常是先fit_transform(x_train)然后再transform(x_text)

http://www.dtcms.com/a/306850.html

相关文章:

  • 【编号65】广西地理基础数据(道路、水系、四级行政边界、地级城市、DEM等)
  • 我的世界模组开发教程——资源(1)
  • JeecgBoot(1):前后台环境搭建
  • C#_创建自己的MyList列表
  • 汽车电子控制系统开发的整体安全理念
  • SOA增益谱与ASE光谱的区别
  • SSRF漏洞基础
  • RESTful API和WebSocket的优缺点,各自适合以及不适合什么样的场景
  • LLM 模型部署难题的技术突破:从轻量化到分布式推理的全栈解决方案
  • uni-app webview的message监听不生效(uni.postmessage is not a function)
  • 嵌入式第十五课!!!!指针函数(续)+函数指针+二级指针+指针数组!!!
  • Java 14 新特性解析与代码示例
  • OWSM v4 语音识别学习笔记
  • RK3506-G2 开箱使用体验
  • 【Python】 切割图集的小脚本
  • 【WRF-Chem第五期】自定义字段配置 iofields_filename 详述
  • 红绿多空策略
  • 全包圆230㎡整装案例亮相,空间美学演绎东方韵味
  • Netty是如何解决epoll CPU占用100%问题的
  • 借助 Wisdom SSH AI 助手构建 Linux 容器化开发流水线
  • 构建智能体(Agent)时如何有效管理其上下文
  • 2022 年 NOI 最后一题题解
  • 【Spark征服之路-4.3-Kafka】
  • CMS框架GetShell
  • 2020 年 NOI 最后一题题解
  • Go语言核心知识点补充
  • 【Unity】在构建好的项目里创建自定义文件夹
  • 2.3.1-2.3.5获取资源-建设团队- 管理团队-实施采购-指导
  • solidity 中 Eth 和 Usd 到底如何转换
  • 技术人生——第17集:京城首发,AI叩问