Task6:掌握分类问题的评估及超参数调优

1.超参数简介

1.1超参数的“学院派”定义

在机器学习的过程中,
超参= 在开始机器学习之前,就人为设置好的参数。
模型参数=通过训练得到的参数数据。
通常情况下,需要对超参数进行优化,给学习机选择一组最优超参数,以提高学习的性能和效果

1.2怎么决定超参数

1. 定义关于模型的更高层次的概念,如复杂性或学习能力。
2. 不能直接从标准模型培训过程中的数据中学习,需要预先定义。
3. 可以通过设置不同的值,训练不同的模型和选择更好的测试值来决定

1.3超参数的“通俗”定义

超参数也是一种参数,它具有参数的特性,比如未知,也就是它不是一个已知常量。
是一种手工可配置的设置,需要为它根据已有或现有的经验,指定“正确”的值,也就是人为为它设定一个值,它不是通过系统学习得到的。

1.4超参数的一些示例

1. 聚类中类的个数
2. 话题模型中话题的数量
3. 模型的学习率
4. 深层神经网络隐藏层数
5.树的数量或树的深度
6. 矩阵分解中潜在因素的数量
7. k均值聚类中的簇数

2.分类算法的超参数详解

2.1.朴树贝叶斯

class sklearn.naive_bayes.GaussianNB (priors=None, var_smoothing=1e-09)

prior(先验概率):可输入任何类数组结构,形状为(n_classes,)表示类的先验概率。如果指定,则不根据数据调整先验,如果不指定,则自行根据数据计算先验概率P(y)

var_smoothing:浮点数,可不填(默认值= 1e-9)在估计方差时,为了追求估计的稳定性,将所有特征的方差中最大的方差以某个比例添加到估计的方差中。这个比例,由var_smoothing参数控制。

2.2KNN

class sklearn.neighbors.KNeighborsClassifier(n_neighbors=5, weights=’uniform’, algorithm=’auto’, leaf_size=30, p=2, metric=’minkowski’, metric_params=None, n_jobs=1, **kwargs)
n_neighbors:选取几个邻居
weights:邻居的权重是平均呢,还是越重话语权越大呢
algorithm:后面再展开
- ‘ball_tree’ will use BallTree
- ‘kd_tree’ will use KDTree
- ‘brute’ will use a brute-force search.
- ‘auto‘默认选项,是看哪个好用那个
leaf_size:只有ball_tree和kd_tree才有必要
p与metric:距离表示,p=1是manhattan_distance,p=2是euclidean_distance。

2.3逻辑回归

class sklearn.linear_model.LogisticRegression(penalty=‘l2’, dual=False,tol=0.0001, C=1.0, fit_intercept=True, intercept_scaling=1,class_weight=None, random_state=None, solver=‘liblinear’, max_iter=100,multi_class=‘ovr’,verbose=0, warm_start=False, n_jobs=1)
正则化参数:penalty

{‘l1’,‘l2’, ‘elasticnet’, ‘none’}, default=’l2’
1、newton-cg、sag 和 lbfgs 算法只能使用 l2 正则化,因为L1正则化的损失函数不是连续可导的。
2、elasticnet是弹性网络正则化,是L1正则化和L2正则化的混合项,仅支持saga损失函数优化器。
3、在调参时一般选择L2正则化就够了,但是如果选择L2正则化发现还是过拟合,即预测效果差的时候,就可以考虑L1正则化。另外,如果模型的特征非常多,我们希望一些不重要的特征系数归零,从而让模型系数稀疏化的话,也可以使用L1正则化。

损失函数优化器:solver

{‘liblinear’,‘lbfgs’, ‘sag’,‘newton-cg’, ‘saga’}, default=’lbfgs’
solver参数决定了我们对逻辑回归损失函数的优化方法,有5种算法可以选择,分别是:
  a) liblinear:使用了开源的liblinear库实现,内部使用了坐标轴下降法来迭代优化损失函数,适用于小数据集。
  b) lbfgs:拟牛顿法的一种,利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数。
  c) newton-cg:也是牛顿法家族的一种,利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数。
  d) sag:即随机平均梯度下降,是梯度下降法的变种,和普通梯度下降法的区别是每次迭代仅仅用一部分的样本来计算梯度,适合于样本数据多的时候,sag是一种线性收敛算法,这个速度远比梯度下降法快。
  e) saga:快速梯度下降法,线性收敛的随机优化算法的的变种,适用于样本量非常大的数据集。

分类方式选择参数:multi_class

