Python sklearn模型参数调优

参数调优往往是数据挖掘和分析中至关重要的一步,一组好的参数能够使模型的预测或者分类更加的准确,使得模型能够完美的刻画数据的规律,在python中的sklearn中主要有两种参数调优的方法,分别为网格搜索法和随机搜索方法,下面分别介绍两种算法的核心思想:

1、网格搜索法-GridSearchCV

网格搜索方法需要事先给出每个参数的具体取值(注意是具体的取值而不是取值范围),然后网格搜索方法会对参数进行一一组合并应用每个组合的参数进行拟合数据,显然如果你提供的参数的取值较多,网格搜索方法会特别的耗时,所以在应用网格搜索方法进行参数调优的时候,需要对模型的参数范围应该有一个大概的了解,每个参数的取不要过多,否则在进行参数选择的时候会非常的耗时(当然如果你有足够的机器选择更多的参数取值也是可取的)。

 1 # 导入需要的函数库
 2 from sklearn.ensemble import RandomForestClassifier
 3 from sklearn import datasets
 4 from sklearn.model_selection import GridSearchCV
 5 
 6 
 7 # 加载iris数据集
 8 iris = datasets.load_iris()
 9 iris_feature = iris['data']
10 iris_target = iris['target']
11 
12 
13 # 实例化随机森林分类函数类
14 forest_clf=RandomForestClassifier(random_state=42)
15 
16 # 建立需要搜索的参数的范围
17 param_grid =[{'n_estimators':[10,30,50,100],     #当数据量较大时,可能无法使用很多的参数。可以\n采用坐标下降的方法,即先根据超参的重要性,将所有超参分成重要,一般重要及不重要排序。然后先去优化选\n择最重要的超参,固定其他的超参。然后固定此超参,搜索次重要的。一直到全部搜索完毕。此方法是局部优,\n但是节省计算开支。
18              'max_depth':[5,10,20]}]
19 # 初始化网格搜索的方法
20 grid_search = GridSearchCV(forest_clf,param_grid,cv=3)
21 #用网格搜索方法进行拟合数据
22 grid_search.fit(iris_feature,iris_target)
23 # 输出最优的参数组合
24 print(grid_search.best_params_)
25 best_model = grid_search.best_estimator_

2、随机搜索法-RandomizedSearchCV

随机搜索法需要事先给出每个参数的取值范围,该方法会在每个参数的范围进行随机选取进行相应的组合,随机搜索相对于网格搜索方法来说找到模型的最优参数的可能性比较大,并且也比较省时,这种方法试用于那些对参数的取值并不确定,需要在较大的范围内寻找最优的参数组合。

 1 #导入相应的函数库
 2 from sklearn import datasets
 3 from sklearn.ensemble import RandomForestClassifier
 4 from sklearn.model_selection import RandomizedSearchCV  #从陪你过sklearn包中的模型选择模块调用\n随机搜索子模块(.py文件)
 5 import numpy as np
 6 
 7 #加载iris数据集
 8 iris = datasets.load_iris()
 9 iris_feature = iris['data']
10 iris_target = iris['target']
11 
12 
13 #建模分析
14 forest_clf = RandomForestClassifier(random_state=42)
15 param_distribs = {'n_estimators':range(10,100),'max_depth':range(5,20)}
16 random_search = RandomizedSearchCV(forest_clf,param_distribs,n_iter=50,cv=3) #生成随机搜索方\n法
17 random_search.fit(iris_feature,iris_target)  #用设置的随机搜索方法拟合数据
18 print(random_search.best_params_)
19 best_model = random_search.best_estimator_