解题思路
本题是一个基于 K-最近邻的元学习(Meta-Learning)问题,核心思想是“借鉴相似任务的经验来选择超参数”。
整体流程分为四步:
- 特征构造:计算当前任务的元向量m∗ctr=[n, d, n∣n∗pos−nneg∣].
题目内容
给定一张历史元数据表(每行包含数据集简单特征 & 其在线最优C)、以及一份当前任务的训练/测试数据,请实现一个基于 K-NN 的超参数元学习器:
-
数据集元特征
对每个数据集都计算三维向量:
m=[samples,features,imbalance]
其中
- samples:训练样本数 n
- features:特征维度 d
- imbalance:∣npos−nneg∣/n
-
K最近邻检索
- 输入给出 history:每行 meta=mh、C、score(越大越好)。
- 计算当前任务元向量 mctr 到所有历史数据的 ℓ2 距离;
- 取 K=3 个最近邻;如距离并列按行次序决定。
-
汇聚与选 C*
- 对这 3 行,统计所有出现过的 C;
- 计算各 C 的平均 score(若某邻居中未出现该 C,则忽略);
- 取平均分最高者为 C*;若并列,则取数值最小。
-
模型训练 + 预测
- 使用 LogisticRegression(penalty="l2",C=C*, solver="lbfgs",maxiter=1000,randomstate=42)
- 用完整训练数据拟合;输出测试集标签。
输入描述
单行 JSON(示例片段)
{
"train_X": [[1.0,2.0], ...],
"train_y": [0, 1, ...],
"test_X": [[...], ...],
"history": [
{"meta": [50, 4, 0.10], "C": 0.1, "score": 0.80},
{"meta": [120, 2, 0.25], "C": 1.0, "score": 0.85},
...
]
}
约束:
- ∣train∣≤60, ∣test∣≤15, d≤4
- history 至少 6 条,C 取值 {0.1,0.3,1,3,10}
- 所有值数值型,无缺失
输出描述
仅一行:
{
"C_star": 1.0,
"pred": [0, 1, 0, ...]
}
pred 长度 = ∣testX∣,元素为 0/1。
补充说明
-
不得重新搜索其它 C;只能通过步骤 2−3 得到 C*。
-
所有随机源固定 randomstate=42,流程纯确定性。
-
为了确保通过测试用例,仅允许使用 numpy、pandas、scikit−learn。
样例1
输入
{
"train_X": [[0.0,0.0],[0.2,0.4],[0.3,0.5],[0.1,0.2],[1.0,1.1],[1.2,1.3],[1.3,1.4],[1.1,1.0]],
"train_y": [0,0,0,0,1,1,1,1],
"test_X": [[0.15,0.25],[1.15,1.25]],
"history": [
{"meta":[50,2,0.10],"C":0.1,"score":0.82},
{"meta":[48,2,0.20],"C":0.3,"score":0.79},
{"meta":[60,2,0.00],"C":1.0,"score":0.85},
{"meta":[40,4,0.30],"C":3.0,"score":0.80},
{"meta":[55,3,0.18],"C":0.3,"score":0.83},
{"meta":[52,2,0.10],"C":1.0,"score":0.81},
{"meta":[58,2,0.05],"C":10.0,"score":0.78}
]
}
输出
{"C_star": 0.1,"pred": [0, 1]}