专注于快乐的事情

Scikit-Learn入门学习

Scikit-Learn基本学习

Scikit-Learn 接口设计

Scikit-Learn 设计的 API 设计的非常好。它的主要设计原则是:

  • 一致性:所有对象的接口一致且简单

  • 可检验。所有估计器的超参数都可以通过实例的public变量直接访问(比如,imputer.strategy),并且所有估计器学习到的参数也可以通过在实例变量名后加下划线来访问(比如,imputer.statistics_)。

  • 类不可扩散。只有算法可以用 Python 类表示。数据集都用标准数据类型(NumPy 数组、Pandas DataFrame 、SciPy 稀疏矩阵)表示,参数名称用标准的 Python 字符串。

  • 可组合。尽可能使用现存的模块。例如,用任意的转换器序列加上一个估计器,就可以做成一个流水线,后面会看到例子。

  • 合理的默认值。Scikit-Learn 给大多数参数提供了合理的默认值,很容易就能创建一个系统。

Scikit-Learn中对象

  • 估计器(estimator)。任何可以基于数据集对一些参数进行估计的对象都被称为估计器(比如,imputer就是个估计器)。估计本身是通过fit()方法,只需要一个数据集作为参数(对于监督学习算法,需要两个数据集;第二个数据集包含标签)。
  • 转换器(transformer)。一些估计器(比如imputer)也可以转换数据集,这些估计器被称为转换器。API也是相当简单:转换是通过transform()方法,被转换的数据集作为参数。返回的是经过转换的数据集。所有的转换都有一个便捷的方法fit_transform(),等同于调用fit()transform()
  • 预测器(predictor)。最后,一些估计器可以根据给出的数据集做预测,这些估计器称为预测器。例如,LinearRegression模型就是一个预测器:预测器有一个predict()方法,可以用新实例的数据集做出相应的预测。预测器还有一个score()方法。

Scikit-Learn的评估器API

Scikit-Learn 评估器 API 的常用步骤如下所示:

(1) 通过从 Scikit-Learn 中导入适当的评估器类,选择模型类。

(2) 用合适的数值对模型类进行实例化,配置模型超参数(hyperparameter)。

(3) 整理数据,通过前面介绍的方法获取特征矩阵和目标数组。

(4) 调用模型实例的 fit() 方法对数据进行拟合。

(5) 对新数据应用模型:

  • 在有监督学习模型中,通常使用 predict() 方法预测新数据的标签;
  • 在无监督学习模型中,通常使用 transform() 或 predict() 方法转换或推断数据的性质

例子:简单线性回归

1
2
3
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
1
2
3
4
5
rng = np.random.RandomState(42)
x = 10 * rng.rand(50)
y = 2 * x - 1 + rng.randn(50)
plt.scatter(x, y);
plt.show()

png

(1) 选择模型类

1
from sklearn.linear_model import LinearRegression

(2) 选择模型超参数

1
2
model = LinearRegression(fit_intercept=True)
model
LinearRegression(copy_X=True, fit_intercept=True, n_jobs=None,
         normalize=False)

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

1
2
X = x[:, np.newaxis]
X.shape
(50, 1)

(4) 用模型拟合数据

1
model.fit(X, y)
LinearRegression(copy_X=True, fit_intercept=True, n_jobs=None,
         normalize=False)

fit() 命令会在模型内部进行大量运算,运算结果将存储在模型属性中,供用户使用。
在 Scikit-Learn 中,所有通过 fit() 方法获得的模型参数都带一条下划线。

1
model.coef_
array([1.9776566])
1
model.intercept_
-0.9033107255311146
1
上面的输出,分别表示对样本数据拟合直线的斜率和截距。

(5) 预测新数据的标签

模型训练出来之后,有监督机器学习的主要任务就变成了对不属于训练集的新数据进行预测。在 Scikit-Learn 中,我们用 predict() 方法进行预测。

