Scikit Learn - 建模手册(02)--- 数据表示、估算器

Scikit Learn - 数据表示
在这里插入图片描述

一、说明

众所周知,机器学习即将从数据中创建模型。为此,计算机必须首先理解数据。接下来,我们将讨论表示数据以便计算机理解的各种方法。后面,我们将介绍估算器的使用。

二、数据表格

在 Scikit-learn 中表示数据的最佳方式是以表格的形式。表表示数据的二维网格,其中行表示数据集的各个元素,列表示与这些单个元素相关的数量。


通过下面给出的示例,我们可以借助 python seaborn 库以 Pandas DataFrame 的形式下载鸢尾花数据集。

import seaborn as sns
iris = sns.load_dataset('iris')
iris.head()

输出

sepal_length sepal_width petal_length petal_width species
0 5.1 3.5 1.4 0.2 setosa
1 4.9 3.0 1.4 0.2 setosa
2 4.7 3.2 1.3 0.2 setosa
3 4.6 3.1 1.5 0.2 setosa
4 5.0 3.6 1.4 0.2 setosa

从上面的输出中,我们可以看到数据的每一行代表观察到的花朵,行数代表数据集中的花朵总数。通常,我们将矩阵的行称为样本。

另一方面,数据的每一列都代表描述每个样本的定量信息。通常,我们将矩阵的列称为特征。

2.1 数据作为特征矩阵

特征矩阵可以定义为表格布局,其中信息可以被视为二维矩阵。它存储在名为 X 的变量中,并假定为二维,形状为 [n_samples, n_features]。大多数情况下,它包含在 NumPy 数组或 Pandas DataFrame 中。如前所述,样本始终表示数据集描述的单个对象,特征表示以定量方式描述每个样本的不同观测值。

探索我们最新的在线课程,按照自己的节奏学习新技能。注册并成为认证专家,以提升您的职业生涯。

2.2 数据作为目标数组

除了用 X 表示的特征矩阵外,我们还有目标数组。它也被称为标签。它用 y 表示。标签或目标数组通常是一维的,长度为 n_samples。它通常包含在 NumPy 数组或 Pandas 系列中。目标数组可以同时具有连续数值和离散值。

目标数组与功能列有何不同?
我们可以通过一点来区分两者,即目标数组通常是我们想要从数据中预测的数量,即在统计术语中,它是因变量。


在下面的示例中,我们从鸢尾花数据集中根据其他测量值预测花的种类。在这种情况下,物种列将被视为要素。

import seaborn as sns
iris = sns.load_dataset('iris')
%matplotlib inline
import seaborn as sns; sns.set()
sns.pairplot(iris, hue='species', height=3);

输出
在这里插入图片描述

X_iris = iris.drop('species', axis=1)
X_iris.shape
y_iris = iris['species']
y_iris.shape

输出
(150,4)
(150,)

三、什么是 Estimator API

它是 Scikit-learn 实现的主要 API 之一。它为各种 ML 应用程序提供了一致的接口,这就是为什么 Scikit-Learn 中的所有机器学习算法都是通过 Estimator API 实现的。从数据中学习(拟合数据)的对象是估计器。它可以与任何算法一起使用,如分类、回归、聚类,甚至可以与从原始数据中提取有用特征的转换器一起使用。

为了拟合数据,所有估算器对象都公开了一个拟合方法,该方法采用如下所示的数据集 -

estimator.fit(data)
接下来,当估计器被相应的属性实例化时,可以设置它的所有参数,如下所示。

estimator = Estimator (param1=1, param2=2)
estimator.param1
上述的输出为 1。

一旦数据与估计器拟合,就会根据手头的数据估计参数。现在,所有估计参数都将是估计器对象的属性,以下列标结尾:

estimator.estimated_param_

四、Estimator API 的使用

估算器的主要用途如下:

模型的估计和解码
Estimator 对象用于模型的估计和解码。此外,该模型被估计为以下确定性函数 −

对象构造中提供的参数。

如果估计器的 random_state 参数设置为 none,则全局随机状态 (numpy.random)。

传递给最近调用以拟合、fit_transform或fit_predict的任何数据。

在一系列调用中传递给partial_fit的任何数据。

将非矩形数据表示映射到矩形数据
它将非矩形数据表示映射到矩形数据中。简单来说,它接受每个样本未表示为固定长度的类似数组对象的输入,并为每个样本生成一个类似数组的特征对象。

