如何建免费的企业网站,dnf做汉堡怎么玩间网站,白云微网站建设,制作一个网站平台需要多少钱浙大疏锦行
贝叶斯优化可视化和随机森林的解读
一、元组类型
为了学习今天的内容#xff0c;我们学习一下最后一个没提的基本数据类型#xff0c;元组#xff08;tuple#xff09;具有以下特点#xff1a;
有序#xff1a;可以通过索引取出来元素不可变#xff0c;不…浙大疏锦行贝叶斯优化可视化和随机森林的解读一、元组类型为了学习今天的内容我们学习一下最后一个没提的基本数据类型元组tuple具有以下特点有序可以通过索引取出来元素不可变不可修改可迭代、可切片 所以元组适合存储不应被程序意外修改的数据例如配置常量、数据库记录的字段等。函数返回多个值时默认就是以元组的形式返回的。由于元组是不可变的它可以作为字典的键List 不可以。你也会发现元组和字符串性质一样啊那为什么需要2个数据结构来表达这两个类型么是因为它们之间的根本区别在于它们内部存储的元素类型元组可以存储任意不同类型的数据对象异构。例如整数、浮点数、列表、函数等。----异构容器类似于表格存储字符串只能存储字符本质上是文本数据都是字符类型。---同构序列文件名存储不可变意味着他不具备增删改的步骤增加就是创建新元组了先看下创建元组的方法修改元组的方法二、字典的items方法字典的items方法这个方法很重要在后面深度学习的代码中自由度很高我们会频繁接触到这个方法我们来介绍下items() 方法是 Python 中 字典 (Dictionary) 对象的一个非常常用的方法。它返回一个由字典中所有 (键, 值) 对 组成的视图对象View Object。这个视图对象可以用于迭代字典中的所有键值对。本质这也是python的解包操作的一种我们后续会有专题重点讲解下解包操作。什么叫视图对象具有视图特性返回的对象是动态的。如果原始字典在您获取 items() 视图后发生了变化例如添加或删除了键值对视图对象也会实时反映这些变化。这和我们前几天说的enumerate方法非常像他可以遍历任何可迭代对象返回索引元素在python历史中字典是无序的Python 3.7 及更高版本字典正式成为有序的。这意味着字典会记住键的插入顺序并且在遍历时包括使用 enumerate() 时会严格按照这个顺序进行。这也意味着以后常见数据结构只能遇到集合是无序的了。实际上下面这items和enumerate联合的写法非常常见三、贝叶斯优化可视化1. 数据准备2. 基础贝叶斯优化首先安装必要的库如果还未安装我们今天选择贝叶斯优化库他的自由度大很多。from bayes_opt import BayesianOptimization from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import cross_val_score from sklearn.metrics import classification_report, confusion_matrix import time # 定义目标函数 def rf_eval(n_estimators, max_depth, min_samples_split, min_samples_leaf, max_features): 目标函数评估随机森林在给定参数下的性能 BayesianOptimization 会最大化这个函数的返回值 参数说明 - n_estimators: 树的数量越多越好但会增加计算时间 - max_depth: 树的最大深度太浅欠拟合太深过拟合 - min_samples_split: 分裂所需最小样本数控制树的生长 - min_samples_leaf: 叶节点最小样本数防止过拟合 - max_features: 特征采样比例增加随机性防止过拟合 # 将连续参数转换为整数 n_estimators int(n_estimators) max_depth int(max_depth) min_samples_split int(min_samples_split) min_samples_leaf int(min_samples_leaf) # max_features 保持浮点数 # 创建模型 model RandomForestClassifier( n_estimatorsn_estimators, max_depthmax_depth, min_samples_splitmin_samples_split, min_samples_leafmin_samples_leaf, max_featuresmax_features, random_state42, n_jobs-1 ) # 5折交叉验证 scores cross_val_score(model, X_train, y_train, cv5, scoringaccuracy) return np.mean(scores) # 定义参数搜索空间扩大10倍超大搜索空间 pbounds { n_estimators: (10, 3000), # 从10到3000棵树 max_depth: (3, 500), # 从3到500 min_samples_split: (2, 200), # 从2到200 min_samples_leaf: (1, 100), # 从1到100 max_features: (0.1, 1.0) # 从10%到100% } for param, (low, high) in pbounds.items(): # items方法返回字典的键值对 range_size high - low print(f {param:20s}: [{low:7.1f}, {high:7.1f}] (范围: {range_size:7.1f}))3. 详细输出与迭代过程# 创建贝叶斯优化器优化的过程已经被这个对象封装了 optimizer BayesianOptimization( frf_eval, # 目标函数 pboundspbounds, # 参数搜索空间 random_state42, verbose2 # 2: 详细信息, 1: 简要信息, 0: 不显示 ) start_time time.time() # 开始优化大幅增加迭代次数以充分探索超大空间 optimizer.maximize( init_points20, # 初始随机探索点数增加到20以覆盖超大空间 n_iter80 # 贝叶斯优化迭代次数增加到80 ) end_time time.time() print(f优化完成总耗时: {end_time - start_time:.2f} 秒.center(80))4. 可视化优化过程提取所有迭代的结果 iterations [] scores [] for i, res in enumerate(optimizer.res): # res包含每次迭代的结果index从0开始 iterations.append(i 1) # 迭代次数从1开始 scores.append(res[target]) # 提取得分 # 计算累计最优值 best_scores [] current_best -np.inf # 初始化为负无穷大 for score in scores: if score current_best: # 检查当前得分是否打破历史记录 current_best score best_scores.append(current_best) # 绘制优化轨迹 fig, (ax1, ax2) plt.subplots(1, 2, figsize(16, 5)) # 创建1行2列的子图 # 左图每次迭代的得分 ax1.plot(iterations, scores, o-, label每次迭代得分, alpha0.7, markersize6) ax1.plot(iterations, best_scores, r--, label累计最优得分, linewidth2) ax1.axhline(yoptimizer.max[target], colorgreen, linestyle:, labelf最终最优: {optimizer.max[target]:.4f}) # axhline绘制水平线 ax1.set_xlabel(迭代次数, fontsize12) ax1.set_ylabel(准确率, fontsize12) ax1.set_title(贝叶斯优化收敛曲线 (超大空间100次迭代), fontsize14, fontweightbold) ax1.legend() ax1.grid(True, alpha0.3) # 右图初始探索 vs 贝叶斯优化 init_points 20 # 更新为20 ax2.plot(iterations[:init_points], scores[:init_points], bo-, labelf随机探索 (前{init_points}次), markersize8, alpha0.7) ax2.plot(iterations[init_points:], scores[init_points:], go-, labelf贝叶斯优化 (后{len(iterations)-init_points}次), markersize8, alpha0.7) ax2.axvline(xinit_points, colorred, linestyle--, alpha0.5, label探索→利用) # axvline绘制垂直线 ax2.set_xlabel(迭代次数, fontsize12) ax2.set_ylabel(准确率, fontsize12) ax2.set_title(探索阶段 vs 利用阶段, fontsize14, fontweightbold) ax2.legend() ax2.grid(True, alpha0.3) plt.tight_layout() plt.show()# 输出统计信息 print(f 总迭代次数: {len(scores)}) print(f 最低得分: {min(scores):.4f}) print(f 最高得分: {max(scores):.4f}) print(f 平均得分: {np.mean(scores):.4f}) print(f 得分标准差: {np.std(scores):.4f}) print(f 得分提升: {max(scores) - scores[0]:.4f})