#P4631. 第2题-混合信号融合预测
-
1000ms
Tried: 30
Accepted: 7
Difficulty: 8
所属公司 :
蚂蚁
时间 :2026年3月19日算法
第2题-混合信号融合预测
解题思路
这道题本质上是一个“文本特征 + 数值特征”的二分类问题,题面已经把特征工程和模型流程规定得非常明确,因此我们只需要严格按题意把整条流水线实现出来即可。
整体流程分为四步:
- 文本做两路加权向量化特征
- 数值做标准化 + 二次多项式展开
- 三路特征拼接
题目内容
你拥有一批服务评价数据,每条记录包含一段用户评论文本和若干数值指标(如等待时长、消费金额等),以及对应的二分类标签(1 表示不满意,0 表示满意)。
你需要按以下七步流程建立预测模型,并对一组新的评价记录进行预测:
-
词级加权编码
对评论文本使用词级加权向量化:全部转为小写,剔除英文停用词,提取一元和二元词组,并采用亚线性词频缩放。 -
字符级三元组编码
对评论文本使用字符级三元组加权向量化:以字符为单位、提取连续三元组,同样转为小写并采用亚线性缩放。 -
数值特征变换
将数值指标每一列标准化(零均值单位方差),再进行二次多项式展开(不含偏置项)。 -
特征合并
将上述三组特征矩阵横向拼接为一个稀疏矩阵。 -
模型 A
使用带 ℓ2 正则化的逻辑回归,正则强度 C=1.0,求解器为 liblinear,最大迭代 1000,随机种子固定。 -
模型 B
使用对数损失和 ℓ2 正则化的随机梯度下降分类器,正则化系数 α=10−4,最大迭代 1000,随机种子固定。 -
软投票融合
取两模型预测正类概率的平均值,若平均值大于 0.5 则判定为不满意(标签 1),否则判定为满意(标签 0)。
所有随机源均固定为 random_state=42。仅允许使用 numpy、pandas 和 scikit-learn 三个库。
数据约束:
- 训练与测试的评论文本总条数不超过 104,每条文本长度不超过 200;
- 数值特征的维度(每行内数值个数)不超过 5;
- 所有数值的绝对值不超过 106;
- 训练标签只取 0 或 1。
输入描述
输入为一行 JSON 字符串,表示一个字典,包含以下键:
train_txt:字符串列表,训练评论;train_num:二维数值列表,训练数值特征;train_y:整数列表,训练标签(0 或 1);test_txt:字符串列表,测试评论;test_num:二维数值列表,测试数值特征。
输出描述
输出一行,内容为一个 Python 列表的字符串表示,列表中的整数为 0 或 1,元素之间以英文逗号和空格分隔,形如 [0, 1, 0]。列表长度等于测试集大小。
样例1
输入
{"train_txt": ["good", "bad"], "train_num": [[10.0], [2.0]], "train_y": [0, 1], "test_txt": ["good", "bad"], "test_num": [[10.0], [2.0]]}
输出
[0, 1]
说明
训练集仅包含两条评论,"good" 对应的标签为 0(满意),"bad" 对应的标签为 1(不满意)。数值特征也存在明显差异([10.0] 与 [2.0])。经过词级加权编码、字符三元组编码以及数值标准化后,模型能够清晰地学习到决策边界。由于测试样本与训练样本完全相同,模型对 "good" 的预测概率接近 0(不满意的概率接近 0),对 "bad" 的预测概率接近 1,软投票平均后分别小于和大于 0.5,因此输出 [0 1]。
样例2
输入
{"train_txt": ["the food is delicious", "the food is terrible", "great service", "bad experience"], "train_num": [[20.0, 5.0], [10.0, 1.0], [25.0, 5.0], [5.0, 1.0]], "train_y": [0, 1, 0, 1], "test_txt": ["the food is delicious", "great service"], "test_num": [[20.0, 5.0], [25.0, 5.0]]}
输出
[0, 0]
说明
训练集包含四条评论,其中 "the food is delicious" 和 "great service" 为满意(0),"the food is terrible" 和 "bad experience" 为不满意(1)。评论中的停用词(如 "the"、"is")在词级向量化时会被自动过滤,同时提取一元和二元词组;字符级三元组则按 3 个字符滑动提取。数值特征(例如等待时长和评分)经标准化与多项式展开后,与文本特征一同用于训练。由于测试样本均取自训练集,两个逻辑回归与 SGD 分类器都能正确拟合,软投票后预测概率分别为低值,均小于 0.5,故输出 [0 0]。
样例3
输入
{"train_txt": ["good", "good", "bad", "bad"], "train_num": [[5, 10], [6, 12], [1, 2], [2, 3]], "train_y": [0, 0, 1, 1], "test_txt": ["good", "bad"], "test_num": [[5, 10], [1, 2]]}
输出
[0, 1]
说明
本样例重点展示数值特征变换的作用。所有评论仅使用 "good" 和 "bad",使文本特征贡献相近,分类主要依赖数值指标。训练数值特征中,满意类的值(如 [5, 10])明显高于不满意类(如 [1, 2])。数值列首先经 StandardScaler 转化为零均值、单位方差,再通过 PolynomialFeatures(degree=2, include_bias=False) 生成交互项与平方项。随后与词级 TF‑IDF、字符三元组特征拼接。模型 A(LogisticRegression,ℓ₂ 正则,C=1.0)和模型 B(SGDClassifier,α=10⁻⁴,对数损失)分别训练,软投票平均概率在 "good" 上小于 0.5,"bad" 上大于 0.5,输出 [0 1]。