【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 + log(TF)
。 - 在 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 |
---|---|---|---|
1 | 1.75(米) | 15000(元) | 120(斤) |
2 | 1.5(米) | 16000(元) | 140(斤) |
3 | 1.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.75−1.5)2+(15000−16000)2+(120−140)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
这样的数据转换器时,fit
、fit_transform
和transform
这三个方法的使用是至关重要的,它们各自有不同的作用:
- fit:
- 这个方法用来计算数据的统计信息,比如均值和标准差(在
StandardScaler
的情况下)。这些统计信息随后会被用于数据的标准化。 - 你应当仅在训练集上使用
fit
方法。
- 这个方法用来计算数据的统计信息,比如均值和标准差(在
- fit_transform:
- 这个方法相当于先调用
fit
再调用transform
,但是它在内部执行得更高效。 - 它同样应当仅在训练集上使用,它会计算训练集的统计信息并立即应用到该训练集上。
- 这个方法相当于先调用
- transform:
- 这个方法使用已经通过
fit
方法计算出的统计信息来转换数据。 - 它可以应用于任何数据集,包括训练集、验证集或测试集,但是应用时使用的统计信息必须来自于训练集。
- 这个方法使用已经通过
当你在预处理数据时,首先需要在训练集X_train
上使用fit_transform
,这样做可以一次性完成统计信息的计算和数据的标准化。这是因为我们需要确保模型是基于训练数据的统计信息进行学习的,而不是整个数据集的统计信息。
**一旦scaler
对象在X_train
上被fit
,它就已经知道了如何将数据标准化。**这时,对于测试集X_test
,我们只需要使用transform
方法,因为我们不希望在测试集上重新计算任何统计信息,也不希望测试集的信息影响到训练过程。如果我们对X_test
也使用fit_transform
,测试集的信息就可能会影响到训练过程。
总结来说:我们常常是先fit_transform(x_train)然后再transform(x_text)