回归模型的评估及超参数调优

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,118元/月
云原生网关 MSE Higress,422元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 回归模型的评估及超参数调优

一、回归模型

在机器学习中,其中算法最为重要一面就是回归算法,回归算法占我们理解机器学习一大块,这一块的学习可以帮助我们掌握超参数的调节。基本上只要一切基于特征预测连续型变量的需求,我们都使用回归技术。

最著名的就是我们的线性回归和逻辑回归,从他们衍生出了岭回归,Lasso,弹性网,除此之外,还有众多分类算法改进后的回归,比如回归树,随机森林的回归,支持向量回归,贝叶斯回归等等。在这里我们使用线性回归来了解回归模型评估和超参数调节。

首先,我们需要了解回归参数评价指标

二、回归类的模型评估指标

在回归模型中,我们的目标就是预测的准确性,那么我们所有目的就是准确率怎么样,所以准确率是我们的出发点,那么我要根据准确率来看回归效果,因此评价指标有两种:

第一,我们是否预测到了正确的数值。

第二,我们的拟合程度好不好

2.1、对于预测的准确率

对于预测的准确性,我们可以是使用:

  • RSS残差平方和(不常用)
  • 均方误差MSE(mean squared error)来衡量我们的预测值和真实值的差异

  • MAE(Mean absolute error,绝对均值误差)

现实我们使用中,MSE和MAE选一个来使用就好了(注意均方误差可能为负的,希望搞清楚这里为什么有的时候为负的)

2.2、对于信息拟合程度

对于一个拟合模型,如果我们使用MSE来对它进行判断,它的MSE会很小,因为大部分样本其实都被完美拟合了,少数样本的真实值和预测值的巨大差异在被均分到每个

样本上之后,MSE就会很小。但这样的拟合结果必然不是一个好结果,因为一旦我的新样本是处于拟合曲线的后半段的,我的预测结果必然会有巨大的偏差,而这不是我们希望看到的。所以,我们希望找到新的指标,除了判断预测的数值是否正确之外,还能够判断我们的模型是否拟合了足够多的,数值之外的信息。

为了衡量模型对数据上的信息量的捕捉,我们定义了R 2 R^2R2来帮助我们

效果就是R 2 R^2R2越近1越好

对于是R 2 R^2R2直接从metrics中导入r2_score,输入预测值和真实值后打分。第二种是直接从

线性回归LinearRegression的接口score来进行调用。第三种是在交叉验证中,输入"r2"来调用

三、超参数调节

网格搜索GridSearchCV(): (比较暴力,浪费时间)

网格搜索的思想非常简单,比如你有2个超参数需要去选择,那你就把所有的超参数选择列出来分别做排列组合。举个例子:λ = 0.01 , 0.1 , 1.0 \lambda = 0.01,0.1,1.0λ=0.01,0.1,1.0α = 0.01 , 0.1 , 1.0 \alpha = 0.01,0.1,1.0α=0.01,0.1,1.0,你可以做一个排列组合,即:{[0.01,0.01],[0.01,0.1],[0.01,1],[0.1,0.01],[0.1,0.1],[0.1,1.0],[1,0.01],[1,0.1],[1,1]} ,然后针对每组超参数分别建立一个模型,然后选择测试误差最小的那组超参数。换句话说,我们需要从超参数空间中寻找最优的超参数,很像一个网格中找到一个最优的节点,因此叫网格搜索。

随机搜索 RandomizedSearchCV() :

网格搜索相当于暴力地从参数空间中每个都尝试一遍,然后选择最优的那组参数,这样的方法显然是不够高效的,因为随着参数类别个数的增加,需要尝试的次数呈指数级增长。有没有一种更加高效的调优方式呢?那就是使用随机搜索的方式,这种方式不仅仅高校,而且实验证明,随机搜索法结果比稀疏化网格法稍好(有时候也会极差,需要权衡)。参数的随机搜索中的每个参数都是从可能的参数值的分布中采样的。与网格搜索相比,这有两个主要优点:

  • 可以独立于参数数量和可能的值来选择计算成本。
  • 添加不影响性能的参数不会降低效率。
from sklearn.svm import SVR     # 引入SVR类
from sklearn.pipeline import make_pipeline   # 引入管道简化学习流程
from sklearn.preprocessing import StandardScaler # 由于SVR基于距离计算,引入对数据进行标准化的类
from sklearn.model_selection import GridSearchCV  # 引入网格搜索调优
from sklearn.model_selection import cross_val_score # 引入K折交叉验证
from sklearn import datasets
boston = datasets.load_boston()     # 返回一个类似于字典的类
X = boston.data
y = boston.target
features = boston.feature_names
pipe_SVR = make_pipeline(StandardScaler(),SVR())
score1 = cross_val_score(estimator=pipe_SVR,
                         X = X,
                         y = y ,                     
                         scoring = 'r2',        
                         cv = 10)       # 10折交叉验证
print("CV accuracy: %.3f +/- %.3f" % ((np.mean(score1)),np.std(score1)))
CV accuracy: 0.187 +/- 0.649
# 下面我们使用网格搜索来对SVR调参:
from sklearn.pipeline import Pipeline
pipe_svr = Pipeline([("StandardScaler",StandardScaler()),
                     ("svr",SVR())])
param_range = [0.0001,0.001,0.01,0.1,1.0,10.0,100.0,1000.0]
param_grid = [{"svr__C":param_range,"svr__kernel":["linear"]},  
              # 注意__是指两个下划线,一个下划线会报错的
              {"svr__C":param_range,"svr__gamma":param_range,"svr__kernel":["rbf"]}]
