机器学习算法程序库——Scikit-Learn简介:数据表和评估器API

本博客所有内容均整理自《Python数据科学手册》,欢迎讨论交流~

目前,Python有很多实现机器学习算法的程序库,其中,Scikit-Learn是最流行的之一,它为各种常用的机器学习算法提供了高效版本。Scikit-Learn的主要优点有干净统一管道命令式的API在线文档实用且完整等。

PS:本博客使用的编程语言均为Python,给出的图片均为在Jupyter Notebook上运行Python代码的结果图。

 

1. 数据表

机器学习的一个主要目的是从数据创建模型,所以了解怎样表示数据才能让计算机理解非常重要。Scikit-Learn认为数据表示最好的方法就是用数据表的形式。

基本的数据表就是二维网格数据,其中的每一行表示数据集中的每个样本,而每一列表示构成每个样本的相关特征。所以,数据表的行称为样本,行数记为n_samples;数据表的列称为特征,列数记为n_features。

数据表的一般布局通过二维数组或矩阵的形式将信息清晰地表达出来,所以我们通常把这类数据表矩阵称为特征矩阵,它是维度为[n_samples, n_features]的二维矩阵。特征矩阵一般会被简记为大写的X。

特征矩阵中,样本(即每一行)通常是指数据集中的每个对象;特征(即每一列)通常是指每个样本都具有的某种量化观测值。

除了特征矩阵X之外,我们还需要一个标签目标数组,通常简记为y。目标数组一般是一维数组(具体维度取决于目标个数),长度就是样本总数n_samples,一般来说目标数组既可以是连续的数值类型,也可以是离散的类型或标签。目标数组的特征通常是我们希望从数据预测的量化结果。如果目标数组必须是二维的,一般用[n_samples, n_targets]来表示维度,但是一般情况下常见的都是一维目标数组问题。

 

2. 评估器API

Scikit-Learn的评估器API的主要遵循原则如下:

  1. 统一性:所有对象使用共同接口连接一组方法和统一的文档
  2. 内省:所有参数值都是公共属性
  3. 限制对象层级:算法用Python类表示,数据用标准数据类型表示,参数名称用标准Python字符串表示
  4. 函数组合:一串基本算法
  5. 明智的默认值:当模型需要用户设置参数时,Scikit-Learn预先定义适当的默认值

Scikit-Learn中的所有机器学习算法都是通过评估器API实现的,它为各种机器学习应用提供了统一的接口。

 

评估器API的常用步骤

  1. 从Scikit-Learn中导入适当的评估器类,选择模型类
  2. 用合适的数值对模型类进行实例化,配置模型超参数
  3. 整理数据,获取特征矩阵和目标数组
  4. 调用模型实例的fit()方法对数据进行拟合
  5. 对新数据应用模型:
  • 在监督学习模型中,通常使用predict()方法预测新数据的标签
  • 在无监督学习模型中,通常使用transform()或predict()方法转换或推测数据的性质

 

3. 简单实例:线性回归

在这里给出一个《Python数据科学手册》中的简单实例,通过以上五步来进行简单的线性回归。

我们对简单的散点数据集(x,y)拟合一条直线。

首先,我们使用random语句获得数据:

import matplotlib.pyplot as plt
import numpy as np

rng = np.random.RandomState(42)
x = 10 * rng.rand(50)
y = 2 * x - 1 + rng.randn(50)
plt.scatter(x, y)

这个公式可以写成y = 2x - 1,画出数据图如下图所示:

接下来,有了数据之后我们就可以按照上述的五个步骤来进行线性回归了。

(1)选择模型类

第一步,我们要选择适用于y = 2x - 1这个公式的模型类。在Scikit-Learn中,每个模型类都是一种Python类,针对这个计算式,我们明显应该选择线性回归模型,司仪我们可以直接导入线性回归模型类:

from sklearn.linear_model import LinearRegression

 

(2) 选择模型超参数

第二步,我们要进行模型实例化,配置模型超参数。特别注意,模型类与模型实例不同。这里我理解的是这样,模型类指的是线性回归模型、非线性回归模型、随机森林回归等类别,而模型实例指的是我们确定使用线性回归之后,我们还需要确定一些实例参数,例如线性回归就需要确定斜率和截距,确定了这些参数之后才是确定了一个模型实例。

有一些重要的参数必须在选择模型类时就确定好,这些参数就被称为超参数,即在模型拟合数据之前就必须被确定的参数。在Scikit-Learn中,我们通常在模型初始化阶段就选择超参数。

对于有y = 2x - 1这个计算式的实例来说,我们可以实例化LinearRegression类并用fit_intercept超参数设置是否想要拟合直线的截距,代码为:

model = LinearRegression(fit_intercept=True)
model

运行结果为:

当输出如上图所示时,设置拟合直线截距的操作就已经完成了。

此处需要注意的是,对模型进行实例化其实仅仅只是存储了超参数的值,还没有将模型应用到数据上:Scikit-Learn的API对选择模型将模型应用到数据区分得格外清晰。

 

(3)将数据整理成特征矩阵和目标数组

第三步,我们需要将数据整理成特征矩阵的[n_samples, n_features]形式和目标数组的确定维数。

本示例中,我们可以对一维数组进行简单的维度变化:

X = x[:, np.newaxis]

这样,我们就将x的维度变成了二维的,即对应于[n_samples, n_features]的形式。

本示例的y本来就是长度为n_samples的数组,所以不需要处理就直接对应于目标数组的形式。

 

(4)使用fit()方法拟合数据

第四步,我们才真正将模型应用到数据上,进行拟合。

本示例中,我们只需要使用模型的fit()方法即可完成拟合:

model.fit(X, y)

fit()命令会在模型内部进行大量运算,运算结果将存储在模型属性中,供用户使用。在Scikit-Learn中,所有通过fit()方法获得的模型参数都带一条下划线。例如,在本示例的线性回归模型中,获得的模型参数主要就是斜率和截距,如下所示:

其中intercept就是截距的英文,这个上面说过,而coefficient则是斜率的英文,这里取它的简写,后面加上下划线,即是通过fit()方法拟合之后的模型参数。

观察结果,可见斜率和解决的拟合值与实际样本值非常接近。y = 2x - 1的斜率为2,截距为-1。

 

(5)预测新数据的标签

第五步,我们将刚刚获得的模型应用于新数据。

在这里,我们来讨论比较简单的监督学习情况。监督学习的主要任务就是对不属于训练集的新数据进行预测。在Scikit-Learn中,我们使用predict()方法来进行预测。“新数据”是特征矩阵的x坐标值,我们需要用模型预测出目标数组的y坐标值。

首先,我们获得新数据:

xfit = np.linspace(-1, 11)

通常新数据都是直接给出或计算获得,不会这样随机获得。

然后,我们还是要将这些x值转换成[n_samples, n_features]的形式:

Xfit = xfit[:, np.newaxis]

转换了形式之后,我们就可以将这些转换之后的数据输入到模型中应用predict()方法了:

yfit = model.predict(Xfit)

最后,我们可以将原始数据和拟合数据都进行一下可视化,直观看结果。这一步并非必须。

plt.scatter(x, y)
plt.plot(xfit, yfit)

结果图如下图所示:


 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值