如何为DataFrame不同来源的行分配权重以用于模型训练?
多来源数据集权重分配实现方案
步骤1:为不同来源数据标注专属权重
你可以先给每个来源的数据集新增权重字段,再合并成总数据集,可根据标注质量自定义权重值,质量越高权重越大,示例代码如下:
import pandas as pd # source 1 df1 = pd.DataFrame({ 'feature': ['a', 'b', 'c'], 'label': [1, 0, 0] }) df1['sample_weight'] = 1.5 # 示例给source1分配1.5的权重 # source 2 df2 = pd.DataFrame({ 'feature': ['d', 'e', 'f'], 'label': [1, 0, 1] }) df2['sample_weight'] = 0.8 # 示例给source2分配0.8的权重 df = pd.concat([df1, df2], ignore_index=True)
步骤2:训练时传入权重参数
你提到的权重不属于类别权重,属于样本训练权重,主流模型框架都支持直接传入该参数:
scikit-learn 系列模型
绝大多数sklearn的模型fit方法都支持sample_weight参数,直接传入权重列即可:
from sklearn.ensemble import RandomForestClassifier clf = RandomForestClassifier() X = df[['feature']] # 实际使用时可对特征做编码处理 y = df['label'] weight = df['sample_weight'] clf.fit(X, y, sample_weight=weight)
其他模型适配
- XGBoost、LightGBM等树模型的sklearn接口同样支持
sample_weight参数,使用方法和上面一致 - 如果你用的是深度学习框架(TensorFlow/PyTorch),可以在计算损失函数时,将每个样本的损失乘以对应权重再求平均,即可实现来源权重的差异化
补充:如果需要差异化特征本身的重要性
如果你需要让模型感知特征的来源差异,还可以新增source特征列作为输入的一部分,模型会自动学习不同来源特征的重要性系数,和样本权重搭配使用效果更好。
内容的提问来源于stack exchange,提问作者Mario Moctezuma
相关产品推荐
相关产品推荐