{‘auto’, ‘ovr’, ‘multinomial’}, default=’auto’
1、‘ovr’ – ‘OvR’, 将多分类问题看成是二分类问题,每次只将一类样本与其他类样本组成的集合进行训练,进行 nc 次训练以后就可以完成多分类问题的处理了。
2、‘multinomial’ – ‘MvM’,liblinear 不能选择该项,以单循环的方式进行分类,每次处理两个分类,保证样本中所有分类两两组合进行过一次训练,共需 nc*(nc-1)/2 次训练,分类速度慢,但分类结果更准确。
3、‘auto’ – 如果 resolver 是 liblinear 则选择 OvR,否则选择 MvM。  
OvR相对简单,但分类效果相对略差。而MvM分类相对精确,但是分类速度没有OvR快。

类型权重参数:class_weight

{dict or ‘balanced’}, default=None
class_weight 参数决定了样本的各分类类型权重,可以取值:
1、dict – 通过 dict 定义分类权重:{class_label: weight}。
2、balanced – 类库会根据训练样本量来计算权重。某种类型样本量越多,则权重越低,样本量越少,则权重越高。
3、None – 默认值,不指定权重。

2.4随机深林

RF划分时考虑的最大特征数max_features

可以使用很多种类型的值,默认是"auto",意味着划分时最多考虑N−−√N个特征;如果是"log2"意味着划分时最多考虑log2Nlog2N个特征;如果是"sqrt"或者"auto"意味着划分时最多考虑N−−√N个特征。如果是整数,代表考虑的特征绝对数。如果是浮点数,代表考虑特征百分比,即考虑(百分比xN)取整后的特征数。其中N为样本总特征数。一般我们用默认的"auto"就可以了,如果特征数非常多,我们可以灵活使用刚才描述的其他取值来控制划分时考虑的最大特征数,以控制决策树的生成时间。

决策树最大深度max_depth

默认可以不输入,如果不输入的话,决策树在建立子树的时候不会限制子树的深度。一般来说,数据少或者特征少的时候可以不管这个值。如果模型样本量多,特征也多的情况下,推荐限制这个最大深度,具体的取值取决于数据的分布。常用的可以取值10-100之间。

内部节点再划分所需最小样本数min_samples_split:

 这个值限制了子树继续划分的条件,如果某节点的样本数少于min_samples_split,则不会继续再尝试选择最优特征来进行划分。 默认是2.如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值。

叶子节点最少样本数min_samples_leaf

这个值限制了叶子节点最少的样本数,如果某叶子节点数目小于样本数,则会和兄弟节点一起被剪枝。 默认是1,可以输入最少的样本数的整数,或者最少样本数占样本总数的百分比。如果样本量不大,不需要管这个值。如果样本量数量级非常大,则推荐增大这个值。

叶子节点最小的样本权重和min_weight_fraction_leaf

这个值限制了叶子节点所有样本权重和的最小值,如果小于这个值,则会和兄弟节点一起被剪枝。 默认是0,就是不考虑权重问题。一般来说,如果我们有较多样本有缺失值,或者分类树样本的分布类别偏差很大,就会引入样本权重,这时我们就要注意这个值了。

最大叶子节点数max_leaf_nodes

通过限制最大叶子节点数,可以防止过拟合,默认是"None”,即不限制最大的叶子节点数。如果加了限制,算法会建立在最大叶子节点数内最优的决策树。如果特征不多,可以不考虑这个值,但是如果特征分成多的话,可以加以限制,具体的值可以通过交叉验证得到。

节点划分最小不纯度min_impurity_split:  

这个值限制了决策树的增长,如果某节点的不纯度(基于基尼系数,均方差)小于这个阈值,则该节点不再生成子节点。即为叶子节点 。一般不推荐改动默认值1e-7。

上面决策树参数中最重要的包括最大特征数max_features, 最大深度max_depth, 内部节点再划分所需最小样本数min_samples_split和叶子节点最少样本数min_samples_leaf。

2.5决策树

criterion : string, optional (default=”gini”)

选择 gini 或者 entropy 选择以gini或是信息熵作为信息增益的计算

splitter : string, optional (default=”best”)

将连续变量分箱的方式,best选择最佳分箱方式,random选择最佳的随机分箱方式

max_depth : int or None, optional (default=None)

决策树深度,如果不设置,那么决策树会分裂到直到所有的叶子节点中只含有同一种样本或者叶子中的样本数小于min_samples_split参数

min_samples_split : int, float, optional (default=2)

