Python的位置参数、默认参数、关键字参数、可变参数区别

Python015

Python的位置参数、默认参数、关键字参数、可变参数区别,第1张

对于python函数参数,对于初学者可能就是进入了迷宫,尽管我也是初学者,简单总结一下。

说参数之前,先讲一下两个packing(包裹)和unpacking(解包裹):

输出:

我总结不了这个概念,只能帮大家到这了

一、位置参数和关键字参数:

调用函数时根据函数定义的参数位置来传递参数。

注意:

有位置参数时,位置参数必须在关键字参数的前面,但关键字参数之间不存在先后顺序的

二、默认参数:

用于定义函数,为参数提供默认值,调用函数时可传可不传该默认参数的值(注意:所有位置参数必须出现在默认参数前,包括函数定义和调用)

三、可变参数:

定义函数时,有时候我们不确定调用的时候会传递多少个参数(不传参也可以)。此时,可用包裹(packing)位置参数,或者包裹关键字参数,来进行参数传递,会显得非常方便。

1、包裹位置传递

我们传进的所有参数都会被args变量收集,它会根据传进参数的位置合并为一个元组(tuple),args是元组类型,这就是包位置传递。

2、包裹关键字传递

kargs是一个字典(dict),收集所有关键字参数

四、解包裹参数:

*args 和 **kargs ,也可以在函数调用的时候使用,称之为解包(unpacking)

1、在传递元组时,让元组的每一个元素对应一个位置参数

2、在传递词典字典时,让词典的每个键值对作为一个关键字参数传递给函数

五、位置参数、默认参数、可变参数的混合使用

1、基本原则是:先位置参数,默认参数,包裹位置,包裹关键字(定义和调用都应遵循)

2、Python中 *args 和 **kwargs 的区别

先看个demo:

输出结果:

分析一下:可以看到,这两个是[Python]中的可变参数。 *args 表示任何多个无名参数,它是一个tuple; **kwargs 表示关键字参数,它是一个dict。并且同时使用 *args 和 **kwargs 时,必须 *args 参数列要在 **kwargs 前,否则会报语法错误!!!

还有个小应用场景:创建字典

其实python中就带有dict类,使用dict(a=1,b=2,c=3)即可创建一个字典了。

*args:

重点在*,后面的args相当于一个变量名,可以自己定义的。它的本质就是将标准调用剩下的值集中转变为元组。

从形参的角度:

从实参的角度:

从不同角度看**kwargs:

**kwargs与位置参数和默认参数混用:

超复杂混合参数混用记:

总结:

位置参数:

调用函数时所传参数的位置必须与定义函数时参数的位置相同

关键字参数:

使用关键字参数会指定参数值赋给哪个形参,调用时所传参数的位置可以任意

*位置参数:可接受任意数量的位置参数(元组);只能作为最后一个位置参数出现,其后参数均为关键字参数

**关键字参数:可接受任意数量的关键字参数(字典);只能作为最后一个参数出现

Python函数的参数类型主要包括必选参数、可选参数、可变参数、位置参数和关键字参数,本文介绍一下他们的定义以及可变数据类型参数传递需要注意的地方。

必选参数(Required arguments)是必须输入的参数,比如下面的代码,必须输入2个参数,否则就会报错:

其实上面例子中的参数 num1和num2也属于关键字参数,比如可以通过如下方式调用:

执行结果:

可选参数(Optional arguments)可以不用传入函数,有一个默认值,如果没有传入会使用默认值,不会报错。

位置参数(positional arguments)根据其在函数定义中的位置调用,下面是pow()函数的帮助信息:

x,y,z三个参数的的顺序是固定的,并且不能使用关键字:

输出:

在上面的pow()函数帮助信息中可以看到位置参数后面加了一个反斜杠 / ,这是python内置函数的语法定义,Python开发人员不能在python3.8版本之前的代码中使用此语法。但python3.0到3.7版本可以使用如下方式定义位置参数:

