python打卡day12

超参数调整专题2

  1. 三种启发式算法的示例代码:遗传算法、粒子群算法、退火算法
  2. 学习优化算法的思路(避免浪费无效时间)

作业:今天以自由探索的思路为主,尝试检索资料、视频、文档,用尽可能简短但是清晰的语言看是否能说清楚这三种算法每种算法的实现逻辑,帮助更深入的理解。

今天介绍下遗传算法,在你以后的论文写作中可以水一节,胆子大的人可以水一章。这些算法仅作为了解,不需要开始学习,如果以后需要在论文中用到,再针对性的了解下处理逻辑。

下面介绍这几种常见的优化算法:

1. 遗传算法

2. 粒子群优化

3. 模拟退火

这些启发式算法都是优化器,目标是找到一组最佳超参数,让你的机器学习模型在某个指标(比如验证集准确率)上表现最好。这个过程就像在一个复杂的地形(参数空间)上寻找最高峰(最佳性能),启发式算法就是一群聪明的“探险家”,它们用不同的策略(模仿自然、物理现象等)来寻找这个最高峰,而不需要知道地形每一处的精确梯度(导数)。

这里回顾一下,先把前面处理好的数据过一下以及不调参经随机森林训练后作为基准模型,用于与之后调参后进行对比:

import pandas as pd    #用于数据处理和分析,可处理表格数据。
import numpy as np     #用于数值计算,提供了高效的数组操作。
import matplotlib.pyplot as plt    #用于绘制各种类型的图表
import seaborn as sns   #基于matplotlib的高级绘图库,能绘制更美观的统计图形。
 
 # 设置中文字体(解决中文显示问题)
plt.rcParams['font.sans-serif'] = ['SimHei']  # Windows系统常用黑体字体
plt.rcParams['axes.unicode_minus'] = False    # 正常显示负号
data = pd.read_csv('data.csv')    #读取数据

# 先筛选字符串变量 
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 独热编码,记得需要将bool类型转换为数值
data = pd.get_dummies(data, columns=['Purpose'])
data2 = pd.read_csv("data.csv") # 重新读取数据,用来做列名对比
list_final = [] # 新建一个空列表,用于存放独热编码后新增的特征名
for i in data.columns:
    if i not in data2.columns:
       list_final.append(i) # 这里打印出来的就是独热编码后的特征名
for i in list_final:
    data[i] = data[i].astype(int) # 这里的i就是独热编码后的特征名

# 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)          #用众数填充该列的缺失值,inplace=True表示直接在原数据上修改。

# 最开始也说了 很多调参函数自带交叉验证,甚至是必选的参数,你如果想要不交叉反而实现起来会麻烦很多
# 所以这里我们还是只划分一次数据集
from sklearn.model_selection import train_test_split
X = data.drop(['Credit Default'], axis=1)  # 特征,axis=1表示按列删除
y = data['Credit Default'] # 标签
# 按照8:2划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)  # 80%训练集,20%测试集

# 数据进入机器学习模型训练预测
from sklearn.ensemble import RandomForestClassifier #随机森林分类器
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score # 用于评估分类器性能的指标
from sklearn.metrics import classification_report, confusion_matrix #用于生成分类报告和混淆矩阵
import warnings #用于忽略警告信息
warnings.filterwarnings("ignore") # 忽略所有警告信息
# --- 1. 默认参数的随机森林 ---
# 评估基准模型,这里确实不需要验证集
print("--- 1. 默认参数随机森林 (训练集 -> 测试集) ---")
import time # 这里介绍一个新的库,time库,主要用于时间相关的操作,因为调参需要很长时间,记录下会帮助后人知道大概的时长
start_time = time.time() # 记录开始时间
rf_model = RandomForestClassifier(random_state=42)
rf_model.fit(X_train, y_train) # 在训练集上训练
rf_pred = rf_model.predict(X_test) # 在测试集上预测
end_time = time.time() # 记录结束时间

print(f"训练与预测耗时: {end_time - start_time:.4f} 秒")
print("\n默认随机森林 在测试集上的分类报告:")
print(classification_report(y_test, rf_pred))
print("默认随机森林 在测试集上的混淆矩阵:")
print(confusion_matrix(y_test, rf_pred))

下面会简要介绍这三种算法:

1.遗传算法(GA)----生物进化模拟

初始化阶段:模拟生物进化的“种群”概念,每个超参数就是每个基因,每个个体是一组超参数的组合,先设定每个超参数取值范围即设置好参数空间,再随机生成多个个体组成初始化种群

评估阶段:模拟物竞天择的“适应度”,用当前参数组合训练计算测试集准确率作为适应度,对每个参数组合进行评分及对个体进行评估

进化阶段:通过「选择-交叉-变异」迭代优化直到满足最终条件

  • 选择:保留高分个体
  • 交叉:两个父代个体交换部分参数产生新的个体
  • 变异:随机修改个体的某些参数

2.粒子群优化(PSO)----鸟群协作觅食

粒子初始化:每个粒子代表一组参数(如 [n_neighbors=5, p=2]),随机分布。

跟踪最优:粒子记住自己历史上的最佳位置(pbest)和群体全局最佳位置(gbest)。

速度更新:根据 pbest 和 gbest 调整飞行方向(参数变化方向)。

收敛停止:粒子群逐渐聚集到最优解附近。

3. 模拟退火(SA)----金属冷却结晶

初始高温:随机生成一组参数,允许接受劣解(跳出局部最优)。

逐步降温:随着迭代,接受劣解的概率降低(类似金属冷却)。

邻域搜索:在当前参数附近随机扰动生成新解,择优保留。

收敛结果:温度降至阈值时,当前解作为最优解。

参数多、组合复杂➡➡➡GA:并行搜索能力强,适合高维空间

连续参数、快速收敛➡➡➡PSO:粒子间信息共享快,适合光滑的损失函数

离散参数、防局部最优➡➡➡SA:退火机制能跳出局部最优,适合组合优化(如特征选择)

收获心得:

不要死磕数学,理解核心思想比推导公式更重要。先调库再手写,用现成库(如DEAP、pyswarm)快速验证效果,再研究实现。可进行可视化过程绘制参数搜索路径(如PSO粒子轨迹),直观理解算法行为。

@浙大疏锦行

你可能感兴趣的:(Python,打卡训练,python,开发语言)