如果是整数,就是每个叶子节点需要进一步分裂的最少样本数,如果是小数,那么这个最少样本个数等于min_samples_split*样本总数。

min_samples_leaf : int, float, optional (default=1)

如果是整数,就是每个叶子节点最少容纳的样本数,如果是小数,那么每个叶子节点最少容纳的个数等于min_samples_leaf*样本总数。如果某个分裂条件下分裂出得某个子树含有的样本数小于这个数字,那么不能进行分裂。

min_weight_fraction_leaf : float, optional (default=0.)

叶子节点最少需要占据总样本的比重,如果样本比重没有提供的话,每个样本占有相同比重

max_features : int, float, string or None, optional (default=None)

分裂时需要考虑的最多的特征数,如果是整数,那么分裂时就考虑这几个特征,如果是小数,则分裂时考虑的特征数=max_features*总特征数,如果是“auto”或者“sqrt”,考虑的特征数是总特征数的平方根,如果是“log2”,考虑的特征数是log2(总特征素),如果是None,考虑的特征数=总特征数。需要注意的是,如果在规定的考虑特征数之内无法找到满足分裂条件的特征,那么决策树会继续寻找特征,直到找到一个满足分裂条件的特征。

random_state : int, RandomState instance or None, optional (default=None)

随机数值,用于打乱,默认使用np.random

max_leaf_nodes : int or None, optional (default=None)

规定最多的叶子个数,根据区分度从高到低选择叶子节点,如果不传入这个参数,则不限制叶子节点个数。

min_impurity_decrease : float, optional (default=0.)

最低分裂不纯度,当分裂后的减少的不纯度大于等于这个值时,才进行分裂。不纯度的计算公式如上。

min_impurity_split : float, (default=1e-7)

最少分裂阀值,如果一个节点的不纯度大于这个值的时候才进行分裂。

class_weight : dict, list of dicts, “balanced” or None, default=None

类别权重,对每个类别设置权重,示例如上,如果标签是多列的,那么每一列的的权重将会被相乘,如果在fit方法中传入了样本权重字典,那么类别权重会和样本权重相乘。

presort : bool, optional (default=False)

预排序,可以用来加速,注意在默认配置情况下,在数据集较大的情况下,预排序会降低训练速度,而在小样本或者在限制深度的情况下,预排序可以加速训练过程。

2.6GBDT

n_estimators: 也就是弱学习器的最大迭代次数,或者说最大的弱学习器的个数。一般来说n_estimators太小,容易欠拟合,n_estimators太大,又容易过拟合,一般选择一个适中的数值。默认是100。在实际调参的过程中,我们常常将n_estimators和下面介绍的参数learning_rate一起考虑。

learning_rate: 即每个弱学习器的权重缩减系数ν \nuν,也称作步长,在原理篇的正则化章节我们也讲到了,加上了正则化项,我们的强学习器的迭代公式为f k ( x ) = f k − 1 ( x ) + ν h k ( x ) f_k(x)=f_{k−1}(x)+\nu h_k(x)fk​(x)=fk−1​(x)+νhk​(x)。ν \nuν的取值范围为0 &lt; ν ≤ 1 0&lt;\nu≤10<ν≤1。对于同样的训练集拟合效果,较小的ν \nuν意味着我们需要更多的弱学习器的迭代次数。通常我们用步长和迭代最大次数一起来决定算法的拟合效果。所以这两个参数n_estimatorslearning_rate要一起调参。一般来说,可以从一个小一点的ν开始调参,默认是1。

subsample: 即我们在原理篇的正则化章节讲到的子采样,取值为(0,1]。注意这里的子采样和随机森林不一样,随机森林使用的是放回抽样,而这里是不放回抽样。如果取值为1,则全部样本都使用,等于没有使用子采样。如果取值小于1,则只有一部分样本会去做GBDT的决策树拟合。选择小于1的比例可以减少方差,即防止过拟合,但是会增加样本拟合的偏差,因此取值不能太低。推荐在[0.5, 0.8]之间,默认是1.0,即不使用子采样。

init: 即我们的初始化的时候的弱学习器,拟合对应原理篇里面的f 0 ( x ) f_0(x)f0​(x),如果不输入,则用训练集样本来做样本集的初始化分类回归预测。否则用init参数提供的学习器做初始化分类回归预测。一般用在我们对数据有先验知识,或者之前做过一些拟合的时候,如果没有的话就不用管这个参数了。

loss: 即我们GBDT算法中的损失函数。分类模型和回归模型的损失函数是不一样的。