1
2
xfit = np.linspace(-1, 11)
xfit
array([-1.        , -0.75510204, -0.51020408, -0.26530612, -0.02040816,
        0.2244898 ,  0.46938776,  0.71428571,  0.95918367,  1.20408163,
        1.44897959,  1.69387755,  1.93877551,  2.18367347,  2.42857143,
        2.67346939,  2.91836735,  3.16326531,  3.40816327,  3.65306122,
        3.89795918,  4.14285714,  4.3877551 ,  4.63265306,  4.87755102,
        5.12244898,  5.36734694,  5.6122449 ,  5.85714286,  6.10204082,
        6.34693878,  6.59183673,  6.83673469,  7.08163265,  7.32653061,
        7.57142857,  7.81632653,  8.06122449,  8.30612245,  8.55102041,
        8.79591837,  9.04081633,  9.28571429,  9.53061224,  9.7755102 ,
       10.02040816, 10.26530612, 10.51020408, 10.75510204, 11.        ])
1
2
Xfit = xfit[:, np.newaxis]
Xfit
array([[-1.        ],
       [-0.75510204],
       [-0.51020408],
       [-0.26530612],
       [-0.02040816],
       [ 0.2244898 ],
       [ 0.46938776],
       [ 0.71428571],
       [ 0.95918367],
       [ 1.20408163],
       [ 1.44897959],
       [ 1.69387755],
       [ 1.93877551],
       [ 2.18367347],
       [ 2.42857143],
       [ 2.67346939],
       [ 2.91836735],
       [ 3.16326531],
       [ 3.40816327],
       [ 3.65306122],
       [ 3.89795918],
       [ 4.14285714],
       [ 4.3877551 ],
       [ 4.63265306],
       [ 4.87755102],
       [ 5.12244898],
       [ 5.36734694],
       [ 5.6122449 ],
       [ 5.85714286],
       [ 6.10204082],
       [ 6.34693878],
       [ 6.59183673],
       [ 6.83673469],
       [ 7.08163265],
       [ 7.32653061],
       [ 7.57142857],
       [ 7.81632653],
       [ 8.06122449],
       [ 8.30612245],
       [ 8.55102041],
       [ 8.79591837],
       [ 9.04081633],
       [ 9.28571429],
       [ 9.53061224],
       [ 9.7755102 ],
       [10.02040816],
       [10.26530612],
       [10.51020408],
       [10.75510204],
       [11.        ]])

将这些x值转换成[n_samples, n_features]的特征矩阵形式,之后将其输入到
模型中

1
2
yfit = model.predict(Xfit)
yfit
array([-2.88096733, -2.39664326, -1.9123192 , -1.42799513, -0.94367106,
       -0.459347  ,  0.02497707,  0.50930113,  0.9936252 ,  1.47794926,
        1.96227333,  2.44659739,  2.93092146,  3.41524552,  3.89956959,
        4.38389366,  4.86821772,  5.35254179,  5.83686585,  6.32118992,
        6.80551398,  7.28983805,  7.77416211,  8.25848618,  8.74281024,
        9.22713431,  9.71145837, 10.19578244, 10.68010651, 11.16443057,
       11.64875464, 12.1330787 , 12.61740277, 13.10172683, 13.5860509 ,
       14.07037496, 14.55469903, 15.03902309, 15.52334716, 16.00767122,
       16.49199529, 16.97631936, 17.46064342, 17.94496749, 18.42929155,
       18.91361562, 19.39793968, 19.88226375, 20.36658781, 20.85091188])

把原始数据和拟合结果都可视化出来

1
2
plt.scatter(x, y)
plt.plot(xfit, yfit)
[<matplotlib.lines.Line2D at 0x117ed9c50>]

png

1
2


参考网站

http://baijiahao.baidu.com/s?id=1600375182495419726&wfr=spider&for=pc

评论系统未开启,无法评论!