
1) 【一句话结论】针对PB级数据因分布不均导致的模型偏差,设计分层预处理流水线,通过清洗(跨领域缺失值按数据量选择填充策略)、去重(分布式哈希+布隆过滤器)、特征工程(领域自适应),结合分层采样与领域自适应技术平衡数据分布,提升模型泛化性。
2) 【原理/概念讲解】老师口吻:想象PB级数据像“不均衡的食材库”——书架(数据集)上有些领域(类别)的书特别多,有些领域几乎没有,导致模型只学热门领域的知识。预处理要像“食材管理员”:
3) 【对比与适用场景】
| 方法 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 分层采样 | 按数据分布的层次(如领域、类别)比例采样 | 保证各层次样本比例与原始数据一致 | 类别不平衡、领域分布不均 | 需明确分层维度,计算复杂度高 |
| SMOTE | 过采样少数类,合成新样本(如KNN近邻) | 保留原样本特征,避免过拟合 | 少数类过采样 | 可能引入噪声,适合低维度特征 |
| 领域自适应 | 迁移学习,用预训练模型适配新领域 | 利用预训练知识,减少新领域样本需求 | 领域差异大,新领域样本少 | 需预训练模型,计算资源消耗大 |
4) 【示例】
def clean_data(data):
for domain in data['domain'].unique():
domain_data = data[data['domain'] == domain]
for col in domain_data.columns:
if domain_data[col].isnull().sum() > 0:
if domain_data[col].dtype == 'object':
if len(domain_data[col].dropna()) > 0:
data.loc[data['domain'] == domain, col] = data.loc[data['domain'] == domain, col].fillna(domain_data[col].mode()[0])
else:
data.loc[data['domain'] == domain, col] = data.loc[data['domain'] == domain, col].fillna(data[col].mode()[0])
else:
if len(domain_data[col].dropna()) > 0:
data.loc[data['domain'] == domain, col] = data.loc[data['domain'] == domain, col].fillna(domain_data[col].mean())
else:
data.loc[data['domain'] == domain, col] = data.loc[data['domain'] == domain, col].fillna(data[col].mean())
# 异常值处理
for domain in data['domain'].unique():
domain_data = data[data['domain'] == domain]
for col in domain_data.select_dtypes(include=['number']).columns:
q1 = domain_data[col].quantile(0.25)
q3 = domain_data[col].quantile(0.75)
iqr = q3 - q1
lower_bound = q1 - 1.5 * iqr
upper_bound = q3 + 1.5 * iqr
data.loc[data['domain'] == domain, col] = data.loc[data['domain'] == domain, col].clip(lower_bound, upper_bound)
return data
def deduplicate_data(data, bloom_filter_size=1000000):
# 布隆过滤器初始化
bloom = BloomFilter(size=bloom_filter_size)
deduped = []
for record in data:
key = hash(record) # 或基于关键字(如文本MD5)
if not bloom.contains(key):
bloom.add(key)
deduped.append(record)
return deduped
def stratified_sampling(data, target_col, sample_size):
stratified_data = {}
for group in data[target_col].unique():
stratified_data[group] = data[data[target_col] == group]
sampled_data = []
for group, group_data in stratified_data.items():
group_size = len(group_data)
if group_size > 0:
sampled_group = group_data.sample(n=min(sample_size, group_size), random_state=42)
sampled_data.extend(sampled_group)
return sampled_data
5) 【面试口播版答案】
“面试官您好,针对PB级数据分布不均导致的模型偏差问题,我的方案核心是构建分层预处理流水线,通过清洗、去重、特征工程,结合分层采样与领域自适应技术平衡数据分布。首先,数据清洗方面,处理缺失值时,若领域内数据量多,用领域均值填充;若领域内数据量少,用中位数或众数填充(避免全局均值导致偏差);异常值用IQR统计剔除。然后去重采用分布式哈希去重,结合布隆过滤器减少哈希冲突,适合PB级数据的高并发处理需求。接着特征工程,针对不同领域(如文本、图像)提取领域特定特征(文本用领域词表TF-IDF,图像用领域适配的CNN特征),再对通用特征做标准化,提升模型泛化性。解决数据分布不均方面,采用分层采样,按领域比例采样,保证冷门领域(如小众语音场景)的数据也能参与训练,避免模型只学习热门领域(如通用语音)的知识。另外,引入领域自适应技术,用预训练模型(如BERT)适配冷门领域,减少对冷门领域样本的需求,进一步平衡分布。这样预处理后,数据质量提升,分布更均衡,模型偏差问题得到缓解。”
6) 【追问清单】
7) 【常见坑/雷区】