对于分类模型,有对数似然损失函数"deviance"和指数损失函数"exponential"两者输入选择。默认是对数似然损失函数"deviance"。在原理篇中对这些分类损失函数有详细的介绍。一般来说,推荐使用默认的"deviance"。它对二元分离和多元分类各自都有比较好的优化。而指数损失函数等于把我们带到了Adaboost算法。

对于回归模型,有均方差"ls", 绝对损失"lad", Huber损失"huber"和分位数损失“quantile”。默认是均方差"ls"。一般来说,如果数据的噪音点不多,用默认的均方差"ls"比较好。如果是噪音点较多,则推荐用抗噪音的损失函数"huber"。而如果我们需要对训练集进行分段预测的时候,则采用“quantile”。

alpha:这个参数只有GradientBoostingRegressor有,当我们使用Huber损失"huber"和分位数损失“quantile”时,需要指定分位数的值。默认是0.9,如果噪音点较多,可以适当降低这个分位数的值。

2.7SVM

C:惩罚参数。 默认值是1.0,C越大,相当于惩罚松弛变量,希望松弛变量接近0,即对误分类的惩罚增大,趋向于对训练集全分对的情况,这样对训练集测试时准确率很高,但容易过拟合,高方差,泛化能力弱。C值小,对误分类的惩罚减小,允许容错,将他们当成噪声点,泛化能力较强,但过小容易欠拟合,高偏差。

cache_size :核函数cache缓存大小,默认为200。

class_weight :类别的权重,字典形式传递。设置第几类的参数C为weight*C(C-SVC中的C)

coef0 :核函数的常数项。对于‘poly’和 ‘sigmoid’有用。

decision_function_shape :‘ovo’, ‘ovr’ or None, default=ovr

degree :多项式poly函数的维度,默认是3,选择其他核函数时会被忽略。

gamma : ‘rbf’,‘poly’和‘sigmoid’的核函数参数。默认是’auto’,如果是auto,则值为1/n_features

kernel :核函数。默认是’rbf’,可以是‘linear’, ‘poly’, ‘rbf’, ‘sigmoid’, ‘precomputed’
  0 – 线性:u’v
  1 – 多项式:(gamma*u’v + coef0)^degree
  2 – RBF函数:exp(-gamma|u-v|^2)
  3 – sigmoid:tanh(gamma
u’*v + coef0)

max_iter :最大迭代次数。-1为无限制。

probability :是否采用概率估计?.默认为False

random_state :数据洗牌时的种子值,int值

shrinking :是否采用shrinking heuristic方法,默认为true

tol :停止训练的误差值大小,默认为1e-3

verbose :允许冗余输出

参考链接:

https://zhuanlan.zhihu.com/p/78137628

https://blog.csdn.net/OuDiShenmiss/article/details/105234824

 

 

 

在PySpark中,我们可以使用网格搜索、随机搜索和贝叶斯优化等算法进行超参数调优来优化随机森林模型的性能。超参数调优是通过调整模型的超参数来优化模型的学习过程或结构,这些超参数在训练过程中不会被学习到。 一个常见的超参数调优方法是网格搜索。网格搜索是指在给定的超参数范围内,穷举所有可能的组合,并通过交叉验证来评估每个模型的性能,最终选择性能最好的超参数组合作为最佳模型。在PySpark中,可以使用`ParamGridBuilder`类来定义超参数的网格范围,然后使用`CrossValidator`类进行交叉验证。 另一种超参数调优的方法是随机搜索。随机搜索是指在给定的超参数范围内,随机选择一组超参数,并通过交叉验证来评估模型的性能。通过多次随机选择和评估,可以找到性能较好的超参数组合。在PySpark中,可以使用`RandomSearch`类来进行随机搜索。 此外,贝叶斯优化也是一种常用的超参数调优方法。贝叶斯优化通过构建一个模型来估计超参数与模型性能之间的关系,并使用贝叶斯推断来选择下一个最有可能导致性能提升的超参数组合。在PySpark中,可以使用`mlflow`库的`hyperopt`模块来进行贝叶斯优化。 综上所述,PySpark中的超参数调优可以通过网格搜索、随机搜索和贝叶斯优化等算法来进行。这些方法可以帮助我们找到最佳的超参数组合,从而优化随机森林模型的性能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [《大数据机器学习实践探索》 ---- 使用spark MLlib进行机器学习(3.超参数调优:树模型调优)](https://blog.csdn.net/wangyaninglm/article/details/116177170)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值