1.机器学习调参目标及基本方法
超参数的选择其实是经验+一定范围内枚举(也就是网格搜索)的方法来决定的
- 参数与超参数
影响机器学习建模结果的参数有两类,其一是参数,其二是超参数。
其中参数的数值计算由一整套数学过程决定,在选定方法后,其计算过程基本不需要人工参与。
因此我们经常说的模型调参,实际上是调整模型超参数。超参数种类繁多,而且无法通过一个严谨的数学流程给出最优解,因此需要人工参与进行调节。
- 超参数调整目标
超参数的调整目标是什么?是提升模型测试集的预测效果么?
无论是机器学习还是统计模型,只要是进行预测的模型,其实核心的建模目标都是为了更好的进行预测,也就是希望模型能够有更好的预测未来的能力,换而言之,就是希望模型能够有更强的泛化能力。
机器学习类算法的可信度来源则是训练集和测试集的划分理论,也就是机器学习会认为,只要能够在模拟真实情况的测试集上表现良好,模型就能够具备良好的泛化能力。
也就是说,超参数调整的核心目的是为了提升模型的泛化能力,而测试集上的预测效果只是模型泛化能力的一个具体表现,并且相比与一次测试集上的运行结果,其实借助交叉验证,能够提供更有效、更可靠的模型泛化能力的证明。
2.基于网格搜索的超参数的调整方法
2.1xgb调参步骤
- 如下步骤:
在训练集中进行验证集划分(几折待定);
带入训练集进行建模、带入验证集进行验证,并输出验证集上的模型评估指标;
计算多组验证集上的评估指标的均值,作为该超参数下模型最终表现;
1、通常先确定评估器数量和学习率,
先用网格搜索找出比较合适的评估器数量和学习率的组合,首先树越多应该效果越好,所以优先设置一个较大的弱评估器数量或者说是多的迭代次数,
接着选高的学习率,加快收敛速度,learning_rate = 0.1,之后根据验证交叉验证平均得分,不断细化;
2、调节最大深度/gamma:
通过简单调节调节最大深度,观察模型出于什么样的状态,是过拟合还是欠拟合,接下来调整每一颗树的深度
3、对树的抽样进行调整;
4、gamma
决定是否需要剪枝
5、最后再调整正则化参数
2.2各个参数详细介绍
n_estimators=100, # 使用多少棵树来拟合,也可以理解为多少次迭代。默认100;
learning_rate=0.1, # 学习率,每棵树的预测结果都要乘以这个学习率,默认0.3;
max_depth=3, # 每一棵树最大深度,默认6;一般取值范围为[3,10],随着深度的升高,模型就越复杂,则就容易发生过拟合。
- min_child_weight=1,
假设损失函数是均方误差函数,每个样本的二阶导数是一个常数,这个时候 min_child_weight就是这个叶子结点中样本的数目。如果这个值设置的太小,那么会出现单个样本成一个叶子结点的情况,这很容易过拟合。可以理解为叶子节点最小样本数,默认1;
subsample=1, # 训练集抽样比例,每次拟合一棵树之前,都会进行该抽样步骤。默认1,取值范围(0, 1]。训练样本的采样率,默认为1,即每次都用所有样本做提升
- gamma=0,
节点分裂时,只有分裂后损失函数或目标函数下降,才会继续分裂这个节点。叶节点上进行进一步分裂所需的最小"损失下降值"。参数值越大,算法越保守,下降越多才分裂。默认0;
colsample_bytree=1, # 每次拟合一棵树之前,决定使用多少个特征,参数默认1,取值范围(0, 1]。
reg_alpha=0, # 默认为0,控制模型复杂程度的权重值的 L1 正则项参数,参数值越大,模型越不容易过拟合。
reg_lambda=1, # 默认为1,控制模型复杂度的权重值的L2正则化项参数,参数越大,模型越不容易过拟合。
objective=‘reg:squarederror’, # 此默认参数与 XGBClassifier 不同,‘
booster=‘gbtree’, # 有两种模型可以选择gbtree和gblinear。gbtree使用基于树的模型进行提升计算,gblinear使用线性模型进行提升计算。默认为gbtree
2.1 参数空间
- 参数空间的定义
- 评估指标选取
而这个评估指标,对于分类模型来说,一般来说就是ROC-AUC或F1-Score,并且是基于交叉验证之后的指标。我们通常会选取ROC-AUC或F1-Score,其实也是因为这两个指标的敏感度要强于准确率(详见Lesson 5中的讨论),并且如果需要重点识别模型识别1类的能力,则可考虑F1-Score,其他时候更推荐使用ROC-AUC。
3.2 GridSearchCV评估器结果查看
此处我们先介绍关于网格搜索类的所有属性和方法,再来查看挑选其中重要属性的结果进行解读。在这里插入图片描述
xgboost调参
xgboost调参源码
利用shift+Tab可以知道,R^2评估指标
1.1XGB框架参数
1 booster 弱学习器类型:gbtree,cart,gblinear
2 n_estimators:弱学习器个数,太小容易欠拟合,太多容易过拟合
3 objetive:分类logistic还是回归mse
1.2 弱学习器参数
先调整n_estimators:弱学习器个数,max_depth,min_child_weight和gamma
1 maxdepth:
树结构深度,
2 min_child_weight:最小的子节点权重阈值
如果某个树节点的权重小于此阈值,则不再分裂子树,这个树节点就是叶子节点。权重为该节点所有样本的二阶导数和:
3 gamma 分裂所带来的损失减小阈值。
4 subsample :子采样参数
不妨会抽样,<1可以减小方差,防止过拟合,但是会增加样本拟合的偏差。初始取值为1,后期逐渐减小。
5 colsample_bytree/colsample_bylevel/colsample_bynode 特征采样
6 reg_alpha/reg_lambda
1.3 其他参数
学习率:控制每个弱学习器的权重缩减系数。数值较小意味着需要更多的弱学习器迭代次数。
n_jobs: 控制并发线程数
scale_pos_weight:类别不平衡
importance_type则可以查询各个特征的重要性程度。
原文链接:https://blog.csdn.net/Grateful_Dead424/article/details/122522010
from sklearn.metrics import roc_auc_score
import warnings
warnings.filterwarnings(“ignore”)
from sklearn.datasets import load_iris # 自带的样本数据集
iris = load_iris()
X = iris.data # 150个样本,4个属性
y = iris.target # 150个类标号
3、网格搜索缺点
不可解释
以随机森林为例介绍基本调用方法
穷举网格搜索
from sklearn.model_selection import GridSearchCV
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split # 切分数据
切分数据 训练数据80% 验证数据20%
train_data, test_data, train_target, test_target = train_test_split(
X, y, test_size=0.2, random_state=0)
model = RandomForestClassifier()
parameters = {‘n_estimators’: [20, 50, 100], ‘max_depth’: [1, 2, 3]}
clf = GridSearchCV(model, parameters, cv=3, verbose=2)
clf.fit(train_data, train_target)
print(“最优参数:”)
print(clf.best_params_)
print(“最优分数:”)
print(clf.best_score_)
sorted(clf.cv_results_.keys())
score_test = roc_auc_score(test_target, clf.predict_proba(test_data), multi_class=‘ovr’)
print("RandomForestClassifier GridSearchCV test AUC: ", score_test)
from sklearn.metrics import roc_auc_score
import warnings
warnings.filterwarnings(“ignore”)
from sklearn.datasets import load_iris # 自带的样本数据集
iris = load_iris()
X = iris.data # 150个样本,4个属性
y = iris.target # 150个类标号
from sklearn.model_selection import RandomizedSearchCV
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split # 切分数据
切分数据 训练数据80% 验证数据20%
train_data, test_data, train_target, test_target = train_test_split(
X, y, test_size=0.2, random_state=0)
model = RandomForestClassifier()
parameters = {‘n_estimators’: [10, 20, 30, 50], ‘max_depth’: [1, 2, 3]}
clf = RandomizedSearchCV(model, parameters, cv=3, verbose=2)
clf.fit(train_data, train_target)
score_test = roc_auc_score(test_target, clf.predict_proba(test_data), multi_class=‘ovr’)
print("RandomForestClassifier RandomizedSearchCV test AUC: ", score_test)
print(“最优参数:”)
print(clf.best_params_)
sorted(clf.cv_results_.keys())
参考链接:
网格搜索九天
xgb网格搜索调参代码实用
机器学习调参实战非常有用