200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > 加载svr模型_机器学习XGBoost实战 网格搜索自动调参 对比随机森林 线性回归 SVR【

加载svr模型_机器学习XGBoost实战 网格搜索自动调参 对比随机森林 线性回归 SVR【

时间:2022-06-29 22:04:59

相关推荐

加载svr模型_机器学习XGBoost实战 网格搜索自动调参 对比随机森林 线性回归 SVR【

建议:阅读.8.7的文章,完全了解GDBT和XGBT的原理。

机器学习- XGBoost,GDBT【过程:决策树,集成学习,随机森林,GDBT,XGBT,LightGBM】

本次实践内容:

实验结果对比:

见证了XGBT的 优越性 以及 网格搜索的优越性

① 随机初始化参数的XGBT &网格搜索寻找到比较好参数取值的XGBT:

寻找到XGBT中最好的树,将其参数设置为XGBT的参数:

②设好参数的XGBT,线性回归,随机森林,SVR,设好参的随机森林:

看Mean值,Mean为RMSE的均值,越小越好

下面为代码部分:

导包

import pandas as pdimport xgboost as xgbimport numpy as npfrom sklearn.metrics import mean_squared_errorfrom sklearn.model_selection import train_test_splitimport matplotlib.pyplot as plt

加载数据集【数据集和代码在一个文件夹内,直接使用即可】:

def loading_boston_housing_data(csv_path,x): return pd.read_csv(csv_path,header = x) path = "boston_house_prices.csv"boston = loading_boston_housing_data(path,1)

拆分y,即label预测值

# 拆分特征和标签y = boston.pop('MEDV')

转换格式—— dmatrix,该格式在xgboost中运行速度更快!

data_matrix = xgb.DMatrix(boston,y)

XGBT建模

# 随机选取默认参数进行初始化建模xg_reg = xgb.XGBRegressor( objective='reg:linear',# 这是一个回归预测房价问题 colsample_bytree= 0.3 , # 每次用多少特征,可以控制过拟合learning_rate=0.1,# 学习率,之前解释过了,给后面添加的树就有学习的空间 max_depth=5, # 树的最大深度 5 n_estimators=10, # 构建10棵树 alpha = 10 # L1正则化)xg_reg.fit(x_train,y_train)pred = xg_reg.predict(x_test)mean_squared_error(pred,y_test)

XGBoost--参数分析

xgboost的params参数

(参数很多 ,但实际用到的不多)

1)不需要调优的参数

booster【默认:gbtree】:

作用:决定基分类器的类型

可选:gbtree:树

gblinear:线性

objective

作用:定义需要被最小化的损失函数

可选:

reg:linear:线性回归

reg:logistic:逻辑回归

binary:logistic :二分类的逻辑回归,返回的是概率(非类别)

multi:softmax :使用softmax的多分类器,返回的是类别(非概率),同时你需要多设置一个参数:num_class(类别数目)

multi:softprob:和multi.softmax参数一样,但是返回的是每个实例属于各个类别的概率。

③silent【默认:0】:

设为1(不打印执行信息)

设为0(打印信息)

④nthread:控制线程线程数目

(需要用cv搜索调整的标注为红色)

2)可以优化的参数

max_depth【默认6】:

作用:决定树的最大深度,用来避免过拟合的,max_depth越大,模型会学到更具体的样本,深度越深越容易过拟合

常用值:3~10

n_estimators:

作用:决定树的数量

即使BT算法中有较多的 决定树时仍能保持稳健,但是树的数量多了还是可能发生过拟合

eta/learning_rate【默认0.3】:

作用:决定每一个决定树对于最终结果的影响,控制着更新权重的更新幅度。较小的eta使得模型对不同的树更加稳健。(等同于GDBT中的学习率)

范围:0~1

常用值:0.01~0.2

subsample【默认1】:

作用:每次迭代用多少数据集,控制每棵树,随机采样的比例

减小subsample,算法用的数据集越少,可以避免过拟合,但如果设置太小,数据用的少了就会欠拟合

常用值:0.5~1

min_child_weight【默认1】:

作用:决定最小叶子节点样本权重和,用于避免过拟合。

值较大时候可以避免学习到局部的特殊样本,过大时候会导致欠拟合,较小容易过拟合

(类似于GDBT中的min_chilf_leaf,不过GDBT中是最小样本总数)!

colsample_bytree【默认1】:

作用:用来每次每棵树用多少个特征即随机采样的列数占比(一列是一个特征)。可以控制过拟合。

常用值:0.5~1

gamma【默认0】:

作用:在节点分裂时,只有分裂后损失函数值下降了,才会分裂这个节点,那下降多少才会分裂呢?有gamma决定,当损失函数值下降到≥gamma值,ok,分裂节点

该值越大,算法越保守。

如果设置gamma为0,表示只要损失函数减少节点就分裂

