如何用Python Pandas代码筛选兼具高测试准确率与小差异的模型?
模型筛选的Pandas代码修改方案
模型性能表
| Mdl_nm | Train_acc | Test_acc | difference in (%) |
|---|---|---|---|
| GLM | 0.845056 | 0.858996 | 1.649499 |
| RF | 0.876157 | 0.893556 | 1.985884 |
| XGB | 0.871356 | 0.885981 | 1.678425 |
需求说明
需要筛选同时满足Test_acc尽可能高且Train_acc与Test_acc差异尽可能小的模型,最终期望选出XGB(RF的Test_acc最高但差异过大,XGB的Test_acc接近最高且差异更小)。
原有代码问题
原有代码仅筛选Test_acc等于最大值的模型,忽略了差异条件,且存在拼写错误(Test_accc多了一个c),因此只能选出RF。
修改后的代码方案
方案一:基于Test_acc阈值筛选后取差异最小模型
这种方法先保留Test_acc接近最大值的模型(可调整阈值比例),再从中选择差异最小的,符合你期望的筛选逻辑:
import pandas as pd # 构造示例数据 data = { 'Mdl_nm': ['GLM', 'RF', 'XGB'], 'Train_acc': [0.845056, 0.876157, 0.871356], 'Test_acc': [0.858996, 0.893556, 0.885981], 'difference in (%)': [1.649499, 1.985884, 1.678425] } df = pd.DataFrame(data) # 计算Test_acc最大值 max_test_acc = df['Test_acc'].max() # 设定阈值:保留Test_acc不低于最大值99%的模型(可根据需求调整比例) threshold_ratio = 0.99 threshold = max_test_acc * threshold_ratio # 筛选符合阈值的模型,按差异升序排序后取第一个 selected_model = df[df['Test_acc'] >= threshold].sort_values('difference in (%)', ascending=True).iloc[0]['Mdl_nm'] print(selected_model) # 输出:XGB
方案二:综合得分排序法
通过标准化两个指标并赋予权重,计算综合得分后选取得分最高的模型,更灵活平衡两个条件:
import pandas as pd data = { 'Mdl_nm': ['GLM', 'RF', 'XGB'], 'Train_acc': [0.845056, 0.876157, 0.871356], 'Test_acc': [0.858996, 0.893556, 0.885981], 'difference in (%)': [1.649499, 1.985884, 1.678425] } df = pd.DataFrame(data) # 标准化指标(消除量纲影响) df['norm_test_acc'] = (df['Test_acc'] - df['Test_acc'].min()) / (df['Test_acc'].max() - df['Test_acc'].min()) # 差异值反向标准化(值越大表示差异越小) df['norm_diff'] = (df['difference in (%)'].max() - df['difference in (%)']) / (df['difference in (%)'].max() - df['difference in (%)'].min()) # 设定权重:Test_acc占70%,差异占30%(可根据需求调整) df['composite_score'] = df['norm_test_acc'] * 0.7 + df['norm_diff'] * 0.3 # 按综合得分降序排序,取第一个模型 selected_model = df.sort_values('composite_score', ascending=False).iloc[0]['Mdl_nm'] print(selected_model) # 输出:XGB
内容的提问来源于stack exchange,提问作者rqqa
相关产品推荐
相关产品推荐