核心样品和外围样品的区别
它使用以下方法对核心样本和外围样本之间的区别进行建模 -

适合

fit_predict如果转导

预测是否感应

探索我们最新的在线课程,按照自己的节奏学习新技能。注册并成为认证专家,以提升您的职业生涯。

五、指导原则

在设计 Scikit-Learn API 时,请牢记以下指导原则 -

一致性
该原则指出,所有对象都应共享从一组有限方法中提取的公共接口。文档也应保持一致。

有限的对象层次结构
这个指导原则说——

算法应由 Python 类表示

数据集应以标准格式表示,如 NumPy 数组、Pandas DataFrames、SciPy 稀疏矩阵。

参数名称应使用标准 Python 字符串。

组成
众所周知,ML算法可以表示为许多基本算法的序列。Scikit-learn 在需要时会使用这些基本算法。

合理的默认值
根据这一原则,每当 ML 模型需要用户指定的参数时,Scikit-learn 库都会定义一个适当的默认值。

检查
根据此指导原则,每个指定的参数值都作为 pubic 属性公开。

六、使用 Estimator API 的步骤

以下是使用 Scikit-Learn 估算器 API 的步骤 −

第 1 步:选择模型类别
在第一步中,我们需要选择一类模型。这可以通过从 Scikit-learn 导入相应的 Estimator 类来完成。

步骤 2:选择模型超参数
在这一步中,我们需要选择类模型超参数。这可以通过使用所需值实例化类来完成。

第 3 步:排列数据
接下来,我们需要将数据排列成特征矩阵(X)和目标向量(y)。

第 4 步:模型拟合
现在,我们需要将模型拟合到您的数据中。这可以通过调用模型实例的 fit() 方法来完成。

步骤 5:应用模型
拟合模型后,我们可以将其应用于新数据。对于监督学习,请使用 predict() 方法预测未知数据的标签。对于无监督学习,请使用 predict() 或 transform() 来推断数据的属性。

七、监督学习示例

在这里,作为此过程的一个示例,我们采用将一条线拟合到 (x,y) 数据的常见情况,即简单线性回归。

首先,我们需要加载数据集,我们使用的是虹膜数据集 −

import seaborn as sns
iris = sns.load_dataset('iris')
X_iris = iris.drop('species', axis = 1)
X_iris.shape

输出
(150, 4)

y_iris = iris['species']
y_iris.shape

输出
(150,)

现在,对于这个回归示例,我们将使用以下示例数据 −

%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
rng = np.random.RandomState(35)
x = 10*rng.rand(40)
y = 2*x-1+rng.randn(40)
plt.scatter(x,y);

输出
在这里插入图片描述
因此,我们的线性回归示例有上述数据。

现在,有了这些数据,我们可以应用上述步骤。

选择一类模型
在这里,为了计算一个简单的线性回归模型,我们需要导入线性回归类,如下所示 -

from sklearn.linear_model import LinearRegression
选择模型超参数
一旦我们选择了一类模型,我们就需要做出一些重要的选择,这些选择通常表示为超参数,或者在模型拟合数据之前必须设置的参数。在这里,对于这个线性回归的例子,我们希望通过使用fit_intercept超参数来拟合截距,如下所示 -

model = LinearRegression(fit_intercept = True)
model

输出

LinearRegression(copy_X = True, fit_intercept = True, n_jobs = None, normalize = False)
排列数据
现在,正如我们所知,我们的目标变量 y 是正确的形式,即 1-D 数组n_samples长度。但是,我们需要重塑特征矩阵 X,使其成为大小为 [n_samples, n_features] 的矩阵。可以按如下方式完成 -

X = x[:, np.newaxis]
X.shape
输出

(40, 1)
模型拟合
一旦我们安排了数据,就该拟合模型了,即将我们的模型应用于数据。这可以在 fit() 方法的帮助下完成,如下所示 -

model.fit(X, y)
输出

LinearRegression(copy_X = True, fit_intercept = True, n_jobs = None,normalize = False)
在 Scikit-learn 中,fit() 进程有一些尾随下划线。

对于此示例,以下参数显示了数据的简单线性拟合的斜率 −

model.coef_
输出

array([1.99839352])
以下参数表示对数据的简单线性拟合的截距 −

model.intercept_
输出

