自动调参库hyperopt+lightgbm 调参demo

在此之前,调参要么网格调参,要么随机调参,要么肉眼调参。虽然调参到一定程度,进步有限,但仍然很耗精力。 自动调参库hyperopt可用tpe算法自动调参,实测强于随机调参。 hyperopt 需要自己写个输入参数,返回模型分数的函数(只能求最小化,如果分数是求最大化的,加个负号),设置参数空间。 本来最优参数fmin函数会自己输出的,但是出了意外,参数会强制转化整数,没办法只好自己动手了。 demo如下: import lightgbm as lgb from sklearn.metrics import roc_auc_score as auc def get_set(n1,data='trained.csv',n_splits=10,y=False,random_state=0): from sklearn.model_selection import KFold data=pd.read_csv(data) kf = KFold(n_splits=n_splits,shuffle=True,random_state=random_state) if y: train,test=pd.DataFrame(),pd.DataFrame() clas=list(data[y].unique()) for cla in clas: i=0 dd=data[data[y]==cla] for train_index,test_index in kf.split(dd): i=i+1 if n1==i: train=train.append(data.loc[list(train_index)]) test=test.append(data.loc[list(test_index)]) else: i=0 for train_index,test_index in kf.split(data): i=i+1 if n1==i: train=data.iloc[list(train_index),:] test=data.iloc[list(test_index),:] return train,test def scorer(yp,data): yt= data.get_label() score=auc(yt,yp) return 'auc',score,True def peropt(param): conf=['num_leaves','max_depth','min_child_samples','max_bin'] for i in conf: param[i]=int(param[i]) evals_result={} lgb.train(param, dtrain, 2000, feval=scorer, valid_sets=[dval], verbose_eval=None, evals_result=evals_result, early_stopping_rounds=10) best_score=evals_result['valid_0']['auc'][-11] #print(param,best_score,len(evals_result['valid_0']['auc'])-10) result.append((param,best_score,len(evals_result['valid_0']['auc'])-10)) return -best_score if 0:#数据集 i=1 x_train,x_test=get_set(i,n_splits=5) x_train.pop('CaseId') x_test.pop('CaseId') y_train=x_train.pop('Evaluation') y_test=x_test.pop('Evaluation') dtrain=lgb.Dataset(x_train,y_train) dval=lgb.Dataset(x_test,y_test) if 1:#调参 from hyperopt import fmin,tpe,hp#,rand#,pyll#,partial space={ 'num_leaves': hp.quniform('num_leaves',50,70,1) ,'max_depth':hp.quniform('max_depth',7,15,1) ,'min_child_samples':hp.quniform('min_child_samples',5,20,1) ,'max_bin':hp.quniform('max_bin',100,150,5) ,'learning_rate':hp.choice('learning_rate',[0.01]) ,'subsample':hp.uniform('subsample',0.9,1) ,'colsample_bytree':hp.uniform('colsample_bytree',0.95,1) ,'min_split_gain':hp.loguniform('min_split_gain',-5,2) ,'reg_alpha':hp.loguniform('reg_alpha',-5,2) ,'reg_lambda':hp.loguniform('reg_lambda',-5,2) } result=[] #print(pyll.stochastic.sample(space))#抽样 #algo=partial(tpe.suggest,n_startup_jobs=10)#作用未知 fmin(peropt, space=space, algo=tpe.suggest, max_evals=100 ) sort=sorted(result,key=lambda x:x[1],reverse=True)

转载于:https://www.cnblogs.com/offline-ant/p/9928839.html

Argparse是Python标准中的一个模块,用于解析命令行参数。使用argparse可以方便地从命令行中读取参数,并根据参数执行相应的操作。下面是使用argparse调参的步骤: 1. 创建ArgumentParser对象:使用`argparse.ArgumentParser()`创建一个参数解析器对象,可以通过添加描述等参数来自定义解析器。 2. 添加参数:使用`add_argument()`方法向解析器中添加需要解析的参数。可以指定参数的名称、类型、帮助信息等。例如,`parser.add_argument('--a')`添加了一个名为'a'的参数。 3. 解析参数:使用`parse_args()`方法解析添加的参数。该方法将命令行参数解析为一个命名空间对象,并将参数的值存储在该对象中。可以通过该对象的属性来获取参数的值。例如,`args.a`可以获取参数'a'的值。 综合以上步骤,下面是一个使用argparse调参的例子: ```python import argparse # 创建参数解析器 parser = argparse.ArgumentParser(description="Demo of argparse") # 添加参数 parser.add_argument('--a', type=int) parser.add_argument('--b', type=int) # 解析参数 args = parser.parse_args() # 获取参数的值并进行相应的操作 result = args.a + args.b print(result) ``` 在上面的例子中,我们创建了一个参数解析器,然后添加了两个参数'a'和'b',并指定了它们的类型为整数。最后,使用`args.a`和`args.b`获取参数的值,并将它们相加并打印出来。 请注意,调用时需要在命令行中指定参数的值,例如`python script.py --a 1 --b 2`。其中,script.py是脚本文件的名称,1和2是参数'a'和'b'的值。 : 使用 argparse 的3个步骤: 创建 `ArgumentParser()` 对象;调用 `add_argument()` 方法添加参数;使用 `parse_args()` 解析添加的参数。 : 我们先来看一个例子。import argparse import sys parser = argparse.ArgumentParser() parser.add_argument('--a', type=int) parser.add_argument('--b', type=int) print(sys.argv)。 : 例如 parser = argparse.ArgumentParser() parser.add_argument('--a') args = parser.parse_args()。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值