引言:本文旨在利用Sklearn中的
ParameterGrid
来实现一个自定义化的网格搜索(GridSearch)函数,应用场景的话是可以自定义评价指标、同时能够在固定的验证集而非默认使用K-fold进行最优模型保存。
问题概述
网格搜索(GridSearch)可以帮助我们确定最优的模型参数,但它的封装程度较高,难以进行自定义的评价指标设置;此外默认使用K-fold来选取最优参数也比较烦人。因此本文设计的自定义GridSearch流程实现了在固定的evaluation set进行最优模型的选取。
设计思路
设计流程和原始的GridSearch一致,主要是利用了Sklearn中原本就有的ParameterGrid来生成一系列的候选参数,循环创建对应的模型,在验证集上评估模型的效果并保存系列模型的得分,最终选取最优模型。代码如下:
def custom_GridSearch(params,model,train_feature,train_label,eval_feature,eval_label,criterion):
from sklearn.model_selection import ParameterGrid
candidatas=ParameterGrid(params)
result={}
for i in range(candidatas.__len__()):
temp_model=model(**candidatas[i])
temp_model.fit(train_feature,train_label)
pred=temp_model.predict(eval_feature)
score=criterion(eval_label,pred)
result[i]=score
result=sorted(result.items(),key=lambda item:item[1],reverse=True)
model_best=model(**candidatas[result[0][0]])
model_best.fit(train_feature,train_label)
print('--------------------------------Attrabutes-------------------------------')
print('best_estimator_:', model_best)
print('best_params_:', candidatas[result[0][0]])
print('best_score_:',result[0][1])
return model_best
给出SVM场景下的使用范例:
import numpy as n
import numpy as np
from sklearn.svm import SVC
from sklearn.metrics import f1_score,precision_score,recall_score,accuracy_score,roc_curve
train_featue=np.random.rand(10,100)
train_label=np.random.randint(0,2,(10,))
eval_feature=np.random.rand(5,100)
eval_label=np.random.randint(0,2,(5,))
best=custom_GridSearch(params,SVC,train_featue,train_label,eval_feature,eval_labe
总结
实际上最后发现还是不要固定验证集来评估模型的好坏,非常容易过拟合,还是在数据处理上做好准备吧。