gs = GridSearchCV(estimator=pipe_svr,          
                  param_grid = param_grid,
                  scoring = 'r2',
                  cv = 10)       # 10折交叉验证
gs = gs.fit(X,y)
print("网格搜索最优得分:",gs.best_score_)
print("网格搜索最优参数组合:\n",gs.best_params_)
网格搜索最优得分: 0.6081303070817127
网格搜索最优参数组合:
 {'svr__C': 1000.0, 'svr__gamma': 0.001, 'svr__kernel': 'rbf'}
# 下面我们使用随机搜索来对SVR调参:
from sklearn.model_selection import RandomizedSearchCV
from scipy.stats import uniform  # 引入均匀分布设置参数
pipe_svr = Pipeline([("StandardScaler",StandardScaler()),
                     ("svr",SVR())])
distributions = dict(svr__C=uniform(loc=1.0, scale=4),    # 构建连续参数的分布
                     svr__kernel=["linear","rbf"], # 离散参数的集合
                    svr__gamma=uniform(loc=0, scale=4))
rs = RandomizedSearchCV(estimator=pipe_svr,
                        param_distributions = distributions,
                        scoring = 'r2',
                        cv = 10)       # 10折交叉验证
rs = rs.fit(X,y)
print("随机搜索最优得分:",rs.best_score_)
print("随机搜索最优参数组合:\n",rs.best_params_)
随机搜索最优得分: 0.2990172103331221
随机搜索最优参数组合:
 {'svr__C': 4.999702477539999, 'svr__gamma': 1.9402586654643685, 'svr__kernel': 'linear'}

在这一节前面回归说的有一点大概,个人建议选择一本好的机器学习的书籍来通读一下,将能远远获得很多。最后,感谢阅读。

相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
相关文章
|
7月前
|
机器学习/深度学习 测试技术
大模型开发:描述交叉验证以及为什么在模型评估中使用它。
【4月更文挑战第24天】交叉验证是评估机器学习模型性能的方法,通过将数据集分成训练集和多个子集(折叠)进行多次训练验证。它能减少过拟合风险,提供更可靠的性能估计,用于参数调优,并减少小数据集或噪声带来的随机性影响。通过汇总多轮验证结果,得到模型的整体性能估计。
65 7
|
2月前
|
机器学习/深度学习 存储 算法
五、分类模型及超参数调优
五、分类模型及超参数调优
21 0
|
6月前
|
机器学习/深度学习 算法
GBDT算法超参数评估(一)
GBDT(Gradient Boosting Decision Tree)是一种强大的机器学习技术,用于分类和回归任务。超参数调整对于发挥GBDT性能至关重要。其中,`n_estimators`是一个关键参数,它决定了模型中弱学习器(通常是决策树)的数量。增加`n_estimators`可以提高模型的复杂度,提升预测精度,但也可能导致过拟合,并增加训练时间和资源需求。
|
6月前
|
机器学习/深度学习 算法
GBDT算法超参数评估(二)
GBDT算法超参数评估关注决策树的不纯度指标,如基尼系数和信息熵,两者衡量数据纯度,影响树的生长。默认使用基尼系数,计算快速,而信息熵更敏感但计算慢。GBDT的弱评估器默认最大深度为3,限制了过拟合,不同于随机森林。由于Boosting的内在机制,过拟合控制更多依赖数据和参数如`max_features`。相比Bagging,Boosting通常不易过拟合。评估模型常用`cross_validate`和`KFold`交叉验证。
|
5月前
|
机器学习/深度学习 Serverless Python
`sklearn.metrics`是scikit-learn库中用于评估机器学习模型性能的模块。它提供了多种评估指标,如准确率、精确率、召回率、F1分数、混淆矩阵等。这些指标可以帮助我们了解模型的性能,以便进行模型选择和调优。
`sklearn.metrics`是scikit-learn库中用于评估机器学习模型性能的模块。它提供了多种评估指标,如准确率、精确率、召回率、F1分数、混淆矩阵等。这些指标可以帮助我们了解模型的性能,以便进行模型选择和调优。
|
6月前
|
算法 计算机视觉
【YOLOv8训练结果评估】YOLOv8如何使用训练好的模型对验证集进行评估及评估参数详解
【YOLOv8训练结果评估】YOLOv8如何使用训练好的模型对验证集进行评估及评估参数详解
|
7月前
|
机器学习/深度学习 监控 数据可视化
模型评估
“【5月更文挑战第27天】”
53 2
|
7月前
|
机器学习/深度学习 人工智能
【机器学习】有哪些指标,可以检查回归模型是否良好地拟合了数据?
【5月更文挑战第16天】【机器学习】有哪些指标,可以检查回归模型是否良好地拟合了数据?
|
7月前
|
机器学习/深度学习 算法 数据挖掘
如何评估模型性能以进行模型选择?
【5月更文挑战第4天】如何评估模型性能以进行模型选择?
139 5
|
7月前
|
机器学习/深度学习 算法
如何评估使用PyBrain训练的模型性能
使用PyBrain训练模型的性能评估包括:混淆矩阵(TP, TN, FP, FN, 准确率)、性能度量(准确率, 错误率)、泛化能力、数据集划分(训练集与测试集误差)以及其他指标如计算速度和鲁棒性。评估过程需综合考虑多种方法,并依据业务需求和模型类型选择合适的方式。
40 3