机器学习与深度学习day11番外篇——数据结构{元组、字典方法}与贝叶斯可视化——可放在复习日day15看
前言:
python数据结构这一块儿,我们已经在另一个专栏介绍过了,为了照顾不会的同学再提一次。
其中有很多之前提过的重复部分,大家可以放在闲的时间里看看这节,因为我敲了这节的代码,所以先发出来了。
DAY12 数据结构{元组、字典方法}与贝叶斯可视化
一、元组类型
为了学习今天的内容,我们学习一下最后一个没提的基本数据类型,元组(tuple)具有以下特点:
- 有序:可以通过索引取出来元素
- 不可变,不可修改
- 可迭代、可切片 所以元组适合存储不应被程序意外修改的数据(例如配置常量、数据库记录的字段等)。函数返回多个值时,默认就是以元组的形式返回的。由于元组是不可变的,它可以作为字典的键(List 不可以)。
你也会发现元组和字符串性质一样啊,那为什么需要2个数据结构来表达这两个类型么,是因为它们之间的根本区别在于它们内部存储的元素类型
- 元组可以存储任意不同类型的数据对象(异构)。例如:整数、浮点数、列表、函数等。----异构容器,类似于表格存储
- 字符串只能存储字符(本质上是文本数据,都是字符类型)。---同构序列,文件名存储
不可变意味着他不具备增删改的步骤,增加就是创建新元组了
先看下创建元组的方法
# 创建元祖
# 原始元组:(姓名, 年龄, 成绩)
old_tuple = ("张三", 25, 92.5)
print(f"原始元组: {old_tuple}")
print(f"原始类型: {type(old_tuple)}")
原始元组: ('张三', 25, 92.5)
原始类型: <class 'tuple'>
看下修改元组的方法
# 1. 转换为列表 (List)
temp_list = list(old_tuple)
print(f"\n转换为列表: {temp_list}")
print(f"列表类型: {type(temp_list)}")
# 2. 修改列表中的元素(列表是可变的)
# 索引 1 是年龄
temp_list[1] = 26
print(f"修改后的列表: {temp_list}")
# 3. 转换回元组 (Tuple)
new_tuple = tuple(temp_list)
print(f"\n转换回元组: {new_tuple}")
print(f"最终类型: {type(new_tuple)}")
print(f"原元组 (未变): {old_tuple}") # 原始元组并未被修改
# 验证修改结果
print(f"新元组的年龄: {new_tuple[1]}")
转换为列表: ['张三', 25, 92.5]
列表类型: <class 'list'>
修改后的列表: ['张三', 26, 92.5]
转换回元组: ('张三', 26, 92.5)
最终类型: <class 'tuple'>
原元组 (未变): ('张三', 25, 92.5)
新元组的年龄: 26
二、字典的items方法
字典的items方法,这个方法很重要,在后面深度学习的代码中自由度很高,我们会频繁接触到这个方法,我们来介绍下
items() 方法是 Python 中 字典 (Dictionary) 对象的一个非常常用的方法。它返回一个由字典中所有 (键, 值) 对 组成的视图对象(View Object)。这个视图对象可以用于迭代字典中的所有键值对。本质这也是python的解包操作的一种,我们后续会有专题重点讲解下解包操作。
什么叫视图对象?具有视图特性,返回的对象是动态的。如果原始字典在您获取 items() 视图后发生了变化(例如添加或删除了键值对),视图对象也会实时反映这些变化。
pbounds = {
'n_estimators': (10, 3000),
'max_depth': (3, 500),
'max_features': (0.1, 1.0)
}
for param, (low, high) in pbounds.items():
print(f"参数: {param} , 搜索范围: [{low}, {high}]") # print在输出后自动添加换行符
参数: n_estimators , 搜索范围: [10, 3000] 参数: max_depth , 搜索范围: [3, 500] 参数: max_features , 搜索范围: [0.1, 1.0]
聪明的你肯定注意到了,这和我们前几天说的enumerate方法非常像,他可以遍历任何可迭代对象,返回索引+元素
# --- 1. 列表 (List) ---
print("--- 1. 遍历列表 (List) ---")
my_list = ['苹果', '香蕉', '樱桃', '日期']
# enumerate() 默认从索引 0 开始计数
for index, item in enumerate(my_list):
print(f"索引: {index}, 元素: {item}")
--- 1. 遍历列表 (List) --- 索引: 0, 元素: 苹果 索引: 1, 元素: 香蕉 索引: 2, 元素: 樱桃 索引: 3, 元素: 日期
# --- 2. 字符串 (String) ---
print("--- 2. 遍历字符串 (String) ---")
my_string = "Python"
for index, char in enumerate(my_string):
print(f"索引: {index}, 字符: {char}")
--- 2. 遍历字符串 (String) --- 索引: 0, 字符: P 索引: 1, 字符: y 索引: 2, 字符: t 索引: 3, 字符: h 索引: 4, 字符: o 索引: 5, 字符: n
print("--- 3. 遍历元组 (Tuple) ---")
my_tuple = ('张三', '李四', '王五')
for index, name in enumerate(my_tuple):
print(f"索引: {index}, 姓名: {name}")
--- 3. 遍历元组 (Tuple) --- 索引: 0, 姓名: 张三 索引: 1, 姓名: 李四 索引: 2, 姓名: 王五
print("--- 4. 遍历字典的键 (Keys) ---")
my_dict_simple = {'A': 10, 'B': 20, 'C': 30}
# 默认情况下,直接遍历字典只会得到键
for index, key in enumerate(my_dict_simple):
print(f"索引: {index}, 键: {key}, 对应值: {my_dict_simple[key]}")
--- 4. 遍历字典的键 (Keys) --- 索引: 0, 键: A, 对应值: 10 索引: 1, 键: B, 对应值: 20 索引: 2, 键: C, 对应值: 30
在python历史中,字典是无序的,Python 3.7 及更高版本,字典正式成为有序的。这意味着字典会记住键的插入顺序,并且在遍历时(包括使用 enumerate() 时),会严格按照这个顺序进行。这也意味着以后常见数据结构只能遇到集合是无需的了。
实际上下面这items和enumerate联合的写法非常常见
my_dict_simple = {'A': 10, 'B': 20, 'C': 30}
# 1. my_dict_simple.items() 返回 ('A', 10), ('B', 20) 等 (键, 值) 元组
# 2. enumerate 为这些元组添加索引
# 3. 循环中用 index, (key, value) 进行两次解包
for index, (key, value) in enumerate(my_dict_simple.items()):
# 键和值通过解包直接获得,无需额外查表
print(f"索引: {index}, 键: {key}, 对应值: {value}")
索引: 0, 键: A, 对应值: 10 索引: 1, 键: B, 对应值: 20 索引: 2, 键: C, 对应值: 30
大家记住这个写法,我们未来会有针对解包的专题,解包是非常非常重要的知识点.
三、贝叶斯优化可视化
1. 数据准备
# 导入必要的库
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 读取数据
data = pd.read_csv(r'data.csv')
print(f"数据形状: {data.shape}")
print(f"\n前5行数据:")
data.head()
数据形状: (7500, 18) 前5行数据:
| Id | Home Ownership | Annual Income | Years in current job | Tax Liens | Number of Open Accounts | Years of Credit History | Maximum Open Credit | Number of Credit Problems | Months since last delinquent | Bankruptcies | Purpose | Term | Current Loan Amount | Current Credit Balance | Monthly Debt | Credit Score | Credit Default | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 0 | Own Home | 482087.0 | NaN | 0.0 | 11.0 | 26.3 | 685960.0 | 1.0 | NaN | 1.0 | debt consolidation | Short Term | 99999999.0 | 47386.0 | 7914.0 | 749.0 | 0 |
| 1 | 1 | Own Home | 1025487.0 | 10+ years | 0.0 | 15.0 | 15.3 | 1181730.0 | 0.0 | NaN | 0.0 | debt consolidation | Long Term | 264968.0 | 394972.0 | 18373.0 | 737.0 | 1 |
| 2 | 2 | Home Mortgage | 751412.0 | 8 years | 0.0 | 11.0 | 35.0 | 1182434.0 | 0.0 | NaN | 0.0 | debt consolidation | Short Term | 99999999.0 | 308389.0 | 13651.0 | 742.0 | 0 |
| 3 | 3 | Own Home | 805068.0 | 6 years | 0.0 | 8.0 | 22.5 | 147400.0 | 1.0 | NaN | 1.0 | debt consolidation | Short Term | 121396.0 | 95855.0 | 11338.0 | 694.0 | 0 |
| 4 | 4 | Rent | 776264.0 | 8 years | 0.0 | 13.0 | 13.6 | 385836.0 | 1.0 | NaN | 0.0 | debt consolidation | Short Term | 125840.0 | 93309.0 | 7180.0 | 719.0 | 0 |
# 数据预处理
discrete_features = data.select_dtypes(include=['object']).columns.tolist()
# Home Ownership 标签编码
home_ownership_mapping = {
'Own Home': 1,
'Rent': 2,
'Have Mortgage': 3,
'Home Mortgage': 4
}
data['Home Ownership'] = data['Home Ownership'].map(home_ownership_mapping)
# Years in current job 标签编码
years_in_job_mapping = {
'< 1 year': 1, '1 year': 2, '2 years': 3, '3 years': 4, '4 years': 5,
'5 years': 6, '6 years': 7, '7 years': 8, '8 years': 9, '9 years': 10, '10+ years': 11
}
data['Years in current job'] = data['Years in current job'].map(years_in_job_mapping)
# Purpose 独热编码
data = pd.get_dummies(data, columns=['Purpose'])
data2 = pd.read_csv("E:\\study\\PythonStudy\\python60-days-challenge-master\\data.csv")
list_final = [i for i in data.columns if i not in data2.columns]
for i in list_final:
data[i] = data[i].astype(int)
# Term 0-1 映射
term_mapping = {'Short Term': 0, 'Long Term': 1}
data['Term'] = data['Term'].map(term_mapping)
data.rename(columns={'Term': 'Long Term'}, inplace=True)
# 连续特征用众数补全
continuous_features = data.select_dtypes(include=['int64', 'float64']).columns.tolist()
for feature in continuous_features:
mode_value = data[feature].mode()[0]
data[feature].fillna(mode_value, inplace=True)
print("✅ 数据预处理完成!")
print(f"最终特征数量: {data.shape[1]}")
✅ 数据预处理完成! 最终特征数量: 32
# 划分训练集和测试集
from sklearn.model_selection import train_test_split
X = data.drop(['Credit Default'], axis=1)
y = data['Credit Default']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
print(f"训练集大小: {X_train.shape}")
print(f"测试集大小: {X_test.shape}")
print(f"类别分布:\n{y_train.value_counts()}")
训练集大小: (6000, 31) 测试集大小: (1500, 31) 类别分布: Credit Default 0 4328 1 1672 Name: count, dtype: int64
2. 基础贝叶斯优化
首先安装必要的库(如果还未安装):
# !pip install bayesian-optimization -i https://mirrors.aliyun.com/pypi/simple/
昨天我们介绍了贝叶斯优化的实现形式,sklearn、贝叶斯优化库、optuna都可以。我们今天选择贝叶斯优化库,他的自由度大很多。
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_estimators=n_estimators,
max_depth=max_depth,
min_samples_split=min_samples_split,
min_samples_leaf=min_samples_leaf,
max_features=max_features,
random_state=42,
n_jobs=-1
)
# 5折交叉验证
scores = cross_val_score(model, X_train, y_train, cv=5, scoring='accuracy')
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})")
n_estimators : [ 10.0, 3000.0] (范围: 2990.0) max_depth : [ 3.0, 500.0] (范围: 497.0) min_samples_split : [ 2.0, 200.0] (范围: 198.0) min_samples_leaf : [ 1.0, 100.0] (范围: 99.0) max_features : [ 0.1, 1.0] (范围: 0.9)
3. 详细输出与迭代过程
运行贝叶斯优化,查看每次迭代的详细信息:
# 创建贝叶斯优化器,优化的过程已经被这个对象封装了
optimizer = BayesianOptimization(
f=rf_eval, # 目标函数
pbounds=pbounds, # 参数搜索空间
random_state=42,
verbose=2 # 2: 详细信息, 1: 简要信息, 0: 不显示
)
start_time = time.time()
# 开始优化(大幅增加迭代次数以充分探索超大空间)
optimizer.maximize(
init_points=20, # 初始随机探索点数(增加到20以覆盖超大空间)
n_iter=80 # 贝叶斯优化迭代次数(增加到80)
)
end_time = time.time()
print(f"优化完成!总耗时: {end_time - start_time:.2f} 秒".center(80))
| iter | target | n_esti... | max_depth | min_sa... | min_sa... | max_fe... |
-------------------------------------------------------------------------------------
| [39m1 [39m | [39m0.7745 [39m | [39m1129.8749[39m | [39m475.50501[39m | [39m146.93480[39m | [39m60.267189[39m | [39m0.2404167[39m |
| [35m2 [39m | [35m0.7803333[39m | [35m476.42361[39m | [35m31.867555[39m | [35m173.50287[39m | [35m60.510386[39m | [35m0.7372653[39m |
| [39m3 [39m | [39m0.7778333[39m | [39m71.547637[39m | [39m485.04519[39m | [39m166.82364[39m | [39m22.021571[39m | [39m0.2636424[39m |
| [35m4 [39m | [35m0.7818333[39m | [35m558.37948[39m | [35m154.20839[39m | [35m105.90177[39m | [35m43.762556[39m | [35m0.3621062[39m |
| [35m5 [39m | [35m0.7823333[39m | [35m1839.4401[39m | [35m72.328448[39m | [35m59.844640[39m | [35m37.269822[39m | [35m0.5104629[39m |
| [39m6 [39m | [39m0.7728333[39m | [39m2357.6761[39m | [39m102.23786[39m | [39m103.81841[39m | [39m59.649042[39m | [39m0.1418053[39m |
| [39m7 [39m | [39m0.778 [39m | [39m1826.5591[39m | [39m87.750489[39m | [39m14.880215[39m | [39m94.939668[39m | [39m0.9690688[39m |
| [35m8 [39m | [35m0.7825 [39m | [35m2427.1080[39m | [35m154.39304[39m | [35m21.339078[39m | [35m68.739069[39m | [35m0.4961372[39m |
| [39m9 [39m | [39m0.7785 [39m | [39m374.89432[39m | [39m249.10292[39m | [39m8.8089271[39m | [39m91.022719[39m | [39m0.3329019[39m |
| [39m10 [39m | [39m0.7783333[39m | [39m1990.9416[39m | [39m157.92040[39m | [39m104.97346[39m | [39m55.124317[39m | [39m0.2663690[39m |
| [35m11 [39m | [35m0.7830000[39m | [35m2909.0580[39m | [35m388.24101[39m | [35m188.02079[39m | [35m89.587907[39m | [35m0.6381099[39m |
| [35m12 [39m | [35m0.7836666[39m | [35m2766.4039[39m | [35m46.980773[39m | [35m40.804606[39m | [35m5.4775016[39m | [35m0.3927972[39m |
| [39m13 [39m | [39m0.7796666[39m | [39m1172.1450[39m | [39m137.86046[39m | [39m166.09002[39m | [39m36.318579[39m | [39m0.3528410[39m |
| [39m14 [39m | [39m0.7798333[39m | [39m1632.6612[39m | [39m73.039339[39m | [39m160.83500[39m | [39m8.3805137[39m | [39m0.9881982[39m |
| [39m15 [39m | [39m0.7804999[39m | [39m2319.0118[39m | [39m101.76169[39m | [39m3.0933791[39m | [39m81.730681[39m | [39m0.7361716[39m |
| [39m16 [39m | [39m0.776 [39m | [39m2189.7314[39m | [39m386.32136[39m | [39m16.660841[39m | [39m36.488107[39m | [39m0.2042821[39m |
| [39m17 [39m | [39m0.7833333[39m | [39m2590.6792[39m | [39m312.77916[39m | [39m67.517808[39m | [39m7.2922766[39m | [39m0.3798840[39m |
| [39m18 [39m | [39m0.7823333[39m | [39m982.29813[39m | [39m365.61427[39m | [39m128.23637[39m | [39m88.834061[39m | [39m0.5249934[39m |
| [39m19 [39m | [39m0.7808333[39m | [39m367.58679[39m | [39m357.48265[39m | [39m152.63543[39m | [39m56.566442[39m | [39m0.7938704[39m |
| [39m20 [39m | [39m0.7806666[39m | [39m1486.4488[39m | [39m262.79821[39m | [39m86.653121[39m | [39m3.5164935[39m | [39m0.1971022[39m |
| [39m21 [39m | [39m0.7756666[39m | [39m2425.0300[39m | [39m157.44856[39m | [39m26.743786[39m | [39m58.528349[39m | [39m0.2327190[39m |
| [39m22 [39m | [39m0.7823333[39m | [39m317.08089[39m | [39m399.15715[39m | [39m24.720105[39m | [39m61.174421[39m | [39m0.5006357[39m |
| [39m23 [39m | [39m0.7735000[39m | [39m2175.1790[39m | [39m172.94266[39m | [39m82.673729[39m | [39m62.461772[39m | [39m0.1659964[39m |
| [39m24 [39m | [39m0.7798333[39m | [39m530.83893[39m | [39m39.948804[39m | [39m156.84141[39m | [39m68.955501[39m | [39m0.8188521[39m |
| [39m25 [39m | [39m0.7823333[39m | [39m125.79174[39m | [39m279.13058[39m | [39m98.416484[39m | [39m18.166317[39m | [39m0.7781925[39m |
| [39m26 [39m | [39m0.7805 [39m | [39m1943.5744[39m | [39m274.68149[39m | [39m28.783133[39m | [39m68.150995[39m | [39m0.7199743[39m |
| [39m27 [39m | [39m0.7796666[39m | [39m1979.4017[39m | [39m459.09935[39m | [39m162.55494[39m | [39m30.051406[39m | [39m0.7814428[39m |
| [39m28 [39m | [39m0.7818333[39m | [39m513.28522[39m | [39m310.94902[39m | [39m163.56804[39m | [39m83.030768[39m | [39m0.4537288[39m |
| [39m29 [39m | [39m0.7816666[39m | [39m298.73901[39m | [39m347.12283[39m | [39m59.999680[39m | [39m35.549478[39m | [39m0.4592652[39m |
| [39m30 [39m | [39m0.7793333[39m | [39m519.01956[39m | [39m99.603760[39m | [39m8.9862463[39m | [39m63.792105[39m | [39m0.9334241[39m |
| [39m31 [39m | [39m0.7781666[39m | [39m80.703036[39m | [39m305.75024[39m | [39m198.73222[39m | [39m44.662866[39m | [39m0.8430691[39m |
| [39m32 [39m | [39m0.7796666[39m | [39m2906.4182[39m | [39m197.65251[39m | [39m145.00770[39m | [39m6.4047592[39m | [39m0.9400330[39m |
| [39m33 [39m | [39m0.7818333[39m | [39m1153.4739[39m | [39m376.22945[39m | [39m64.166821[39m | [39m1.1935861[39m | [39m0.5656587[39m |
| [39m34 [39m | [39m0.7793333[39m | [39m948.23272[39m | [39m188.22702[39m | [39m131.39722[39m | [39m1.0806612[39m | [39m0.1948411[39m |
| [39m35 [39m | [39m0.7803333[39m | [39m2554.5726[39m | [39m248.93796[39m | [39m24.845931[39m | [39m71.106722[39m | [39m0.8517691[39m |
| [39m36 [39m | [39m0.7835 [39m | [39m424.37459[39m | [39m63.396902[39m | [39m22.342181[39m | [39m26.149522[39m | [39m0.5716183[39m |
| [39m37 [39m | [39m0.7798333[39m | [39m853.16312[39m | [39m36.296215[39m | [39m193.11443[39m | [39m12.060599[39m | [39m0.3533714[39m |
| [39m38 [39m | [39m0.7813333[39m | [39m1403.4459[39m | [39m287.47407[39m | [39m38.708242[39m | [39m3.2984263[39m | [39m0.4907944[39m |
| [35m39 [39m | [35m0.7844999[39m | [35m2537.5609[39m | [35m67.559265[39m | [35m14.338645[39m | [35m21.314120[39m | [35m0.5955760[39m |
| [39m40 [39m | [39m0.7818333[39m | [39m573.60971[39m | [39m114.23228[39m | [39m132.24189[39m | [39m45.272906[39m | [39m0.6922839[39m |
| [39m41 [39m | [39m0.7826666[39m | [39m753.91044[39m | [39m76.401126[39m | [39m68.771433[39m | [39m49.325087[39m | [39m0.4916381[39m |
| [39m42 [39m | [39m0.7823333[39m | [39m1473.3739[39m | [39m35.232747[39m | [39m107.51187[39m | [39m11.949661[39m | [39m0.8845080[39m |
| [39m43 [39m | [39m0.7813333[39m | [39m75.769845[39m | [39m169.91039[39m | [39m140.05542[39m | [39m18.378717[39m | [39m0.8904848[39m |
| [39m44 [39m | [39m0.7735000[39m | [39m1934.7092[39m | [39m117.78365[39m | [39m30.335632[39m | [39m82.043426[39m | [39m0.2200359[39m |
| [35m45 [39m | [35m0.7846666[39m | [35m1133.3085[39m | [35m260.67839[39m | [35m3.5076515[39m | [35m17.975101[39m | [35m0.6719520[39m |
| [39m46 [39m | [39m0.7825000[39m | [39m2623.9015[39m | [39m397.73205[39m | [39m125.71576[39m | [39m65.187069[39m | [39m0.5083534[39m |
| [39m47 [39m | [39m0.7788333[39m | [39m1156.5189[39m | [39m17.521647[39m | [39m170.39534[39m | [39m96.298122[39m | [39m0.9298774[39m |
| [39m48 [39m | [39m0.7811666[39m | [39m1901.3568[39m | [39m60.950741[39m | [39m39.306505[39m | [39m47.619620[39m | [39m0.6659724[39m |
| [39m49 [39m | [39m0.7793333[39m | [39m438.99674[39m | [39m453.66489[39m | [39m195.26912[39m | [39m59.794469[39m | [39m0.7990364[39m |
| [39m50 [39m | [39m0.7806666[39m | [39m2720.6271[39m | [39m332.73419[39m | [39m74.434419[39m | [39m54.867846[39m | [39m0.5900542[39m |
| [39m51 [39m | [39m0.7736666[39m | [39m1320.1037[39m | [39m3.4521495[39m | [39m157.78656[39m | [39m37.572691[39m | [39m0.9492811[39m |
| [39m52 [39m | [39m0.7801666[39m | [39m971.15043[39m | [39m284.53894[39m | [39m155.11072[39m | [39m17.331234[39m | [39m0.8099888[39m |
| [39m53 [39m | [39m0.7813333[39m | [39m669.90372[39m | [39m334.70999[39m | [39m69.079472[39m | [39m82.004227[39m | [39m0.7211400[39m |
| [39m54 [39m | [39m0.7811666[39m | [39m1203.4759[39m | [39m209.39405[39m | [39m8.8230706[39m | [39m41.794833[39m | [39m0.4569208[39m |
| [39m55 [39m | [39m0.7831666[39m | [39m2571.7657[39m | [39m466.37838[39m | [39m140.78362[39m | [39m69.484479[39m | [39m0.4865115[39m |
| [39m56 [39m | [39m0.7813333[39m | [39m1870.3275[39m | [39m314.75127[39m | [39m30.133635[39m | [39m50.071866[39m | [39m0.6024418[39m |
| [39m57 [39m | [39m0.7813333[39m | [39m1201.4225[39m | [39m149.06964[39m | [39m56.282650[39m | [39m52.547336[39m | [39m0.8794528[39m |
| [39m58 [39m | [39m0.781 [39m | [39m524.06144[39m | [39m469.31379[39m | [39m130.58694[39m | [39m66.431875[39m | [39m0.7377440[39m |
| [39m59 [39m | [39m0.7803333[39m | [39m273.30264[39m | [39m234.01320[39m | [39m145.95364[39m | [39m46.354749[39m | [39m0.8357447[39m |
| [39m60 [39m | [39m0.7801666[39m | [39m1087.5393[39m | [39m125.91686[39m | [39m130.08865[39m | [39m67.682628[39m | [39m0.9319276[39m |
| [39m61 [39m | [39m0.7788333[39m | [39m1048.5384[39m | [39m372.84489[39m | [39m91.940050[39m | [39m88.254461[39m | [39m0.3850228[39m |
| [39m62 [39m | [39m0.7771666[39m | [39m1328.4268[39m | [39m153.80915[39m | [39m76.285990[39m | [39m79.306738[39m | [39m0.2910777[39m |
| [39m63 [39m | [39m0.775 [39m | [39m747.27103[39m | [39m311.56030[39m | [39m121.16394[39m | [39m84.193188[39m | [39m0.2901180[39m |
| [39m64 [39m | [39m0.7816666[39m | [39m2480.0412[39m | [39m244.49159[39m | [39m42.200987[39m | [39m33.311390[39m | [39m0.4148590[39m |
| [39m65 [39m | [39m0.7815000[39m | [39m117.64791[39m | [39m202.11126[39m | [39m47.012433[39m | [39m35.892027[39m | [39m0.4599005[39m |
| [39m66 [39m | [39m0.7806666[39m | [39m2783.0677[39m | [39m374.11788[39m | [39m146.42023[39m | [39m17.149585[39m | [39m0.6249411[39m |
| [39m67 [39m | [39m0.7798333[39m | [39m1241.6715[39m | [39m111.95833[39m | [39m130.96670[39m | [39m39.995680[39m | [39m0.3065256[39m |
| [39m68 [39m | [39m0.7809999[39m | [39m1591.2669[39m | [39m272.05883[39m | [39m152.18439[39m | [39m89.064828[39m | [39m0.7008193[39m |
| [39m69 [39m | [39m0.7805 [39m | [39m1738.8556[39m | [39m322.31694[39m | [39m172.25367[39m | [39m14.927934[39m | [39m0.6151460[39m |
| [39m70 [39m | [39m0.7826666[39m | [39m1105.6256[39m | [39m210.30828[39m | [39m113.21525[39m | [39m26.905757[39m | [39m0.5758132[39m |
| [39m71 [39m | [39m0.781 [39m | [39m2781.4279[39m | [39m33.070318[39m | [39m89.106698[39m | [39m36.447801[39m | [39m0.7891217[39m |
| [39m72 [39m | [39m0.7825 [39m | [39m1081.9807[39m | [39m455.65269[39m | [39m199.17377[39m | [39m83.689354[39m | [39m0.6619620[39m |
| [39m73 [39m | [39m0.7798333[39m | [39m437.66564[39m | [39m381.59001[39m | [39m154.84757[39m | [39m43.105460[39m | [39m0.6821938[39m |
| [39m74 [39m | [39m0.7843333[39m | [39m747.41700[39m | [39m380.14096[39m | [39m48.727399[39m | [39m12.558982[39m | [39m0.4861464[39m |
| [39m75 [39m | [39m0.7741666[39m | [39m286.22188[39m | [39m149.24865[39m | [39m126.63974[39m | [39m76.647195[39m | [39m0.1949266[39m |
| [39m76 [39m | [39m0.7793333[39m | [39m1836.5163[39m | [39m18.118982[39m | [39m165.95012[39m | [39m76.074824[39m | [39m0.9598802[39m |
| [39m77 [39m | [39m0.7653333[39m | [39m1721.1603[39m | [39m5.3941777[39m | [39m47.906330[39m | [39m35.510318[39m | [39m0.1143413[39m |
| [39m78 [39m | [39m0.7776666[39m | [39m2858.0536[39m | [39m244.36583[39m | [39m183.94588[39m | [39m57.418499[39m | [39m0.3004327[39m |
| [39m79 [39m | [39m0.781 [39m | [39m505.73694[39m | [39m338.59695[39m | [39m163.50715[39m | [39m33.129798[39m | [39m0.4782533[39m |
| [39m80 [39m | [39m0.7835 [39m | [39m556.95900[39m | [39m75.486130[39m | [39m8.6558649[39m | [39m26.756799[39m | [39m0.6313273[39m |
| [39m81 [39m | [39m0.7815000[39m | [39m1224.9566[39m | [39m473.79011[39m | [39m143.88174[39m | [39m55.109025[39m | [39m0.5694877[39m |
| [39m82 [39m | [39m0.7755 [39m | [39m223.04664[39m | [39m287.96042[39m | [39m147.52240[39m | [39m46.231769[39m | [39m0.2499678[39m |
| [39m83 [39m | [39m0.7516666[39m | [39m1807.6947[39m | [39m464.98462[39m | [39m175.67948[39m | [39m64.875943[39m | [39m0.1109204[39m |
| [39m84 [39m | [39m0.7735000[39m | [39m1247.8515[39m | [39m264.10901[39m | [39m131.12049[39m | [39m77.706472[39m | [39m0.1632169[39m |
| [39m85 [39m | [39m0.7815 [39m | [39m1382.4313[39m | [39m385.53659[39m | [39m164.02633[39m | [39m91.902852[39m | [39m0.5742807[39m |
| [39m86 [39m | [39m0.7806666[39m | [39m2694.6705[39m | [39m375.58797[39m | [39m93.540687[39m | [39m48.613531[39m | [39m0.8272110[39m |
| [39m87 [39m | [39m0.7833333[39m | [39m2745.1147[39m | [39m245.38198[39m | [39m57.871810[39m | [39m17.719007[39m | [39m0.8101745[39m |
| [39m88 [39m | [39m0.78 [39m | [39m933.15039[39m | [39m256.06117[39m | [39m22.378530[39m | [39m63.350000[39m | [39m0.3323077[39m |
| [39m89 [39m | [39m0.779 [39m | [39m762.11470[39m | [39m308.13330[39m | [39m56.013684[39m | [39m93.953433[39m | [39m0.3625972[39m |
| [39m90 [39m | [39m0.7793333[39m | [39m351.78538[39m | [39m88.659088[39m | [39m3.6657804[39m | [39m66.885241[39m | [39m0.3511481[39m |
| [39m91 [39m | [39m0.7813333[39m | [39m95.248067[39m | [39m241.75872[39m | [39m23.006006[39m | [39m98.411963[39m | [39m0.4508095[39m |
| [39m92 [39m | [39m0.7816666[39m | [39m2358.9631[39m | [39m478.81104[39m | [39m193.75648[39m | [39m86.070673[39m | [39m0.5636019[39m |
| [39m93 [39m | [39m0.7835000[39m | [39m2547.9663[39m | [39m312.18638[39m | [39m72.442860[39m | [39m12.083836[39m | [39m0.3048117[39m |
| [39m94 [39m | [39m0.7806666[39m | [39m2852.6971[39m | [39m441.82470[39m | [39m141.50327[39m | [39m92.639012[39m | [39m0.7188809[39m |
| [39m95 [39m | [39m0.7821666[39m | [39m475.74481[39m | [39m495.72679[39m | [39m193.45506[39m | [39m90.933108[39m | [39m0.6056273[39m |
| [39m96 [39m | [39m0.7828333[39m | [39m2109.3185[39m | [39m86.258182[39m | [39m72.175309[39m | [39m50.188768[39m | [39m0.4956106[39m |
| [39m97 [39m | [39m0.7823333[39m | [39m2729.7666[39m | [39m342.63323[39m | [39m113.58606[39m | [39m43.633311[39m | [39m0.5049303[39m |
| [39m98 [39m | [39m0.7808333[39m | [39m2749.1099[39m | [39m235.85021[39m | [39m191.21361[39m | [39m54.167328[39m | [39m0.5838386[39m |
| [39m99 [39m | [39m0.7823333[39m | [39m2564.3120[39m | [39m287.11853[39m | [39m22.572107[39m | [39m67.270207[39m | [39m0.4430685[39m |
| [39m100 [39m | [39m0.7801666[39m | [39m1236.5262[39m | [39m354.04302[39m | [39m189.94843[39m | [39m94.156661[39m | [39m0.7778778[39m |
=====================================================================================
优化完成!总耗时: 838.83 秒
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='每次迭代得分', alpha=0.7, markersize=6)
ax1.plot(iterations, best_scores, 'r--', label='累计最优得分', linewidth=2)
ax1.axhline(y=optimizer.max['target'], color='green', linestyle=':',
label=f'最终最优: {optimizer.max["target"]:.4f}') # axhline绘制水平线
ax1.set_xlabel('迭代次数', fontsize=12)
ax1.set_ylabel('准确率', fontsize=12)
ax1.set_title('贝叶斯优化收敛曲线 (超大空间100次迭代)', fontsize=14, fontweight='bold')
ax1.legend()
ax1.grid(True, alpha=0.3)
# 右图:初始探索 vs 贝叶斯优化
init_points = 20 # 更新为20
ax2.plot(iterations[:init_points], scores[:init_points], 'bo-',
label=f'随机探索 (前{init_points}次)', markersize=8, alpha=0.7)
ax2.plot(iterations[init_points:], scores[init_points:], 'go-',
label=f'贝叶斯优化 (后{len(iterations)-init_points}次)', markersize=8, alpha=0.7)
ax2.axvline(x=init_points, color='red', linestyle='--', alpha=0.5, label='探索→利用') # axvline绘制垂直线
ax2.set_xlabel('迭代次数', fontsize=12)
ax2.set_ylabel('准确率', fontsize=12)
ax2.set_title('探索阶段 vs 利用阶段', fontsize=14, fontweight='bold')
ax2.legend()
ax2.grid(True, alpha=0.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}")
总迭代次数: 100 最低得分: 0.7517 最高得分: 0.7847 平均得分: 0.7799 得分标准差: 0.0041 得分提升: 0.0102
更多推荐
所有评论(0)