超参数调整专题2
- 三种启发式算法的示例代码:遗传算法、粒子群算法、退火算法
- 学习优化算法的思路(避免浪费无效时间)
作业:今天以自由探索的思路为主,尝试检索资料、视频、文档,用尽可能简短但是清晰的语言看是否能说清楚这三种算法每种算法的实现逻辑,帮助更深入的理解。
启发式算法就是通过一些生活中的现象得到的“经验公式”,对现有的机器学习模型进行优化,得到想要的指标最好的超参数。
1. 遗传算法
核心逻辑 :模拟生物进化过程
初始化 :随机生成一群"个体"(可能的解)
选择 :根据"适应度"(解的好坏)筛选优秀个体,适应度高的更容易存活
交叉 :让优秀个体互相"交配",组合它们的特性产生新个体
变异 :偶尔随机改变某些个体的特性,增加多样性
迭代 :重复选择、交叉、变异,直到找到满意解
生活类比 :像培育高产小麦,选产量最高的麦子做种子(选择),让它们杂交(交叉),偶尔会有基因突变(变异),经过多代选育得到最优品种。
2. 粒子群算法
核心逻辑 :模拟鸟群觅食行为
初始化 :随机放置一群"粒子"(可能的解)
飞行规则 :每个粒子根据两个信息调整位置:
1. 1.
自己历史上找到的最优位置(个体经验)
2. 2.
整个群体找到的最优位置(群体经验)
迭代 :粒子不断向更优位置移动,直到收敛
生活类比 :像一群鸟找食物,每只鸟记住自己飞过的最可能有食物的地方(个体经验),同时关注其他鸟的发现(群体经验),不断调整飞行方向。
3. 模拟退火算法
核心逻辑 :模拟物理退火过程(加热后缓慢冷却)
初始化 :从一个随机解开始,设置较高的"温度"
搜索规则 :
温度高时:允许较大的随机跳跃,甚至接受较差的解(模拟高温时原子活跃)
温度降低:逐渐减小随机跳跃幅度,更倾向于接受更好的解
接受概率:用退火公式计算,温度越高、解的质量差距越小,越容易接受
迭代 :缓慢降低温度,直到找到稳定的最优解
生活类比 :像摇晃装沙子的瓶子,开始用力摇(高温),沙子可以大幅移动;慢慢减小摇晃力度(降温),沙子逐渐沉淀到最紧密的状态。
三种算法的共同目标都是寻找最优解,但思路不同:遗传算法靠"进化",粒子群靠"群体智慧",退火算法靠"缓慢冷却"跳出局部最优。
# --- 4. 粒子群优化(PSO)逻辑回归 ---
print("\n--- 4. 粒子群优化(PSO)逻辑回归 --- ")
# 安装必要库 (首次运行需要安装)
# !pip install pyswarm -i https://pypi.tuna.tsinghua.edu.cn/simple
from pyswarm import pso
import numpy as np
# 定义适应度函数:负AUC值(因为PSO默认是求最小值)
def fitness_function(params):
# params = [C, max_iter]
C = 10 ** params[0] # 对数缩放C值
max_iter = int(params[1])
# 固定其他参数
model = LogisticRegression(
C=C,
penalty='l2',
solver='liblinear',
max_iter=max_iter,
random_state=42
)
# 5折交叉验证
from sklearn.model_selection import cross_val_score
scores = cross_val_score(model, X_train, y_train, cv=5, scoring='roc_auc', n_jobs=-1)
return -np.mean(scores) # 取负值,因为PSO是最小化问题
# 定义参数边界
# C: 10^-2 到 10^2 (对数尺度)
# max_iter: 500 到 2000
lb = [-2, 500] # 下界
ub = [2, 2000] # 上界
# 执行PSO优化
start_time = time.time()
# 粒子数量=10, 迭代次数=30
x_opt, f_opt = pso(fitness_function, lb, ub, swarmsize=10, maxiter=30)
end_time = time.time()
# 转换最优参数
best_C = 10 ** x_opt[0]
best_max_iter = int(x_opt[1])
print(f"PSO优化耗时: {end_time - start_time:.4f} 秒")
print(f"最佳参数组合: C={best_C:.4f}, max_iter={best_max_iter}")
print(f"交叉验证最佳AUC: {-f_opt:.4f}")
# 最佳模型评估
pso_model = LogisticRegression(
C=best_C,
penalty='l2',
solver='liblinear',
max_iter=best_max_iter,
random_state=42
)
pso_model.fit(X_train, y_train)
pso_pred = pso_model.predict(X_test)
print("\nPSO优化后分类报告:")
print(classification_report(y_test, pso_pred))
# --- 5. 四种优化方法对比 ---
print("\n--- 四种优化方法对比 --- ")
print(f"默认模型测试集AUC: {roc_auc_score(y_test, base_model.predict_proba(X_test)[:,1]):.4f}")
print(f"网格搜索模型测试集AUC: {roc_auc_score(y_test, grid_model.predict_proba(X_test)[:,1]):.4f}")
print(f"贝叶斯优化模型测试集AUC: {roc_auc_score(y_test, bayes_model.predict_proba(X_test)[:,1]):.4f}")
print(f"PSO优化模型测试集AUC: {roc_auc_score(y_test, pso_model.predict_proba(X_test)[:,1]):.4f}")
--- 4. 粒子群优化(PSO)逻辑回归 ---
Stopping search: maximum iterations reached --> 30
PSO优化耗时: 5.8982 秒
最佳参数组合: C=2.1223, max_iter=767
交叉验证最佳AUC: 0.9040
PSO优化后分类报告:
precision recall f1-score support
0 0.87 0.93 0.90 29
1 0.93 0.88 0.90 32
accuracy 0.90 61
macro avg 0.90 0.90 0.90 61
weighted avg 0.90 0.90 0.90 61
--- 四种优化方法对比 ---
默认模型测试集AUC: 0.9246
网格搜索模型测试集AUC: 0.9375
贝叶斯优化模型测试集AUC: 0.9364
PSO优化模型测试集AUC: 0.9364
可以发现粒子群算法使得耗时变短,效率更高
484

被折叠的 条评论
为什么被折叠?