星号前面的参数为位置参数或者关键字参数,星号后面是强制关键字参数,具体介绍见强制关键字参数。

python3.8版本引入了强制位置参数(Positional-Only Parameters),也就是我们可以使用反斜杠 / 语法来定义位置参数了,可以写成如下形式:

来看下面的例子:

python3.8运行:

不能使用关键字参数形式赋值了。

可变参数 (varargs argument) 就是传入的参数个数是可变的,可以是0-n个,使用星号( * )将输入参数自动组装为一个元组(tuple):

执行结果:

关键字参数(keyword argument)允许将任意个含参数名的参数导入到python函数中,使用双星号( ** ),在函数内部自动组装为一个字典。

执行结果:

上面介绍的参数可以混合使用:

结果:

注意:由于传入的参数个数不定,所以当与普通参数一同使用时,必须把带星号的参数放在最后。

强制关键字参数(Keyword-Only Arguments)是python3引入的特性,可参考:https://www.python.org/dev/peps/pep-3102/。 使用一个星号隔开:

在位置参数一节介绍过星号前面的参数可以是位置参数和关键字参数。星号后面的参数都是强制关键字参数,必须以指定参数名的方式传参,如果强制关键字参数没有设置默认参数,调用函数时必须传参。

执行结果:

也可以在可变参数后面命名关键字参数,这样就不需要星号分隔符了:

执行结果:

在Python对象及内存管理机制中介绍了python中的参数传递属于对象的 引用传递 (pass by object reference),在编写函数的时候需要特别注意。

先来看个例子:

执行结果:

l1 和 l2指向相同的地址,由于列表可变,l1改变时,l2也跟着变了。

接着看下面的例子:

结果:

l1没有变化!为什么不是[1, 2, 3, 4]呢?

l = l + [4]表示创建一个“末尾加入元素 4“的新列表,并让 l 指向这个新的对象,l1没有进行任何操作,因此 l1 的值不变。如果要改变l1的值,需要加一个返回值:

结果:

下面的代码执行结果又是什么呢?

执行结果:

和第一个例子一样,l1 和 l2指向相同的地址,所以会一起改变。这个问题怎么解决呢?

可以使用下面的方式:

也可以使用浅拷贝或者深度拷贝,具体使用方法可参考Python对象及内存管理机制。这个问题在Python编程时需要特别注意。

本文主要介绍了python函数的几种参数类型:必选参数、可选参数、可变参数、位置参数、强制位置参数、关键字参数、强制关键字参数,注意他们不是完全独立的,比如必选参数、可选参数也可以是关键字参数,位置参数可以是必选参数或者可选参数。

另外,python中的参数传递属于对象的 引用传递 ,在对可变数据类型进行参数传递时需要特别注意,如有必要,使用python的拷贝方法。

参考文档:

--THE END--

XGBoost参数

XGBoost的参数可以分为三种类型:通用参数、booster参数以及学习目标参数

General parameters:参数控制在提升(boosting)过程中使用哪种booster,常用的booster有树模型(tree)和线性模型(linear model)。

Booster parameters:这取决于使用哪种booster。

Learning Task parameters:控制学习的场景,例如在回归问题中会使用不同的参数控制排序。

除了以上参数还可能有其它参数,在命令行中使用

General Parameters

booster [default=gbtree] 

有两种模型可以选择gbtree和gblinear。gbtree使用基于树的模型进行提升计算,gblinear使用线性模型进行提升计算。缺省值为gbtree

silent [default=0] 

取0时表示打印出运行时信息,取1时表示以缄默方式运行,不打印运行时的信息。缺省值为0

建议取0,过程中的输出数据有助于理解模型以及调参。另外实际上我设置其为1也通常无法缄默运行。。

nthread [default to maximum number of threads available if not set] 

XGBoost运行时的线程数。缺省值是当前系统可以获得的最大线程数

