楼主: CDA网校
2613 9

百闻不如一练:随机森林等可视化调试模型超参数 [推广有奖]

管理员

大师

74%

还不是VIP/贵宾

-

威望
3
论坛币
54618 个
通用积分
3477.6872
学术水平
260 点
热心指数
268 点
信用等级
235 点
经验
201827 点
帖子
5540
精华
19
在线时间
3846 小时
注册时间
2019-9-13
最后登录
2024-9-9

初级热心勋章

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

CDA人工智能学院:数据科学、人工智能从业者的在线学院。


数据科学(Python/R/Julia)数据分析、机器学习、深度学习

以下使用scikit-learn中数据集进行分享。


如果精选随机森林作为最终的模型,那么发现它的最佳参数可能有1000种多种组合的可能,你可以使用使用穷尽的网格搜索(Exhaustive Grid Seaarch)方法,但时间成本将会非常高(运行很久...),或者使用随机搜索(随机搜索)方法,仅分析超参数集合中的子集合。


该示例以手写数据集为例,使用支持向量机的方法对数据进行建模,然后调用scikit-learn中validation_surve方法将模型交叉验证的结果进行可视化。需要注意的是,在使用validation_curve方法时,只能验证一个超参数与模型训练集和验证集的关系(即二维的可视化),而不能实现多参数与重叠间关系的可视化。以下搜索的参数是gamma,需要给定参数范围,用param_range进行传递,评分策略用评分参数进行传递。其代码示例如下所示:

  1. print(__doc__)

  2. import matplotlib.pyplot as plt
  3. imoprt numpy as np

  4. from sklearn.datasets import load_digits
  5. from sklearn.svm import SVC
  6. from sklearn.model_selection import validation_curve

  7. X,y = load_digits(return_X_y = True)

  8. param_range = np.logspace(-6,-1、5)
  9. train_scores,test_scores = validation_curve(
  10.     SVC(),X,y,param_name =“ gamma”,param_range = param_range,
  11.     scoring =“ accuracy”,n_jobs = 1)
  12. train_scores_mean = np.mean(train_scores,axis = 1)
  13. train_scores_std = np.std(train_scores,axis = 1)
  14. test_scores_mean = np.mean(test_scores,axis = 1)
  15. test_scores_std = np.std(test_scores,axis = 1)

  16. plt.title(“带有SVM的验证曲线”)
  17. plt.xlabel(r“ $ \ gamma $”)
  18. plt.ylabel(“得分”)
  19. plt.ylim(0.0,1.1)
  20. lw = 2
  21. plt.semilogx(param_range,train_scores_mean,label =“ Training score”,
  22.              color =“ darkorange”,lw = lw)
  23. plt.fill_between(param_range,train_scores_mean-train_scores_std,
  24.                  train_scores_mean + train_scores_std,alpha = 0.2,
  25.                  color =“ darkorange”,lw = lw)
  26. plt.semilogx(param_range,test_scores_mean,label =“交叉验证得分”,
  27.              color =“ navy”,lw = lw)
  28. plt.fill_between(param_range,test_scores_mean-test_scores_std,
  29.                  test_scores_mean + test_scores_std,alpha = 0.2,
  30.                  color =“ navy”,lw = lw)
  31. plt.legend(loc =“ best”)
  32. plt.show();
复制代码

代码中:

  1. X, y = load_digits(return_X_y=True)

  2. # 等价于

  3. digits = load_digits()
  4. X_digits = digits.data
  5. y_digits = digits.target  
复制代码

以下是支持向量机的验证曲线,调节的超参数gamma共有5个值,每一个点的分数是五折交叉验证(cv = 5)的均值。


当想看模型多个超参数与模型评分之间的关​​系时,使用scikit-learn中验证曲线就难以实现,因此可以考虑重定向三维坐标图。


