Scikit-Learn指南01
基本介绍
pip install -U scikit-learn
import sklearn
sklearn.version
作为功能完整算法库,sklearn不仅提供了完整的机器学习建模功能支持,同时也提供了包括数据预处理、模型评估、模型选择等诸多功能,并且支持以Pipelines(管道)形式构建机器学习流,而基于Pipeline和模型选择功能甚至能够衍化出AutoML(自动机器学习)的相关功能,也就是现在所谓的Auto-sklearn。
sklearn核心对象类型:评估器(estimator)
很多功能完整的第三方库其实都有各自定义的核心对象类型,如NumPy中的数组(Array)、Pandas中的DataFrame、以及PyTorch中的张量(tensor)等,当然这些由第三方库定义的数据结构实际上都是定义在源码中的某个类,在调用这些对象类型时实际上都是在实例化对应的类。
而对于sklearn来说,定义的核心对象类型就是评估器。
我们可以将评估器就理解成一个个机器学习模型,而sklearn的建模过程最核心的步骤就是围绕着评估器进行模型的训练。
导入评估器实际上就相当于是导入了某个模块(实际上是某个类),但要使用这个评估器类,还需要对其进行实例化操作才能进行后续的使用,类的实例化过程会有可选参数的输入,当然也可以不输入任何参数直接实例化该类的对象。
如:
model = LinearRegression()
调用评估器中的fit方法进行模型训练
model.fit(X, y)
查看自变量参数
model.coef_
查看模型截距
model.intercept_
在metrics模块下导入MSE计算函数
from sklearn.metrics import mean_squared_error
输入数据,进行计算
mean_squared_error(model.predict(X), y)
调用sklearn进行的机器学习建模,不仅代码简单、而且过程也非常清晰,这些其实全都得益于Scikit-Learn对各评估器都设置了较为普适的初始默认参数所导致。
超参数,指的是无法通过数学过程进行最优值求解、但却能够很大程度上影响模型形式和建模结果的因素,例如线性回归中,方程中自变量系数和截距项的取值是通过最小二乘法或者梯度下降算法求出的最优解,而例如是否带入带入截距项、是否对数据进行归一化等,这些因素同样会影响模型形态和建模结果,但却是“人工判断”然后做出决定的选项,而这些就是所谓的超参数。
而sklearn中,对每个评估器进行超参数设置的时机就在评估器类实例化的过程中。首先我们可以查看LinearRegression评估器的相关说明,其中Parameters部分就是当前模型超参数的相关说明。
LinearRegression?
fit_intercept | 是否构建带有截距项的线性方程,默认为True |
---|---|
normalize | 是否进行归一化处理 |
copy_X | 建模时是否带入训练数据的副本 |
n_jobs | 设置工作时参与计算的CPU核数 |
操作步骤 | 代码意义 | 建模意义 |
---|---|---|
评估器实例化 | 类在进行实例化时设置初始属性 | 对模型进行超参数设置 |
超参数的设置方法和参数不同,一个模型的参数形式基本根据模型的计算规则就能确定,而一个模型包含几个超参数,其实是因模型而异、因工具而异的。
例如,对于sklearn来说,我们可以通过n_jobs来设置参与计算的CPU核数,而在Spark中则是通过配置文件中的配置选项来分配每个任务的计算资源,不需要在算法执行过程中设置该超参数。
但无论如何,sklearn中的超参数设计一定是一整套最符合sklearn设计理念以及模型运行方式的超参数,我们在实例化模型的过程中必须谨慎的选择模型超参数,以达到最终模型训练的预期。不过sklearn非常人性化的一点是,尽管大多数模型多有非常多的超参数(线性回归除外),但sklearn都对其设置了一套非常普适的默认值,从而使得在很多场景下,在无需特别关注的一些超参数的取值上,我们都能够直接使用默认值带入进行建模。
coef_ | 线性方程自变量系数 |
---|---|
rank_ | 特征矩阵的秩 |
singular_ | 特征矩阵的奇异值 |
intercept_ | 线性方程截距项的系数 |
sklearn是采用哪种方式进行求解的呢?需要知道的是,这个问题其实至关重要,它不仅影响了sklearn中该算法的执行计算效率,同时也决定了该算法的很多建模特性,而我们对任何一个算法工具的掌握,都不能仅仅停留在“能够跑出结果”这个层面。