如果你希望以最大速度运行,建议不设置这个参数,模型将自动获得最大线程

num_pbuffer [set automatically by xgboost, no need to be set by user] 

size of prediction buffer, normally set to number of training instances. The buffers are used to save the prediction results of last boosting step.

num_feature [set automatically by xgboost, no need to be set by user] 

boosting过程中用到的特征维数,设置为特征个数。XGBoost会自动设置,不需要手工设置

Booster Parameters

From xgboost-unity, the bst: prefix is no longer needed for booster parameters. Parameter with or without bst: prefix will be equivalent(i.e. both bst:eta and eta will be valid parameter setting) .

Parameter for Tree Booster

eta [default=0.3] 

为了防止过拟合,更新过程中用到的收缩步长。在每次提升计算之后,算法会直接获得新特征的权重。 eta通过缩减特征的权重使提升计算过程更加保守。缺省值为0.3

取值范围为:[0,1]

通常最后设置eta为0.01~0.2

gamma [default=0] 

minimum loss reduction required to make a further partition on a leaf node of the tree. the larger, the more conservative the algorithm will be.

range: [0,∞]

模型在默认情况下,对于一个节点的划分只有在其loss function 得到结果大于0的情况下才进行,而gamma 给定了所需的最低loss function的值

gamma值使得算法更conservation,且其值依赖于loss function ,在模型中应该进行调参。

max_depth [default=6] 

树的最大深度。缺省值为6

取值范围为:[1,∞]

指树的最大深度

树的深度越大,则对数据的拟合程度越高(过拟合程度也越高)。即该参数也是控制过拟合

建议通过交叉验证(xgb.cv ) 进行调参

通常取值:3-10

min_child_weight [default=1] 

孩子节点中最小的样本权重和。如果一个叶子节点的样本权重和小于min_child_weight则拆分过程结束。在现行回归模型中,这个参数是指建立每个模型所需要的最小样本数。该成熟越大算法越conservative。即调大这个参数能够控制过拟合。

取值范围为: [0,∞]

max_delta_step [default=0] 

Maximum delta step we allow each tree’s weight estimation to be. If the value is set to 0, it means there is no constraint. If it is set to a positive value, it can help making the update step more conservative. Usually this parameter is not needed, but it might help in logistic regression when class is extremely imbalanced. Set it to value of 1-10 might help control the update

取值范围为:[0,∞]

如果取值为0,那么意味着无限制。如果取为正数,则其使得xgboost更新过程更加保守。

通常不需要设置这个值,但在使用logistics 回归时,若类别极度不平衡,则调整该参数可能有效果

subsample [default=1] 

用于训练模型的子样本占整个样本集合的比例。如果设置为0.5则意味着XGBoost将随机的从整个样本集合中抽取出50%的子样本建立树模型,这能够防止过拟合。

取值范围为:(0,1]

colsample_bytree [default=1] 

在建立树时对特征随机采样的比例。缺省值为1

取值范围:(0,1]

colsample_bylevel[default=1]

决定每次节点划分时子样例的比例

通常不使用,因为subsample和colsample_bytree已经可以起到相同的作用了

scale_pos_weight[default=0]

A value greater than 0 can be used in case of high class imbalance as it helps in faster convergence.

大于0的取值可以处理类别不平衡的情况。帮助模型更快收敛

Parameter for Linear Booster

lambda [default=0] 

L2 正则的惩罚系数

用于处理XGBoost的正则化部分。通常不使用,但可以用来降低过拟合

alpha [default=0] 

L1 正则的惩罚系数

当数据维度极高时可以使用,使得算法运行更快。

lambda_bias 

在偏置上的L2正则。缺省值为0(在L1上没有偏置项的正则,因为L1时偏置不重要)

Task Parameters

objective [ default=reg:linear ] 

定义学习任务及相应的学习目标,可选的目标函数如下:

“reg:linear” –线性回归。

“reg:logistic” –逻辑回归。

