一、管道
1、构造管道
# 标准语句
from sklearn.pipeline import Pipeline
pipe = Pipeline(steps)
# 缩减语句
from sklearn.pipeline import make_pipeline
pipe = Pipeline(*steps)
标准语句中的steps:列表形式,列表元素为元组(‘step_name’, step),'step_name’是步骤名称,可以自定义,step是实例化的估计器
缩减语句中的steps:只需要输入实例化的估计器,‘step_name’会自动生成
2、管道方法
pipe本身可以看做一个估计器,所以pipe也有和估计器类似的 score()
、fit()
、predict()
等方法;
二、交叉检验与网格搜索
1、构造搜索
from sklearn.model_selection import GridSearchCV
grid = GridSearchCV(estimator, param_grid, n_jobs=None, cv=None)
estimator
:实例化后的估计器,或管道对象
param_grid
:字典或字典列表类型
n_jobs
:调用的cpu数量,默认为1
cv
:折叠数,默认为5
param_grid详解
(1)对estimator是单个估计器的网格搜索情况:输入类型是字典类型,键值对是“参数名”——参数迭代列表。
demo:
param_grid = {'C':[1,2,3], 'gamma':[1,2,3]}
grid = GridSearchCV(SVC(), param_grid=param_grid)
表示SVC()
估计器搜索C参数和gamma参数分别取1、2、3时的最优结果。
(2)对estimator是管道的网格搜索情况:输入类型是字典类型,键值对是“步骤名”——估计器列表,或是“步骤参数名”——参数迭代列表,其中步骤参数名的格式为“步骤名__参数名”(之间用双下划线连接)。
demo:
pipe = Pipeline([('reprocess', PCA()), ('regression', LinearSVC())])
param_grid =
{
'reprocess': [PCA()],
'regession': [LinearSVC(), LogisticRegression()],
'regression__C': [1,2,3]
}
grid = GridSearchCV(pipe, param_grid=param_grid)
表示reprocess步骤取PCA()
,regression步骤分别取LinearSVC()
、LogisticRegression()
,regression步骤估计器的C参数分别取1、2、3时,搜索出最优结果。
(3)非网格搜索情况:在某些条件下,如估计器的参数名不相同,或步骤不相同,无法通过一个字典迭代完所有情况时,可以使用非网格搜索。输入类型是字典列表。
demo:
pipe = Pipeline([('reprocess', PCA()), ('regression', SVC())])
param_grid =
[{
'reprocess': [PCA()],
'regession': [LinearSVC(), LogisticRegression()],
'regression__C': [1,2,3]
},
{
'reprecess': [None], #None表示本步骤省略
'regression': [RandomForestRegressor()],
'regression__n_estimators': [1,2,3]
}]
grid = GridSearchCV(pipe, param_grid=param_grid)
2、搜索器的方法和属性
(1)grid可以看成一个估计器,搜索出的最优估计器有的方法,grid也可以调用;
(2)best_params_
属性:字典类型,最好的参数组合
(3)best_estimator
属性:管道类型,最好的管道
(4)best_score_
属性:最高的分数
三、自定义估计器
GridSearchCV方法可以对sklearn里的估计器或管道使用,如果需要对非sklearn中的估计器进行网格搜索,可以根据以下步骤自定义一个估计器
1、估计器要求
(1)需要继承BaseEstimator
类
(2)需要自定义fit()
方法和score()
from sklearn.base import BaseEstimator
class MyEstimator(BaseEstimator):
def fit(self, X, y):
pass
def score(self, X, y):
pass
2、进一步简化构建估计器
可以将自定义估计器在继承BaseEstimator
的基础上再继承一个类(都在sklearn.base
中),则可以减少score()
方法的定义:
ClassifierMixin
:分类
ClusterMixin
:聚类
RegressorMixin
:回归
TransformerMixin
:转换