石家庄外贸做网站,什么网站做h5不收费,中卫网站推广软件,山东企业网站建设费用笔记#xff1a;参数优化步骤#xff1a;1.在调参前#xff0c;先建立基线模型#xff1a;- 使用**默认参数**训练模型- 记录性能指标作为**对比基准**- 后续调参效果以此为参照2.对参数进行定义1️⃣ 网格搜索 (GridSearchCV)- 需要定义参数的**固定列表**#xff08;par…笔记参数优化步骤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(rdata.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(rdata.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}, inplaceTrue) # 重命名列 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, inplaceTrue) #用众数填充该列的缺失值inplaceTrue表示直接在原数据上修改。3.划分训练测试集from sklearn.model_selection import train_test_split X data.drop([Credit Default], axis1) # 特征axis1表示按列删除 y data[Credit Default] # 标签 # 按照8:2划分训练集和测试集 X_train, X_test, y_train, y_test train_test_split(X, y, test_size0.2, random_state42) # 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.网格搜索优化knnimport os # 必须导入设置环境变量 import tempfile # 必须导入创建临时文件夹 # 解决Windows中文路径编码问题 os.environ[JOBLIB_TEMP_FOLDER] tempfile.mkdtemp(dirD:\\) # 若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( estimatorknn, # 第1个参数 param_gridparam_grid, # 第2个参数 cv5, # 5折交叉验证 scoringaccuracy, # 分类评分指标 n_jobs-1, # 并行加速 verbose1 # 最后一个参数不要加多余逗号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(low1, high20, namen_neighbors), # K值1~20 weights: Categorical([uniform, distance], nameweights), # 权重 metric: Categorical([euclidean, manhattan], namemetric) # 距离 } # 初始化贝叶斯优化器 knn KNeighborsClassifier() bayes_search BayesSearchCV( estimatorknn, search_spacesparam_space, # 传入正确的参数空间 n_iter30, cv5, scoringaccuracy, random_state42, n_jobs1, verbose1 ) 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( estimatorknn, param_distributionsparam_distribution, # 随机搜索的参数空间而非网格列表 n_iter20, # 随机采样20次核心参数 cv5, # 5折交叉验证 scoringaccuracy, # 分类任务评分指标 random_state42, # 固定种子保证可复现 n_jobs-1, # 单进程Windows避免编码问题 verbose1 # 输出进度日志 ) 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))