“binary:logistic” –二分类的逻辑回归问题,输出为概率。

“binary:logitraw” –二分类的逻辑回归问题,输出的结果为wTx。

“count:poisson” –计数问题的poisson回归,输出结果为poisson分布。

在poisson回归中,max_delta_step的缺省值为0.7。(used to safeguard optimization)

“multi:softmax” –让XGBoost采用softmax目标函数处理多分类问题,同时需要设置参数num_class(类别个数)

“multi:softprob” –和softmax一样,但是输出的是ndata * nclass的向量,可以将该向量reshape成ndata行nclass列的矩阵。每行数据表示样本所属于每个类别的概率。

“rank:pairwise” –set XGBoost to do ranking task by minimizing the pairwise loss

base_score [ default=0.5 ] 

the initial prediction score of all instances, global bias

eval_metric [ default according to objective ] 

校验数据所需要的评价指标,不同的目标函数将会有缺省的评价指标(rmse for regression, and error for classification, mean average precision for ranking)

用户可以添加多种评价指标,对于Python用户要以list传递参数对给程序,而不是map参数list参数不会覆盖’eval_metric’

The choices are listed below:

“rmse”: root mean square error

“logloss”: negative log-likelihood

“error”: Binary classification error rate. It is calculated as #(wrong cases)/#(all cases). For the predictions, the evaluation will regard the instances with prediction value larger than 0.5 as positive instances, and the others as negative instances.

“merror”: Multiclass classification error rate. It is calculated as #(wrong cases)/#(all cases).

“mlogloss”: Multiclass logloss

“auc”: Area under the curve for ranking evaluation.

“ndcg”:Normalized Discounted Cumulative Gain

“map”:Mean average precision

“ndcg@n”,”map@n”: n can be assigned as an integer to cut off the top positions in the lists for evaluation.

“ndcg-“,”map-“,”ndcg@n-“,”map@n-“: In XGBoost, NDCG and MAP will evaluate the score of a list without any positive samples as 1. By adding “-” in the evaluation metric XGBoost will evaluate these score as 0 to be consistent under some conditions. 

training repeatively

seed [ default=0 ] 

随机数的种子。缺省值为0

可以用于产生可重复的结果(每次取一样的seed即可得到相同的随机划分)

Console Parameters

The following parameters are only used in the console version of xgboost 

* use_buffer [ default=1 ] 

- 是否为输入创建二进制的缓存文件,缓存文件可以加速计算。缺省值为1 

* num_round 

- boosting迭代计算次数。 

* data 

- 输入数据的路径 

* test:data 

- 测试数据的路径 

* save_period [default=0] 

- 表示保存第i*save_period次迭代的模型。例如save_period=10表示每隔10迭代计算XGBoost将会保存中间结果,设置为0表示每次计算的模型都要保持。 

* task [default=train] options: train, pred, eval, dump 

- train:训练模型

- pred:对测试数据进行预测 

- eval:通过eval[name]=filenam定义评价指标 

- dump:将学习模型保存成文本格式 

* model_in [default=NULL] 

- 指向模型的路径在test, eval, dump都会用到,如果在training中定义XGBoost将会接着输入模型继续训练 

* model_out [default=NULL] 

- 训练完成后模型的保存路径,如果没有定义则会输出类似0003.model这样的结果,0003是第三次训练的模型结果。 

* model_dir [default=models] 

- 输出模型所保存的路径。 

* fmap 

- feature map, used for dump model 

* name_dump [default=dump.txt] 

- name of model dump file 

* name_pred [default=pred.txt] 

- 预测结果文件 

* pred_margin [default=0] 

- 输出预测的边界,而不是转换后的概率

如果你比较习惯scikit-learn的参数形式,那么XGBoost的Python 版本也提供了sklearn形式的接口 XGBClassifier。它使用sklearn形式的参数命名方式,对应关系如下:

eta –>learning_rate

lambda –>reg_lambda

alpha –>reg_alpha