美文网首页
2021-03-24掌握回归模型的评估及超参数调优

2021-03-24掌握回归模型的评估及超参数调优

作者: Cherryone | 来源:发表于2021-03-25 00:00 被阅读0次

1.参数与超参数

参数:使用最小二乘法或者梯度下降法等最优化算法优化出来的数,

超参数:无法使用最小二乘法或者梯度下降法等最优化算法优化出来的数。

模型参数是模型内部的配置变量,其值可以根据数据进行估计。它有如下特征:

.参数通常不由编程者手动设置。

.参数通常被保存为学习模型的一部分。

.参数是机器学习算法的关键,它们通常由过去的训练数据中总结得出

模型超参数是模型外部的配置,其值无法从数据中估计。通常:

.超参数通常用于帮助估计模型参数。

.超参数通常由人工指定。

.超参数通常可以使用启发式设置。

.超参数经常被调整为给定的预测建模问题。

2. 网格搜索与随机搜索

网格搜索使用sklearn.model_selection.GridSearchCV:

把所有的超参数选择列出来分别做排列组合, 然后针对每组超参数分别建立一个模型,然后选择测试误差最小的那组超参数。换句话说,我们需要从超参数空间中寻找最优的超参数,很像一个网格中找到一个最优的节点,因此叫网格搜索。

随机搜索使用sklearn.model_selection.RandomizedSearchCV:

随机搜索法结果比稀疏化网格法稍好(有时候也会极差,需要权衡)。参数的随机搜索中的每个参数都是从可能的参数值的分布中采样的。与网格搜索相比,这有两个主要优点:

.可以独立于参数数量和可能的值来选择计算成本。

.添加不影响性能的参数不会降低效率。

3.实例

# 我们先来对未调参的SVR进行评价:

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)))

# 下面我们使用网格搜索来对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_)

# 下面我们使用随机搜索来对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_)

相关文章

网友评论

      本文标题:2021-03-24掌握回归模型的评估及超参数调优

      本文链接:https://www.haomeiwen.com/subject/ylikhltx.html