当前位置: 首页 > news >正文

DAY11@浙大疏锦行

笔记:

参数优化步骤:

1.在调参前,先建立基线模型:

- 使用**默认参数**训练模型

- 记录性能指标作为**对比基准**

- 后续调参效果以此为参照

2.对参数进行定义

1️⃣ 网格搜索 (GridSearchCV)

- 需要定义参数的**固定列表**(param_grid)

- 尝试所有可能的参数组合

- ⚠️ 计算成本高,参数多时组合呈指数级增长

2️⃣ 随机搜索 (RandomizedSearchCV)

- 定义参数的**分布范围**

- 随机采样指定次数(如 50-100 次)

- ✅ 对于给定计算预算,通常比网格搜索更有效

3️⃣ 贝叶斯优化 (BayesSearchCV)

- 定义参数的**搜索空间**

- 根据先验结果建立概率模型(高斯过程)

- 智能选择下一个最有潜力的参数组合

- ✅ 通常用更少迭代达到更好效果

3.创建调参方法的对象

4.在训练集上进行该方法

5.使用最佳参数的模型进行预测

作业:

1.调包:

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

2.预处理:

# 先筛选字符串变量 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(r'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表示直接在原数据上修改。

3.划分训练测试集

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%测试集

4.调包

from sklearn.svm import SVC #支持向量机分类器 from sklearn.neighbors import KNeighborsClassifier #K近邻分类器 from sklearn.linear_model import LogisticRegression #逻辑回归分类器 import xgboost as xgb #XGBoost分类器 import lightgbm as lgb #LightGBM分类器 from sklearn.ensemble import RandomForestClassifier #随机森林分类器 from catboost import CatBoostClassifier #CatBoost分类器 from sklearn.tree import DecisionTreeClassifier #决策树分类器 from sklearn.naive_bayes import GaussianNB #高斯朴素贝叶斯分类器 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") # 忽略所有警告信息

5.默认参数knn (训练集 -> 测试集) ---

print("--- 1. 默认参数knn (训练集 -> 测试集) ---") import time # 这里介绍一个新的库,time库,主要用于时间相关的操作,因为调参需要很长时间,记录下会帮助后人知道大概的时长 start_time = time.time() # 记录开始时间 knn_model = KNeighborsClassifier() knn_model.fit(X_train, y_train) knn_pred = knn_model.predict(X_test) end_time = time.time() # 记录结束时间 print(f"训练与预测耗时: {end_time - start_time:.4f} 秒") print("\n默认knn 在测试集上的分类报告:") print(classification_report(y_test, knn_pred)) print("默认knn 在测试集上的混淆矩阵:") print(confusion_matrix(y_test, knn_pred))

6.网格搜索优化knn

import os # 必须导入:设置环境变量 import tempfile # 必须导入:创建临时文件夹 # ========== 解决Windows中文路径编码问题 ========== os.environ['JOBLIB_TEMP_FOLDER'] = tempfile.mkdtemp(dir='D:\\') # 若D盘不存在,改为C:\\ os.environ['PYTHONIOENCODING'] = 'utf-8' print("\n--- 2. 网格搜索优化knn (训练集 -> 测试集) ---") from sklearn.model_selection import GridSearchCV # 定义要搜索的参数网格 param_grid = { 'n_neighbors': [1, 3, 5, 7, 9, 11, 13, 15], 'weights': ['uniform', 'distance'], 'metric': ['euclidean', 'manhattan'] } # 创建网格搜索对象 knn = KNeighborsClassifier() grid_search = GridSearchCV( estimator=knn, # 第1个参数 param_grid=param_grid, # 第2个参数 cv=5, # 5折交叉验证 scoring='accuracy', # 分类评分指标 n_jobs=-1, # 并行加速 verbose=1 # 最后一个参数不要加多余逗号(Python3虽兼容,但易报错) ) # 步骤4:执行网格搜索 start_time = time.time() grid_search.fit(X_train, y_train) end_time = time.time() # 在训练集上进行网格搜索 grid_search.fit(X_train, y_train) # 在训练集上训练,模型实例化和训练的方法都被封装在这个网格搜索对象里了 end_time = time.time() print(f"网格搜索耗时: {end_time - start_time:.4f} 秒") print("最佳参数: ", grid_search.best_params_) #best_params_属性返回最佳参数组合 # 使用最佳参数的模型进行预测 best_model = grid_search.best_estimator_ # 获取最佳模型 best_pred = best_model.predict(X_test) # 在测试集上进行预测 print("\n网格搜索优化后的随机森林 在测试集上的分类报告:") print(classification_report(y_test, best_pred)) print("网格搜索优化后的随机森林 在测试集上的混淆矩阵:") print(confusion_matrix(y_test, best_pred))

7.贝叶斯优化knn (训练集 -> 测试集) ---

