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

目录

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 pd

data=["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 CountVectorizer

def 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 TfidfVectorizer

def 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 的计算公式是:

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

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

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

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

L2归一化

x 1 归一化后的数据 = x 1 x 1 2 + x 2 2 + . . . x n 2 x_1归一化后的数据=\dfrac{x_1}{\sqrt{x_1^2+x_2^2+...x_n^2}} x1归一化后的数据=x12+x22+...xn2 x1

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 ) 2 L = \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这样的数据转换器时,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)