主要用plotly的库放置3D Scatter(3d 散点图)。下面的示例使用scikit-learn中的莺尾花的数据集(iris)。以下示例随机森林模型(RandomForestRegressor),利用scikit-learn中的GridSearchCV方法调试最佳超参(调整超参数),分别设置超参数“ n_estimators”,“ max_features”,“ min_samples_split”的参数范围,详见代码如下:

  1. import numpy as np
  2. from sklearn.model_selection import validation_curve
  3. from sklearn.datasets import load_iris
  4. from sklearn.ensemble import RandomForestRegressor   
  5. from plotly.offline import iplot   
  6. from plotly.graph_objs as go

  7. model = RandomForestRegressor(n_jobs=-1, random_state=2, verbose=2)

  8. grid = {'n_estimators': [10,110,200],
  9.         'max_features': [0.05, 0.07, 0.09, 0.11, 0.13],
  10.         'min_samples_split': [2, 3, 5, 8]}

  11. rf_gridsearch = GridSearchCV(estimator=model, param_grid=grid, n_jobs=4, cv=5, verbose=2, return_train_score=True)

  12. rf_gridsearch.fit(X, y)

  13. # and after some hours...
  14. df_gridsearch = pd.DataFrame(rf_gridsearch.cv_results_)   

  15. trace = go.Scatter3d(
  16.     x=df_gridsearch['param_max_features'],
  17.     y=df_gridsearch['param_n_estimators'],
  18.     z=df_gridsearch['param_min_samples_split'],
  19.     mode='markers',
  20.     marker=dict(
  21.         # size=df_gridsearch.mean_fit_time ** (1 / 3),
  22.         size = 10,
  23.         color=df_gridsearch.mean_test_score,
  24.         opacity=0.99,
  25.         colorscale='Viridis',
  26.         colorbar=dict(title = 'Test score'),
  27.         line=dict(color='rgb(140, 140, 170)'),
  28.     ),
  29.     text=df_gridsearch.Text,
  30.     hoverinfo='text'
  31. )

  32. data = [trace]
  33. layout = go.Layout(
  34.     title='3D visualization of the grid search results',
  35.     margin=dict(
  36.         l=30,
  37.         r=30,
  38.         b=30,
  39.         t=30
  40.     ),

  41.     scene = dict(
  42.         xaxis = dict(
  43.             title='max_features',
  44.             nticks=10
  45.         ),
  46.         yaxis = dict(
  47.             title='n_estimators',
  48.         ),
  49.         zaxis = dict(
  50.             title='min_samples_split',

  51.         ),
  52.     ),

  53. )

  54. fig = go.Figure(data=data, layout=layout)
  55. iplot(fig)  
复制代码

其运行结果如果,是一个三维散点图(3D Scatter)。


n_estimators(子估计器)越多,分数升高,max_features的变化对模型分数的影响较小,在图中看不到变化,min_samples_split的个数并非越过高越好,但与模型分数并不呈现单调关系,在min_samples_split取2时(此时,其他条件不变),模型分数最高。

除了使用scikit-learn中验证曲线以外,还可以利用seabornlib中的热图方法来实现两个超参数之间的关系图,如下示例:

  1. import seaborn as sns

  2. title = '''Maximum R2 score on test set VS
  3. max_features, min_samples_split'''  
  4. sns.heatmap(max_scores.mean_test_score, annot=True, fmt='.4g');
  5. plt.title(title);
  6. plt.savefig("heatmap_test.png", dpi = 300);  

  7. import seaborn as sns

  8. title = '''Maximum R2 score on train set VS
  9. max_features, min_samples_split'''
  10. sns.heatmap(max_scores.mean_train_score, annot=True, fmt='.4g');
  11. plt.title(title);
  12. plt.savefig("heatmap_train.png", dpi = 300);
复制代码

max_features和min_samples与模型隐藏关系的可视化如下图所示(分别为网格搜索中测试集和训练集的重叠):



由于一般人很难迅速的在大量数据中找到隐藏的关系,因此,可以考虑绘图,将数据关系以图表的形式,清晰的显示出来。

综上,当关注局部超参数的学习曲线时,可以使用scikit-learn中验证曲线,找到拐点,作为模型的最佳参数。

当关注两个超参数的共同变化对模型分数的影响时,可以使用seaborn库中的热图方法,制作“热图”,以发现超参数协同变化对分数影响的趋势。

当关注三个参数的协同变化与模型重叠的关系时,可以使用poltly库中的iplot和go方法,转换3d 散点图(3D Scatter),将其协同变化对模型分数的影响展现在高维图中。

回复“资讯”,获取更多最新人工智能前沿动态!


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:随机森林 可视化 超参数 scikit-learn randomForest

已有 2 人评分经验 收起 理由
remlus + 100 精彩帖子
wwqqer + 100 精彩帖子

总评分: 经验 + 200   查看全部评分

沙发
CDA网校 学生认证  发表于 2020-6-11 19:28:37 |只看作者 |坛友微信交流群

使用道具

藤椅
CDA网校 学生认证  发表于 2020-6-11 19:28:48 |只看作者 |坛友微信交流群

使用道具

板凳
CDA网校 学生认证  发表于 2020-6-11 19:29:04 |只看作者 |坛友微信交流群

使用道具

报纸
三重虫 发表于 2020-6-12 13:04:11 |只看作者 |坛友微信交流群

使用道具

地板
myazure 发表于 2020-6-13 16:47:45 |只看作者 |坛友微信交流群

使用道具

7
remlus 发表于 2020-6-13 17:29:25 |只看作者 |坛友微信交流群
看起来很不错的样子。

使用道具

8
redflame 发表于 2020-6-14 00:10:24 |只看作者 |坛友微信交流群
不错不错!

使用道具

9
学术旷野新人 在职认证  发表于 2020-6-14 18:09:17 |只看作者 |坛友微信交流群
不错不错

使用道具

10
三江鸿 发表于 2022-10-29 18:33:54 来自手机 |只看作者 |坛友微信交流群
点个赞加点人气
感谢分享

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加JingGuanBbs
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-9-10 04:03