美文网首页
Scikit-Learn指南02

Scikit-Learn指南02

作者: Nefelibatas | 来源:发表于2022-03-17 11:25 被阅读0次

sklearn默认接收的对象类型是数组,即无论是特征矩阵还是标签数组,最好都先转化成array对象类型再进行输入。此外,sklearn还能够处理array-like的数据,例如和数组形式相同的列表,但并不建议这么做。同时,在sklearn中,我们往往以称特征矩阵为Features Matrix,称特征数组为Target Vector,并且以n_samples表示数据行数、n_features表示特征矩阵列数:

008i3skNly1gs2reipie9j30uc0p4q92.jpg

Scikit-Learn内容分布与查找

sklearn的六大功能模块

首先,从建模功能上进行区分,sklearn将所有的评估器和函数功能分为六大类,分别是分类模型(Classification)、回归模型(Regression)、聚类模型(Clustering)、降维方法(Dimensionality reduction)、模型选择(Model selection)和数据预处理六大类。

其中分类模型、回归模型和聚类模型是机器学习内主流的三大类模型,其功能实现主要依靠评估器类,并且前两者是有监督学习、聚类模型属于无监督学习范畴。

当然,sklearn中并未包含关联规则相关算法,如Apriori或者FP-Growth,这其实一定程度上和sklearn只能处理array-like类型对象有关。而后三者,降维方法、模型选择方法和数据预处理方法,则多为辅助建模的相关方法,并且既有评估器也有实用函数。

Scikit-Learn常用功能

008i3skNly1gs2xlkc7nej315y0u0e81.jpg 008i3skNly1gs2xln04w1j31g10u0b29.jpg

sklearn中的数据集切分方法

from sklearn.model_selection import train_test_split

查阅该函数的帮助文档

train_test_split?
train_test_split(X, y, random_state=42,stratify=y)

此处有两个地方需要注意,其一是随机数种子的设置,和此前手动定义的数据集切分函数一样,random_state取值不同,切分结果就会各有不同。

stratify参数则是控制训练集和测试集不同类别样本所占比例的参数,若希望切分后的训练集和测试集中0、1两类的比例和原始数据相同(1:1),则可另stratify=y

尽管随机数种子仍然会发挥作用,但由于计算流程发生了变化,最终切分出来的结果将和此前的切分结果不同(但都会保持(1:1)的分布比例)。

sklearn中的数据标准化与归一化

从功能上划分,sklearn中的归一化其实是分为标准化(Standardization)和归一化(Normalization)两类。其中,此前所介绍的Z-Score标准化和0-1标准化,都属于Standardization的范畴,而在sklearn中,Normalization则特指针对单个样本(一行数据)利用其范数进行放缩的过程。不过二者都属于数据预处理范畴,都在sklearn中的Preprocessing data模块下。
from sklearn import preprocessing

标准化 Standardization

sklearn的标准化过程,即包括Z-Score标准化,也包括0-1标准化,并且即可以通过实用函数来进行标准化处理,同时也可以利用评估器来执行标准化过程。

Z-Score

实用函数

通过preprocessing模块下的scale函数进行快速的Z-Score标准化处理。

preprocessing.scale?
preprocessing.scale(X)
z_score(X)

实用函数进行标准化处理,尽管从代码实现角度来看清晰易懂,但却不适用于许多实际的机器学习建模场景。

其一是因为在进行数据集的训练集和测试集切分后,我们首先要在训练集进行标准化、然后统计训练集上统计均值和方差再对测试集进行标准化处理,因此其实还需要一个统计训练集相关统计量的过程;

其二则是因为相比实用函数,sklearn中的评估器其实会有一个非常便捷的串联的功能,sklearn中提供了Pipeline工具能够对多个评估器进行串联进而组成一个机器学习流,从而简化模型在重复调用时候所需代码量。

因此通过评估器的方法进行数据标准化,其实是一种更加通用的选择。

实用评估器进行数据标准化流程

评估器导入

from sklearn.preprocessing import StandardScaler

查阅评估器参数,然后进行评估器的实例化

查阅参数

StandardScaler?
scaler = StandardScaler()

...处理好train

scaler.fit(X_train)

评估器最终计算结果都可以通过相关属性进行调用和查看。

查看训练数据各列的标准差

scaler.scale_

查看训练数据各列的均值

scaler.mean_

查看训练数据各列的方差

scaler.var_

np.sqrt(scaler.var_)

总共有效的训练数据条数

scaler.n_samples_seen_

通过评估器中的transform方法来进行数据标准化处理。注意,算法模型的评估器是利用predict方法进行数值预测,而标准化评估器则是利用transform方法进行数据的数值转化。

利用训练集的均值和方差对训练集进行标准化处理

scaler.transform(X_train)

利用训练集的均值和方差对测试集进行标准化处理

scaler.transform(X_test)

z_score(X_train)

此外,还可以使用fit_transform对输入数据进行直接转化:

scaler = StandardScaler()

一步执行在X_train上fit和transfrom两个操作

scaler.fit_transform(X_train)

接下来就能直接带入标准化后的数据进行建模了。

0-1标准化

和Z-Score标准化类似,0-1标准化也有函数实现和评估器实现两种。

函数实现

查看函数说明文档

preprocessing.minmax_scale?
preprocessing.minmax_scale(X)

对比自定义函数计算结果

maxmin_norm(X)

调用评估器进行0-1标准化。

from sklearn.preprocessing import MinMaxScaler
MinMaxScaler?
scaler = MinMaxScaler()
scaler.fit_transform(X)
scaler.data_min_
scaler.data_max_

归一化 Normalization

和标准化不同,sklearn中的归一化特指将单个样本(一行数据)放缩为单位范数(1范数或者2范数为单位范数)的过程,该操作常见于核方法或者衡量样本之间相似性的过程中。同样,归一化也有函数实现和评估器实现两种方法。

preprocessing.normalize?

1-范数单位化过程

preprocessing.normalize(X, norm='l1')

2-范数单位化过程

preprocessing.normalize(X, norm='l2')

关于范数的基本概念,假设向量x = [x_1, x_2, ..., x_n]^T,\\ 则向量x的1-范数的基本计算公式为:\\ ||x||_1 = |x_1|+|x_2|+...+|x_n|\\ 即各分量的绝对值之和。\\ 而向量x的2-范数计算公式为:\\ ||x||_2=\sqrt{(|x_1|^2+|x_2|^2+...+|x_n|^2)}\\ 即各分量的平方和再开平方。

sklearn中的Normalization过程,实际上就是将每一行数据视作一个向量,然后用每一行数据去除以该行数据的1-范数或者2-范数。具体除以哪个范数,以preprocessing.normalize函数中输入的norm参数为准。

除了标准化和归一化之外,还有一个正则化(Regularization)的概念,所谓正则化,往往指的是通过在损失函数上加入参数的1-范数或者2-范数的过程,该过程能够有效避免模型过拟合。

相关文章

网友评论

      本文标题:Scikit-Learn指南02

      本文链接:https://www.haomeiwen.com/subject/sgzedrtx.html