最为常见的调参方法就是使用网格搜索+交叉验证进行参数的优化(GridsearchCV)
GridSearchCV的sklearn官方网址:
sklearn.model_selection.GridSearchCV — scikit-learn 1.0.2 documentation
1.1.1简单示例
from sklearn import tree
clf = tree.DecisionTreeClassifier(class_weight='balanced')
#自动调参
tree_param_grid = {'criterion' : ["gini"],
'splitter': ["random"],
'max_depth' : range(5,30,5),
'min_samples_split': range(10,210,50),
'min_samples_leaf': [5,10],
tree_best = GridSearchCV(clf,param_grid = tree_param_grid,cv = 3,scoring="roc_auc",n_jobs= -1, verbose = 100)
#进行网格搜索交叉验证调参
tree_best.fit(feature_train,target_train)
print(tree_best.best_estimator_)
print(tree_best.best_params_," ","得分:",tree_best.best_score_)
y_predict = tree_best.predict(feature_test) # 进行预测
y_prob = tree_best.predict_proba(feature_test) # 进行预测
输出示例:
Fitting 3 folds for each of 40 candidates, totalling 120 fits DecisionTreeClassifier(class_weight='balanced', max_depth=15, min_samples_leaf=5, min_samples_split=160, splitter='random')
{'criterion': 'gini', 'max_depth': 15, 'min_samples_leaf': 5, 'min_samples_split': 160, 'splitter': 'random'} 得分: 0.9651868978885353
1.1.2参数说明
class sklearn.model_selection.GridSearchCV(estimator, param_grid, scoring=None, fit_params=None, n_jobs=1, iid=True, refit=True, cv=None, verbose=0, pre_dispatch=‘2*n_jobs’, error_score=’raise’, return_train_score=’warn’)
(1)
estimator
选择使用的分类器,并且传入除需要确定最佳的参数之外的其他参数。以随机森林为例,初始化一个带有你能尽可能先确定的参数的RandomForestClassifier:estimator=RandomForestClassifier(min_samples_split=100,min_samples_leaf=20,max_depth=8,max_features='sqrt',random_state=10),
(2)
param_grid
需要最优化的参数的取值,值为字典或者列表,例如:param_grid =tree_param_grid ,tree_param_grid = {'criterion' : ["gini"],
'splitter': ["random"],
'max_depth' : range(5,30,5),
'min_samples_split': range(10,210,50),
'min_samples_leaf': [5,10],
}
(3)
scoring=None
模型评价标准,默认None,这时需要使用score函数;或者如scoring='roc_auc'.
(4)
fit_params=None
(5)
n_jobs=1
n_jobs: 并行数,int:个数,-1:跟CPU核数一致(即使用全部cpu进行模型训练), 1:默认值
(6)
iid=True
iid
:默认True,为True时,默认为各个样本fold概率分布一致,误差估计为所有样本之和,而非各个fold的平均。
(7)
refit=True
默认为True,程序将会以交叉验证训练集得到的最佳参数,重新对所有可用的训练集与开发集进行,作为最终用于性能评估的最佳模型参数。即在搜索参数结束后,用最佳参数结果再次fit一遍全部数据集。
(8)
cv=None
交叉验证参数,默认None,使用三折交叉验证。指定fold数量,默认为3,也可以是yield训练/测试数据的生成器。
(9)
verbose=0
,
scoring=None
verbose
:日志冗长度,int:冗长度,0:不输出训练过程,1:偶尔输出,>1:对每个子模型都输出。
(10)
pre_dispatch=‘2*n_jobs’
指定总共分发的并行任务数。当n_jobs大于1时,数据将在每个运行点进行复制,这可能导致OOM,而设置pre_dispatch参数,则可以预先划分总共的job数量,使数据最多被复制pre_dispatch次
(11)
error_score=’raise’
(12)
return_train_score=’warn’
如果“False”,cv_results_属性将不包括训练分数
回到sklearn里面的GridSearchCV,GridSearchCV用于系统地遍历多种参数组合,通过交叉验证确定最佳效果参数。
1.1.3 属性
(
1
)
cv_results_ : dict of numpy (masked) ndarrays
具有键作为列标题和值作为列的dict,可以导入到DataFrame中。
(
2
)
best_estimator_ : estimator
通过搜索选择的估计器,即在左侧数据上给出最高分数(或指定的最小损失)的估计器。 如果
refit = False
,则不可用。
这个属性可以作为下一轮调参时的输入estimator。这是一个快速构建下一轮调参的小技巧。
(
3
)
best_score_ : float
best_estimator的分数
(
4
)
best_params_ : dict
在保存数据上给出最佳结果的参数设置
(
5
)
best_index_ : int
对应于最佳候选参数设置的索引(cv_results_数组)。
search.cv_results _ ['params'] [search.best_index_]中的dict给出了最佳模型的参数设置,给出了最高的平均分数(search.best_score_)。
(
6
)
scorer_ : function
Scorer function used on the held out data to choose the best parameters for the model.
(
7
)
n_splits_ : int
The number of cross-validation splits (folds/iterations).
(8)grid_scores_:
给出不同参数情况下的评价结果
1.2GridsearchCV的好处和弊端
(1)一定会在给出的超参数集上给出最优参数解,不会陷入局部最优;
(2)理解起来比较容易
(1)数据集一大,参数一多,调参所需时间复杂度就指数级上升,而许多模型的参数就是会很多。
2.调参顺序
树形模型的参数都比较多,如果使用在一轮gridsearchcv里将所有参数进行调参,会指数级提升运算复杂度,有可能一两天还调不出来一个随机森林的参数。因此将某些需要首先在一起调参的参数在一轮中调参,其他没有必要一起调参的参数或没有必要优先进行调参的参数在另一轮进行调整,以此类推,能够指数级节约调参时间。这一调参方法也被成称为数据量比较大的时候可以使用一个快速调优的方法——
坐标下降
,是一种贪心算法:拿当前对模型影响最大的参数调优,直到最优化;再拿下一个影响最大的参数调优,如此下去,直到所有的参数调整完毕。
2.1调参加速小技巧
(1)利用gridsearchcv的
best_estimator_ 属性。
目前网上的很多代码都是先进行一轮调参,找到最优参数后再使用这一轮调参的最优参数构建新的estimator,然后进行下一轮调参,这在实际操作中非常不方便,代码不具备可重用性,并且每次训练都要重新进行参数的设置。利用
best_estimator_
属性可以快速建立下一轮的调参,并且不用先查看上一轮的最优参数在进行估计器的构建。
(2)更改GridsearchcCV()参数cv。cv越小,进行交叉验证的次数越少,将cv改小可以减少寻优次数,个人实验证明在树形模型下,cv=3和cv=10的效果差不多,但不同的数据集可能有不同的结果。
(3)使用 sklearn.model_selection.RandomizedSearchCV替代GridsearchCV。引入随机性,对参数寻优进行随机搜索。RandomizedSearchCV的参数和属性与GridsearchCV几乎一样。
考察其源代码,其搜索策略如下:
(a)对于搜索范围是distribution的超参数,根据给定的distribution随机采样;
(b)对于搜索范围是list的超参数,在给定的list中等概率采样;
(c)对a、b两步中得到的n_iter组采样结果,进行遍历。
但这一方法有可能会使参数寻优陷入局部最优解,但实践中基本上没有很大区别。
2.1随机森林、GBDT、LightGBM和XGBoost调参顺序
随机森林:
比较重要的几个参数的调参顺序如下:
n_estimators-->min_samples_split-->max_features-->max_depth
#随机森林
def my_randomforest(feature_train,target_train,feature_test,target_test):
from sklearn import ensemble
rf = ensemble.RandomForestClassifier(class_weight='balanced')
rf_param_grid1 = {'n_estimators':[100,200,400,800,1000,1200,1500],}
rf_best = GridSearchCV(rf,param_grid = rf_param_grid1,cv = 3,scoring="roc_auc",n_jobs= -1, verbose=100)
rf_best.fit(feature_train,target_train)
print(type(rf_best.best_params_))
rf_param_grid2 = {'min_samples_split':range(30,111,20)}
rf_best2 = GridSearchCV(rf_best.best_estimator_,param_grid = rf_param_grid2,cv = 3,scoring="roc_auc",n_jobs= -1, verbose=100)
rf_best2.fit(feature_train,target_train)
rf_param_grid3 = {'max_features':range(5,76,10),}
rf_best3 = GridSearchCV(rf_best.best_estimator_,param_grid = rf_param_grid3,cv = 3,scoring="roc_auc",n_jobs= -1, verbose=100)
rf_best3.fit(feature_train,target_train)
rf_param_grid4 = {'max_depth':range(3,22,3)}
rf_best4 = GridSearchCV(rf_best.best_estimator_,param_grid = rf_param_grid6,cv = 3,scoring="roc_auc",n_jobs= -1, verbose=100)
rf_best4.fit(feature_train,target_train)
print(rf_best4.best_estimator_)
print(rf_best4.best_params_," ","得分:",rf_best4.best_score_)
y_predict = rf_best4.predict(feature_test) # 进行预测
y_prob = rf_best4.predict_proba(feature_test) # 进行预测
result_evaluation(target_test,y_prob,y_predict)
return rf_best6.best_params_,rf_best6,y_prob
注:result_evaluation()函数是我将求约登指数、给出默认阈值下的混淆矩阵和最佳阈值下的混淆矩阵以及ROC图集成在一个函数里的实现,见我个人主页另一篇文章。
【机器学习系列】【模型评价】【ROC曲线、约登指数最佳阈值】一个函数中实现约登指数计算并集成到ROC图中,给出默认阈值及最佳阈值下的混淆矩阵_学金融的程序员懒羊羊的博客-CSDN博客
输入实际标签、预测的概率值、预测标签,计算最佳阈值,输出ROC曲线,输出默认阈值下的混淆矩阵和最佳阈值下的混淆矩阵
https://blog.csdn.net/standingflower/article/details/124564004?spm=1001.2014.3001.5502
gbdt:
比较重要的几个参数的调参顺序如下:
n_estimators-->max_depth和min_samples_split-->min_samples_split和min_samples_leaf-->max_features-->subsample->learning_rate
#GBDT
#https://blog.csdn.net/olizxq/article/details/89222908
def my_gbdt(feature_train,target_train,feature_test,target_test):
from sklearn.ensemble import GradientBoostingClassifier
gbdt = GradientBoostingClassifier()
gbdt_param_grid1 = {'n_estimators':[50,100,200,400,800],}
gbdt_best = GridSearchCV(gbdt,param_grid = gbdt_param_grid1,cv = 3,scoring="roc_auc",n_jobs= -1, verbose=100)
gbdt_best.fit(feature_train,target_train)
gbdt_param_grid2 = {'max_depth':[5,10,15,20,25],
'min_samples_split':range(100,801,200)}
gbdt_best2 = GridSearchCV(gbdt_best.best_estimator_,param_grid = gbdt_param_grid2,cv = 3,scoring="roc_auc",n_jobs= -1, verbose=100)
gbdt_best2.fit(feature_train,target_train)
gbdt_param_grid3 = {'min_samples_split':range(300,1701,200),
'min_samples_leaf':range(60,101,10)}
gbdt_best3 = GridSearchCV(gbdt_best2.best_estimator_,param_grid = gbdt_param_grid3,cv = 3,scoring="roc_auc",n_jobs= -1, verbose=100)
gbdt_best3.fit(feature_train,target_train)
gbdt_param_grid4 = {'max_features':range(7,20,2)}
gbdt_best4 = GridSearchCV(gbdt_best3.best_estimator_,param_grid = gbdt_param_grid4,cv = 3,scoring="roc_auc",n_jobs= -1, verbose=100)
gbdt_best4.fit(feature_train,target_train)
gbdt_param_grid5 = {'subsample':[0.6,0.7,0.75,0.8,0.85,0.9]}
gbdt_best5 = GridSearchCV(gbdt_best4.best_estimator_,param_grid = gbdt_param_grid5,cv = 3,scoring="roc_auc",n_jobs= -1, verbose=100)
gbdt_best5.fit(feature_train,target_train)
gbdt_param_grid6 = {'learning_rate':[0.001,0.01,0.1,0.25]}
gbdt_best6 = GridSearchCV(gbdt_best5.best_estimator_,param_grid = gbdt_param_grid6,cv = 3,scoring="roc_auc",n_jobs= -1, verbose=100)
gbdt_best6.fit(feature_train,target_train)
print(gbdt_best6.best_estimator_)
print(gbdt_best6.best_params_," ","得分:",gbdt_best6.best_score_)
y_predict = gbdt_best6.predict(feature_test) # 进行预测
y_prob = gbdt_best6.predict_proba(feature_test) # 进行预测
result_evaluation(target_test,y_prob,y_predict)
return gbdt_best6.best_params_,gbdt_best6,y_prob
LightGBM
就不给代码示例了,顺序是:
n_estimators-->max_depth和min_samples_split-->min_samples_split和min_samples_leaf-->max_features-->subsample->learning_rate
XGBoost
就不给代码示例了,顺序是:
n_estimators-->max_depth和min_child_weight-->gamma-->subsample-->reg_alpha-->learning_rate
本文将记录一下几个可以将模型参数分开进行调参的树形模型的调参顺序。以及几个能够加快调参速度的小技巧(主要介绍坐标下降)。(1)利用gridsearchcv的best_estimator_ 属性。(2)更改GridsearchcCV()参数cv。(3)使用 sklearn.model_selection.RandomizedSearchCV替代GridsearchCV。
运用from
sklearn
.model_selection import Random
Search
CV
运用from
sklearn
.model_selection import
Grid
Search
CV
不断调整参数,比较预测准确度,最终确定最优模型。
Sklearn
(全称 Scikit-Learn) 是基于
Python
语言的
机器学习
工具。它建立在 NumPy, SciPy, Pandas 和 Matplotlib 之上,里面的 API 的设计非常好,所有对象的接口简单,很适合新手上路。
在
Sklearn
里面有六大任务模块:分别是分类、回归、聚类、降维、模型选择和预处理,如下图从其官网的截屏。
要使用上述六大模块的方法,可以用以下的伪代码,注意import后面我用的都是一些通用名称,如Some
Class
ifier
, Some
随机森林
算法
的理论知识
随机森林
是一种有监督学习
算法
,是以决策树为基学习器的集成学习
算法
。
随机森林
非常简单,易于实现,计算开销也很小,但是它在分类和回归上表现出非常惊人的性能,因此,
随机森林
被誉为“代表集成学习技术水平的方法”。
一,
随机森林
的随机性体现在哪几个方面?
1,数据集的随机选取
从原始的数据集中采取有放回的抽样(bagging),构造子数据集,子数据集的数据量是和原始数据集相同的。不同子数据集的元素可以重复,同一个子数据集中的元素也可以重复。
2,待选特征的随机选取
Python
下
Gradient
Boo
s
ting
Machine(GBM)
调参
完整指导
简介:如果你现在仍然将GBM作为一个黑盒使用,或许你应该点开这篇文章,看看他是如何工作的。
Boo
s
ting
算法
在平衡偏差和方差方面扮演了重要角色。和bagging
算法
仅仅只能处理模型高方差不同,
boo
s
ting
在处理这两个方面都十分有效。真正地理解GBM能够给你处理这些关键问题的信心。
在这篇文章中,...
首先需要
介绍
的工具是
sklearn
的模型选择API(
Grid
Search
CV
)
官网链接:http://scikit-learn.org/stable/modules/generated/
sklearn
.
grid
_
search
.
Grid
Search
CV
.html
第一节:
Grid
Search
CV
函数的用法
sklearn
.
grid
_
search
.
Grid
Search
CV
(
estimato
用
LightGBM
和
xgboost
分别做了Kaggle的Digit Recognizer,尝试用
Grid
Search
CV
调了下参数,
主要
是对max_depth, learning_rate, n_estimates等参数进行调试,最后在0.969。
能力有限,接下来也不知道该如何进一步
调参
。
另外
xgboost
的
Grid
Search
CV
还是不会用,如果有大神会的话,烦请告知。
python
在定义一个方法(def)时,默认参数值的使用说明:
有时候你需要定义一个函数,让它接受一个参数(例如:message),而且在这个参数出现或不出现时,函数有不同的行为。
def test(message=None):
if message:
print("参数进来了" + message)
else:
print('没有参数')
test()
print('---------------------')
test('11111')
#输出结果
https://blog.csdn.net/ztf312/article/details/98596968
https://blog.csdn.net/wydyttxs/article/details/76695205
https://zhuanlan.zhihu.com/p/51886442
数据集下载链接:https://www.kaggle.com/c/titanic
二、数据预处理
介绍
2.函数原型
class
sklearn
.model_selection.
Grid
Search
CV
(
estimator, param_
grid
, scoring=None,
fit_params=None, n_jobs=1, iid=True,
grid
search
cv
+
lightgbm
cv
函数
调参
:
https://www.twblogs.net/a/5be215942b717720b51cce01/zh-cn
使用
grid
search
cv
调参
时,某一轮下已经确定的参数(比如步长为1时已经确定max_...
import numpy as np
from
sklearn
.tree import DecisionTree
Class
ifier
from
sklearn
.pipeline import make_pipeline
from
sklearn
.
grid
_
search
import...
import
lightgbm
as lgb
import numpy as np
from
sklearn
.datasets import make_multilabel_
class
ification
from
sklearn
.model_selection import train_test_split
from
sklearn
.metrics import accuracy_score, f1_score
from bayes_opt import BayesianOptimization
# 生成随机的多标签分类数据集
X, y = make_multilabel_
class
ification(n_samples=1000, n_features=20, n_
class
es=5)
# 将数据集划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
# 将标签转换为
LightGBM
所需的格式
lgb_train = lgb.Dataset(X_train, y_train)
# 定义要优化的目标函数
def lgb_eval(num_leaves, learning_rate, feature_fraction, bagging_fraction):
params = {
'task': 'train',
'
boo
s
ting
_type': '
gbdt
',
'objective': 'multilabel',
'metric': 'binary_logloss',
'num_leaves': int(num_leaves),
'learning_rate': learning_rate,
'feature_fraction': max(min(feature_fraction, 1), 0),
'bagging_fraction': max(min(bagging_fraction, 1), 0),
# 训练模型
model = lgb.train(params, lgb_train, num_
boo
st_round=100)
# 预测测试集
y_pred_prob = model.predict(X_test)
y_pred = np.round(y_pred_prob)
# 计算模型评估指标
f1 = f1_score(y_test, y_pred, average='micro')
return f1
# 定义参数的搜索空间
pbounds = {
'num_leaves': (10, 50),
'learning_rate': (0.01, 0.1),
'feature_fraction': (0.1, 0.9),
'bagging_fraction': (0.8, 1.0),
# 创建Bayesian优化对象
optimizer = BayesianOptimization(
f=lgb_eval,
pbounds=pbounds,
random_state=42,
# 开始优化
optimizer.maximize(init_points=10, n_iter=10)
# 输出最优参数
print(optimizer.max)
在这个示例中,我们使用`make_multilabel_
class
ification`函数生成了一个随机的多标签分类数据集,并将数据集划分为训练集和测试集。然后,我们定义了一个目标函数`lgb_eval`,其中包含将参数传递给
LightGBM
模型并计算F1得分的逻辑。接下来,我们定义了参数的搜索空间`pbounds`,并创建了一个Bayesian优化对象。最后,我们使用`maximize`函数开始进行优化,并输出最优参数。
请注意,这里使用了第三方库`bayes_opt`来实现贝叶斯优化,你需要先安装该库。你可以根据自己的数据和需求修改参数的搜索空间和目标函数。希望对你有帮助!如果有任何问题,请随时提问。
【机器学习系列】【调参GridsearchCV】随机森林、GBDT、LightGBM和XGBoost调参顺序,外加一些加速调参的小技巧(主要介绍坐标下降)
m0_63107052:
【金融】中国vix、skew指数的Python实现
weixin_49222917:
【金融】中国vix、skew指数的Python实现
weixin_43189713: