前言:

        python数据结构这一块儿,我们已经在另一个专栏介绍过了,为了照顾不会的同学再提一次。

        其中有很多之前提过的重复部分,大家可以放在闲的时间里看看这节,因为我敲了这节的代码,所以先发出来了。

DAY12 数据结构{元组、字典方法}与贝叶斯可视化

一、元组类型

为了学习今天的内容,我们学习一下最后一个没提的基本数据类型,元组(tuple)具有以下特点:

  1. 有序:可以通过索引取出来元素
  2. 不可变,不可修改
  3. 可迭代、可切片 所以元组适合存储不应被程序意外修改的数据(例如配置常量、数据库记录的字段等)。函数返回多个值时,默认就是以元组的形式返回的。由于元组是不可变的,它可以作为字典的键(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行数据:
IdHome OwnershipAnnual IncomeYears in current jobTax LiensNumber of Open AccountsYears of Credit HistoryMaximum Open CreditNumber of Credit ProblemsMonths since last delinquentBankruptciesPurposeTermCurrent Loan AmountCurrent Credit BalanceMonthly DebtCredit ScoreCredit Default
00Own Home482087.0NaN0.011.026.3685960.01.0NaN1.0debt consolidationShort Term99999999.047386.07914.0749.00
11Own Home1025487.010+ years0.015.015.31181730.00.0NaN0.0debt consolidationLong Term264968.0394972.018373.0737.01
22Home Mortgage751412.08 years0.011.035.01182434.00.0NaN0.0debt consolidationShort Term99999999.0308389.013651.0742.00
33Own Home805068.06 years0.08.022.5147400.01.0NaN1.0debt consolidationShort Term121396.095855.011338.0694.00
44Rent776264.08 years0.013.013.6385836.01.0NaN0.0debt consolidationShort Term125840.093309.07180.0719.00
# 数据预处理
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

更多推荐