print("\n--- 2. 贝叶斯优化knn (训练集 -> 测试集) ---") from skopt.space import Categorical # 先导入Categorical from skopt import BayesSearchCV from skopt.space import Integer from sklearn.metrics import classification_report, confusion_matrix import time # 定义要搜索的参数空间 param_space = { 'n_neighbors': Integer(low=1, high=20, name='n_neighbors'), # K值:1~20 'weights': Categorical(['uniform', 'distance'], name='weights'), # 权重 'metric': Categorical(['euclidean', 'manhattan'], name='metric') # 距离 } # 初始化贝叶斯优化器 knn = KNeighborsClassifier() bayes_search = BayesSearchCV( estimator=knn, search_spaces=param_space, # 传入正确的参数空间 n_iter=30, cv=5, scoring='accuracy', random_state=42, n_jobs=1, verbose=1 ) start_time = time.time() # 在训练集上进行贝叶斯优化搜索 bayes_search.fit(X_train, y_train) end_time = time.time() print(f"贝叶斯优化耗时: {end_time - start_time:.4f} 秒") print("最佳参数: ", bayes_search.best_params_) # 使用最佳参数的模型进行预测 best_model = bayes_search.best_estimator_ best_pred = best_model.predict(X_test) print(f"贝叶斯优化耗时: {end_time - start_time:.4f} 秒") print("最佳参数: ", bayes_search.best_params_) print("\n贝叶斯优化后的knn 在测试集上的分类报告:") print(classification_report(y_test, best_pred)) print("贝叶斯优化后的knn 在测试集上的混淆矩阵:") print(confusion_matrix(y_test, best_pred))

8.随机搜索优化knn

# --- 3. 随机搜索优化knn --- print("\n--- 2. 随机搜索优化随机森林 (训练集 -> 测试集) ---") from scipy.stats import randint from sklearn.model_selection import RandomizedSearchCV # 定义参数分布(使用分布而非固定列表) param_distribution = { 'n_neighbors': np.arange(3, 16, 2), # K值:3,5,...,15(奇数避免平局) 'weights': ['uniform', 'distance'], # 权重规则 'metric': ['euclidean', 'manhattan'], # 距离度量 'p': [1, 2] # 闵可夫斯基距离幂次(可选) } # 创建随机搜索对象 knn = KNeighborsClassifier() random_search = RandomizedSearchCV( estimator=knn, param_distributions=param_distribution, # 随机搜索的参数空间(而非网格列表) n_iter=20, # 随机采样20次(核心参数!) cv=5, # 5折交叉验证 scoring='accuracy', # 分类任务评分指标 random_state=42, # 固定种子,保证可复现 n_jobs=-1, # 单进程(Windows避免编码问题) verbose=1 # 输出进度日志 ) start_time = time.time() # 在训练集上进行随机搜索 random_search.fit(X_train, y_train) end_time = time.time() print(f"随机搜索耗时: {end_time - start_time:.4f} 秒") print("最佳参数: ", random_search.best_params_) # 使用最佳参数的模型进行预测 best_model_random = random_search.best_estimator_ best_pred_random = best_model_random.predict(X_test) print("\n随机搜索优化后的knn 在测试集上的分类报告:") print(classification_report(y_test, best_pred_random)) print("随机搜索优化后的knn 在测试集上的混淆矩阵:") print(confusion_matrix(y_test, best_pred_random))
http://www.jsqmd.com/news/88994/

相关文章:

  • 1分钟升级Nature正刊中的蛋白质跨膜结构域
  • MC Workbench6.4电机位置控制
  • 30、Nagios配置与使用全攻略
  • 分治算法刷题总结
  • IPv4地址与IPv6地址
  • Fluent中颗粒流模拟的门道
  • 31、Ubuntu 服务器虚拟化与 KVM 配置指南
  • 官宣:汇纳科技收购华速实业;融速科技完成A+轮融资;3D打印单季破40亿美元|库周报
  • 详谈:解释器模式(二)
  • OpenAI 放大招!GPT-5.2 重磅发布:碾压谷歌 Gemini,替你做 PPT / 写代码,国内这样用最划算
  • 新能源逆变器那些事儿:阻抗建模、扫频验证与稳定性分析
  • AI时代的云安全(一)新挑战与应对思考
  • 中国板材品牌哪家好?山东亦木,环保板材/全屋定制板材/装修环保板材/衣柜专用板材/桦木板/FOSB板/橡胶木/多层板/颗粒板定制实力厂家,老牌子,质量稳定性价比高 - 全局中转站
  • 技术满分,增长零分?互联网项目的广告投放破局指南
  • Java赋能AI智能采编:让百万传媒人提早下班的行业变革方案
  • CF1039A Timetable - crazy-
  • 基于泰坦尼克号数据集的随机森林算法实战
  • 图片转文字技术(一)从光学识别到智能理解的演进之路
  • 亿赛通脚本远程调试配置技巧
  • 【大模型预训练】17-分布式并行策略:Tensor并行、Pipeline并行的应用场景
  • Dockerfile 详解
  • 蛇形矩阵(三角形版本)
  • 探索非线性电液伺服系统:从PID到反步控制的奇妙之旅
  • 【大模型预训练】18-分布式并行技术:梯度同步、参数服务器架构实现方法
  • 探索Comsol双温模型在半导体飞秒激光研究中的应用
  • 线性回归和回归决策树(CART)对比
  • 【硕士生必看】硕士论文被退稿?可能是AI惹的祸!Paperzz智能降重+降AIGC,守护你的学术尊严!
  • 三相并联型有源电力滤波器APF仿真探索
  • 六自由度机械臂抓取动作仿真:两套易懂代码解析
  • Day32 类的定义和方法