-0.9895459457775022
将模型应用于新数据
训练模型后,我们可以将其应用于新数据。由于监督机器学习的主要任务是基于不属于训练集的新数据来评估模型。它可以在 predict() 方法的帮助下完成,如下所示 -

xfit = np.linspace(-1, 11)
Xfit = xfit[:, np.newaxis]
yfit = model.predict(Xfit)
plt.scatter(x, y)
plt.plot(xfit, yfit);

在这里插入图片描述
完整的工作/可执行示例

%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns

iris = sns.load_dataset('iris')
X_iris = iris.drop('species', axis = 1)
X_iris.shape
y_iris = iris['species']
y_iris.shape

rng = np.random.RandomState(35)
x = 10*rng.rand(40)
y = 2*x-1+rng.randn(40)
plt.scatter(x,y);
from sklearn.linear_model import LinearRegression
model = LinearRegression(fit_intercept=True)
model
X = x[:, np.newaxis]
X.shape

model.fit(X, y)
model.coef_
model.intercept_

xfit = np.linspace(-1, 11)
Xfit = xfit[:, np.newaxis]
yfit = model.predict(Xfit)
plt.scatter(x, y)
plt.plot(xfit, yfit);

八、无监督学习示例

在这里,作为此过程的一个示例,我们以降低 Iris 数据集的维数的常见情况为例,以便我们可以更轻松地将其可视化。在此示例中,我们将使用主成分分析 (PCA),这是一种快速线性降维技术。

与上面给出的示例一样,我们可以加载并绘制虹膜数据集中的随机数据。之后,我们可以按照以下步骤操作 -

选择一类模型
from sklearn.decomposition import PCA
选择模型超参数

model = PCA(n_components=2)
model
输出

PCA(copy = True, iterated_power = ‘auto’, n_components = 2, random_state = None,
svd_solver = ‘auto’, tol = 0.0, whiten = False)
模型拟合

model.fit(X_iris)
输出

PCA(copy = True, iterated_power = ‘auto’, n_components = 2, random_state = None,
svd_solver = ‘auto’, tol = 0.0, whiten = False)
将数据转换为二维

X_2D = model.transform(X_iris)
现在,我们可以将结果绘制如下:

输出

iris['PCA1'] = X_2D[:, 0]
iris['PCA2'] = X_2D[:, 1]
sns.lmplot("PCA1", "PCA2", hue = 'species', data = iris, fit_reg = False);

输出

在这里插入图片描述
完整的工作/可执行示例

%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns

iris = sns.load_dataset('iris')
X_iris = iris.drop('species', axis = 1)
X_iris.shape
y_iris = iris['species']
y_iris.shape
rng = np.random.RandomState(35)
x = 10*rng.rand(40)
y = 2*x-1+rng.randn(40)
plt.scatter(x,y);
from sklearn.decomposition import PCA

model = PCA(n_components=2)
model
model.fit(X_iris)
X_2D = model.transform(X_iris)
iris['PCA1'] = X_2D[:, 0]
iris['PCA2'] = X_2D[:, 1]
sns.lmplot("PCA1", "PCA2", hue='species', data=iris, fit_reg=False);

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-12 08:08:01       66 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-12 08:08:01       70 阅读
  3. 在Django里面运行非项目文件

    2024-07-12 08:08:01       57 阅读
  4. Python语言-面向对象

    2024-07-12 08:08:01       68 阅读

热门阅读

  1. 构建Memcached帝国:分布式部署策略与实践指南

    2024-07-12 08:08:01       27 阅读
  2. 数据库中的数据视图(View):深入理解与应用

    2024-07-12 08:08:01       30 阅读
  3. 技术难点思考SpringBoot如何集成Jmeter开发

    2024-07-12 08:08:01       22 阅读
  4. 读取和显示一系列二维码图像中的二维码数据

    2024-07-12 08:08:01       32 阅读
  5. Jupyter远程服务器设置

    2024-07-12 08:08:01       26 阅读
  6. 基于K线图的股市情绪分析及预测模型构建

    2024-07-12 08:08:01       31 阅读
  7. Android Retrofit post请求,@Body传递的参数转义问题

    2024-07-12 08:08:01       28 阅读
  8. Spring MVC 全面指南:从入门到精通的详细解析

    2024-07-12 08:08:01       27 阅读
  9. 每日一道算法题 204. 计数质数

    2024-07-12 08:08:01       27 阅读