1. 参数调整

         每个机器学习算法包含一系列参数,勇于调整算法来控制模型。一般来说随着算法复杂度的增加,调整参数会越多,更难于理解。下面几个例子为流行的分类算法调参方法:

1)逻辑回归:无

2)knn:要平均的近邻数目

3)决策树:划分标准、树的最大深度、划分需要的最少样本数。

4)核函数SVM:核函数类型、核函数系数、惩罚参数。

5)随机森林:树的数目、每个节点要划分的特征数、划分标准、划分需要的最少样本数。

6)Boosting算法:树的数目、学习率、树的最大深度、划分标准、划分需要的最少样本数。

 

2.网格搜索

      优化机器学习模型的调整参数选择的标准方法是网格搜素,简单来说这种方法就是将许多参数类别及其可能取到的值放在一起进行搭配,当所有可能的组合被搜索一遍后,取最优参数组合即可。具体算法如下:

1)选择要最大化的评价指标(例如分类模型中的AUC,回归模型中的R2

2)选择要使用的机器学习算法(例如随机森林)

3)选择要优化的调整参数(例如树的数目等)

4)定义调整参数数组之间的笛卡儿积作为网格(就是将不同参数的取值分组嘛)。

5)对于上面网格中的每一组参数使用训练集进行交叉验证,并且对交叉验证的预测计算评价指标。

6)最后选择评价指标最大值对应的参数进行设置,即为最优模型。

当然网格搜索也不能绝对保证找到的调参数值为最优,毕竟实际最佳值可能并没有落在网格范围中。

 

3.sklearn 中的网格搜索: sklearn.model_selection.GridSearchCV

 GridSearchCV(estimatorparam_gridscoring=Nonefit_params=Nonen_jobs=1iid=Truerefit=Truecv=Noneverbose=0pre_dispatch=‘2*n_jobs’error_score=’raise’return_train_score=True)

输入主要参数说明:

estimator:使用的分类器

paran_grid: 字典或列表,参数名字为字典的键。

scoring;准确度评价标准,默认None,这时需要使用score函数;或者如scoring='roc_auc',根据所选模型不同,评价准则不同.如果是None,则使用estimator的误差估计函数。

n_jobs: 并行数,int:个数,-1:跟CPU核数一致, 1:默认值。

iid:默认True,为True时,默认为各个样本fold概率分布一致,误差估计为所有样本之和,而非各个fold的平均。

 

cv :交叉验证参数,默认None,使用三折交叉验证。指定fold数量,默认为3,也可以是yield训练/测试数据的生成器。

返回参数:

cv_results_:字典格式,其中的键params对应的value值为参数设置字典,  {...  'params' : [{'kernel': 'poly', 'degree': 2}, ...],  }

best_estimator: 分类器或字典。返回得分最高的分类器。

best_score:浮点数。最优分类器的交叉验证结果的均值。

best_params:字典,描述了已取得最佳结果的参数的组合。

scorer_:函数或字典。打分函数通过对数据打分用来选择最好的模型。

n_splits_ : 整数,交叉验证划分的折数。

 

示例:



clf_ext = svm.SVC(C=1.0, kernel='poly', degree=3)
param_grid = { "C" : [0.9,0.95,1.0,1.05,1.1],
 "kernel" : ['linear', 'poly', 'rbf', 'sigmoid']}
gs = GridSearchCV(estimator=clf_ext, param_grid=param_grid, scoring='accuracy', cv=3)
gs = gs.fit(X,y)
print(gs.best_score_)
print(gs.best_params_)



最好得结果为:  0.821548821549         对应的参数为: {'min_samples_split': 10, 'criterion': 'gini', 'n_estimators': 20, 'min_samples_leaf': 5}