⑧alpha【默认0】:

作用:控制权重的L1正则化项参数

设置的越大,模型越不容易过拟合。

⑨lambda【默认1】

作用:控制权重的L2正则化项参数

设置的越大,模型越不容易过拟合。

可以画出树模型 :

可以查看特征的重要程度:

xg_reg = xgb.train(params=params, dtrain=data_matrix, num_boost_round=10)import matplotlib.pyplot as plt# graphviz配置指导:/c_daofeng/article/details/81077594# 第一次配置完成之后,因为环境需要重启,可能会报错,下面两行是手动设置环境变量Pathimport osos.environ["PATH"] += os.pathsep + 'D:/graphviz/bin'xgb.plot_tree(xg_reg,num_trees=0)plt.rcParams['figure.figsize'] = [100,80]plt.show()

# 打印特征权重# 如果特征权重中有一个特别重要,说明有过拟合的风险或者穿越现象。# 可以通过去掉该特征来验证模型效果xgb.plot_importance(xg_reg)plt.rcParams['figure.figsize'] = [3, 3]plt.show()

网格搜索:

步骤:

设置一些初始值,构建baseline模型(baseline:就是一个最简单的拿来对比性能的模型)回归到机器学习的流程中,我们强调了,无论你建立了几个成熟的模型,如random forest,gdbt等。这些被称作benchmark【其他标准模型】,如果你使用一些baseline【非模型的方法/或者选择一个很差的模型】如使用平均值或中位数来得到预测结果,就可以用来比较你的模型性能。

保持learning rate和其他booster相关的参数不变,调节estimators(树的棵树)的参数

调节booster相关的参数。其中影响最大的max_depth(深度) 和min_child_weight(树的最小权重)开始。逐步调节所有可能有影响的booster参数

缩小learning rate,得到最佳的learning rate值

得到一组效果还不错的参数组合(初次之外,你还可以调整gamma等所有文中标红的参数!)

(按照步骤走,后面还有几次网格搜索,代码见原文链接)

# 按照步骤2:调节一下estimators,将树的棵树进行网格搜索,from sklearn.model_selection import GridSearchCV# 此处你可以设置为 'n_estimators':[1,2,3,...]的你想测的值,#当然也可以像我一样直接用 range设置步长 生成列表cv_params = {'n_estimators': range(0,200,10)}# 按照步骤1:建了一个随机初始化的baseLine模型(同前)params = {'learning_rate': 0.05, 'n_estimators': 500, 'max_depth': 5, 'min_child_weight': 1, 'seed': 0,'subsample': 0.8, 'colsample_bytree': 0.8, 'gamma': 0, 'reg_alpha': 10, 'reg_lambda': 1}# 此处用两个*:**params,原因:传入的是字典叫:关键字参数# 就一个* :*params 的情况:如果函数接收的是元组叫做 :其余的位置参数,model = xgb.XGBRegressor(**params)optimized_GBM = GridSearchCV(estimator=model, param_grid=cv_params, scoring='r2', cv=5, verbose=1, n_jobs=-1)optimized_GBM.fit(x_train, y_train)# 输出最好搭配print("Best: %f using %s" % (optimized_GBM.best_score_,optimized_GBM.best_params_))print("--------------------------------------------")means = optimized_GBM.cv_results_['mean_test_score']params = optimized_GBM.cv_results_['params']for mean,param in zip(means,params): print("%f with: %r" % (mean,param))

自动调参神器之一 :

GridSearchCV网格搜索

(ps:只适用于小数据集,贪心算法太过贪心,走遍所有找到最佳)

这是一种贪心算法,被发明的意义就在于不要你自己手动调参,把参数输进去就能依据你选择的评价标准,来找到你所给参数可选范围内的最佳参数和优化结果

CV网格搜索--参数分析

导入:

from sklearn.model_selection import GridSearchCV

参数:

estimator:选择使用的分类器

param_grid:需要优化的参数的取值,值为字典:

如 cv_params = {'n_estimators': list(range(100))},

设置时:param_grid=cv_params

scoring【默认None】:用来评价模型的标准。

此时你是去调节参数来找到比较好的参数,因此需要使用score函数,根据所选模型选择不同的score函数

分类问题中常用的:precision,recall,f1

回归问题中常用:neg_mean_squared_error,r2

cv【默认3】:交叉验证的fold数量,默认为3,可自行设定

verbose:日志冗长度

0:不输出训练过程,

1:偶尔输出,

>1:对每一个子模型都输出

n_jobs并行数

当设置为-1时候表示cpu所有的core进行工作(可查看cpu占用率)

可以查看的:

grid_scores_

给出不同参数情况下的评价结果。

best_params_

描述了已取得最佳结果的参数的组合

best_score_

成员提供优化过程期间观察到的最好的评分

具有键作为列标题和值作为列的dict,可以导入到DataFrame中。

