一、从线性回归总结机器学习的通用模式

从上篇博客我们详细讲述了线性回归的实现方式。线性回归的调用方式实际上是sklearn的典型方式,在掌握这个方法之后我们继续进一步深入,探索其它的模型的使用。

回顾线性回归的理论,它实际上还可以写成一个更为抽象的形式:
python的sklearn的非线性回归_机器学习
事实上,所有机器学习本质上就是在想办法利用样本数据去拟合一个形如上式的函数关系。对于线性回归,上述函数是一个线性函数,而其它非线性模型则是拟合一个非线性函数。比如logistic回归则是一个logistic函数,而多层感知机则是多个激活函数的复合函数,SVM则是多个核函数的线性组合等等。

但从抽象的层面而言,我们关心的其实只有两个问题:模型如何拟合和如何预测。

从上篇博客中我们已经看到,在调用线性回归时,我们只需要找到它具体对应的class,然后再分别调用fitpredict两个函数即可完成拟合(训练)和预测的步骤。而事实上,在sklearn中绝大多数模型都是用这样的方式封装的,因此在掌握了线性回归的基础上,要学会这些方法就非常容易了。

比如我们用同样的数据,来实现一个支持向量机(SVM)。

import numpy as np
from sklearn.svm import SVR
X = np.array([[1, 1], [1, 2], [2, 2], [2, 3]])
# y = 1 * x_0 + 2 * x_1 + 3
y = np.dot(X, np.array([1, 2])) + 3
    
model = SVR()
model.fit(X,y)
model.predict(X)

上述代码第7-9行的调用和线性回归是一模一样的。

当然,如果运行这段代码就会发现,它的精度还不如线性回归,这里主要的问题在于我们对模型的超参数还没有进行调整。在绝大多数的非线性模型中(包括一些特殊的线性模型,比如ridge regression),还有一部分参数是无法通过训练直接获取的,通常的做法是直接预先设定,反复调整使模型达到一个最优的状态,这一过程也就是我们常听到的“调参“。那么基于此,我们的非线性模型的通用模式其实就应该表示为:
python的sklearn的非线性回归_python_02
这里面 python的sklearn的非线性回归_线性回归_03 表示我们的超参数(一个或多个),python的sklearn的非线性回归_sklearn_04

  • 核函数及其参数
  • 惩罚系数

这里我们常用高斯核作为它的核函数,同时将核参数设为1,惩罚系数设为100。

model = SVR(kernel='rbf',gamma= 1, C = 100)
model.fit(X,y)
model.predict(X)
# 运行结果
array([ 6.1       ,  7.93810802,  9.06189198, 10.9       ])

真实的输出是y=[6,8,9,11],那么可以看到这样模型的精度就有了明显的提升。如果我们事先知道模型的超参数,那么可以很容易得出较好的预测结果。但如果不知道的话,就需要进行调参。当然调参的方式有很多种,后面的教程我们再详细讨论。

二、符合上述通用模式的常用模型

这里我们只简单小结一下部分的模型,具体的内容可以根据实际需要继续查询官方文档即可。

模型(群)名称

命名空间

文档链接

线性模型

LinearModels

https://scikit-learn.org/stable/modules/linear_model.html

神经网络

trtneural_network

https://scikit-learn.org/stable/modules/classes.html#module-sklearn.neural_network

支持向量机

SVM

https://scikit-learn.org/stable/modules/svm.html

高斯过程

gaussian_process

https://scikit-learn.org/stable/modules/gaussian_process.html

决策树

tree

https://scikit-learn.org/stable/modules/tree.html

随机森林

ensemble.RandomForestRegressor

https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestRegressor.html#sklearn.ensemble.RandomForestRegressor