注意,“params”键用于存储所有参数候选项的参数设置列表。

寻找最好的树的参数——xgb.cv

good_params = {'learning_rate': 0.15, 'n_estimators': 190, 'max_depth': 4, 'min_child_weight': 2, 'seed': 0,'subsample': 0.8, 'colsample_bytree': 0.8, 'gamma': 0, 'reg_alpha': 0, 'reg_lambda': 1}good_cv_results = xgb.cv(dtrain=data_matrix, params=good_params, nfold=3,num_boost_round=50,early_stopping_rounds=10,metrics="rmse", as_pandas=True, seed=123)good_cv_results.head()# 将model的参数设置为该最好的参数model.set_params(n_estimators=good_cv_results.shape[0])model.fit(x_train, y_train, eval_metric='rmse')xgd_pred = model.predict(x_test)xgd_pred = xgd_pred.reshape(len(xgd_pred),1)from sklearn.model_selection import cross_val_scorexgb_scores = cross_val_score(model,xgd_pred,y_test,scoring='neg_mean_squared_error',cv=3)# xgb_rmse_scores = np.sqrt(-xgb_scores)# print(xgb_rmse_scores)print('XGboost:')display_scores(xgb_scores)

得到结果:

xgb.cv(交叉验证,找最好的树)-参数分析

寻找完参数后,我们通过XGBT所带的cv来找到最好的树!找到之后,我们可以得到该树的参数来设置我们的xgboost模型,然后进行预测得到好处。

xgb.cv中的参数分析:

①dtrain:

训练时用的数据

②params:

网格搜索之后获得的最佳参数组合,是一个字典。

③nfold:

交叉验证折数

④num_boost_round:

迭代次数,相当于树的数量,也就是生成多少基分类器

⑤early_stopping_rounds:

早期停止次数,假设为100,验证机误差迭代到一定程度在100之内不能再继续降低,就停止迭代

⑥metrics:评价指标

⑦as_pandas:

请设置为True,表格展示,若设置为False,报错。

⑧seed:随机数种子

其余几种模型的对比(可以理解作为baseline):

【此处只讲随机森林和随机森林的网格搜索,其余见原文代码】

# 随机森林from sklearn.ensemble import RandomForestRegressorfore_reg = RandomForestRegressor()fore_reg.fit(x_train,y_train)fore_pred = fore_reg.predict(x_test)fore_pred = fore_pred.reshape(len(fore_pred),1)fore_scores = cross_val_score(fore_reg,fore_pred,y_test,scoring='neg_mean_squared_error',cv=3)print('随机森林:')display_scores(fore_scores)

随机森林的网格搜索:

# Ok 我们看到上面的mean值对比# 这里面的参数都是采用的默认值,我们选取这里面表现好一点的随机森林# 我们对随机森林也进行网格搜索!param_grid =[{'n_estimators':range(1,50,5),'max_features':range(1,10,2)}, {'bootstrap':[False],'n_estimators':range(1,50,5),'max_features':range(1,10,2)}]forest_reg = RandomForestRegressor()forest_gird_search = GridSearchCV(forest_reg,param_grid,scoring = 'neg_mean_squared_error',cv=3)forest_gird_search.fit(x_train,y_train)# 查看最好参数forest_gird_search.best_params_# 依照最好参数构建新的随机森林模型best_fore_reg = RandomForestRegressor(bootstrap=False,max_features=.5,n_estimators=36)best_fore_reg.fit(x_train,y_train)best_fore_pred = best_fore_reg.predict(x_test)best_fore_pred = best_fore_pred.reshape(len(best_fore_pred),1)best_fore_scores = cross_val_score(best_fore_reg,best_fore_pred,y_test,scoring='neg_mean_squared_error',cv=3)print('网格搜索后的随机森林:')display_scores(best_fore_scores)

Random forest-参数分析

主要也就是调节一下几个参数 :

n_enstimators森林里树的个数

max_features【默认auto】

每一棵决策树的随机选择的特征数目

有三种选择:

1)“auto/None ”:选择所有特征

2)“sqrt/log2”:使用总特征数的平方根个

3).x:如.2表示选择特征总数的20%

max_depth树的最深深度

bootstrap【默认True】:抽取样本时候是否有放回,若为True,即为又放回的抽取,False:无放回的抽取。

通过开始时候展示的结果对比,就知道XGBoost的强大性。

至此,XGBoost的原理和实践完成,就掌握除了基本算法之外的一个机器学习很好用的算法,原理和实践缺一不可,不了解原理就无法调参,无法知道整个过程。因此推荐先了解原理

谢谢阅读,完整代码附上!

(提取码:cvzi)

存到jupyter默认路径即可运行

加载svr模型_机器学习XGBoost实战 网格搜索自动调参 对比随机森林 线性回归 SVR【完整代码(含注释)+数据集见原文链接】...

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。