Google Cloud ML设计模式:中性类设计模式解析与应用
引言
在机器学习分类问题中,我们经常会遇到一些样本既不完全属于某个类别,也不完全属于另一个类别的情况。Google Cloud ML设计模式中提出的"中性类设计模式"正是为了解决这类问题而生的。本文将深入探讨这一设计模式的原理、实现方式及其在实际应用中的价值。
什么是中性类设计模式?
中性类设计模式是指在分类问题中,为那些无法明确归入主要类别的样本创建一个专门的"中性"类别。这种方法特别适用于以下场景:
- 样本特征不足以明确分类
- 样本同时具有多个类别的特征
- 样本处于两个主要类别的边界区域
合成数据集演示
数据集构建
我们构建了一个模拟医疗处方决策的合成数据集:
- 有黄疸病史的患者(10%):处方为布洛芬(ibuprofen)
- 有胃溃疡病史的患者(10%):处方为对乙酰氨基酚(acetaminophen)
- 其余患者(80%):随机分配两种药物之一
def create_synthetic_dataset(N, shuffle):
# 初始化处方数组
prescription = np.full(N, fill_value='acetominophen', dtype='U20')
prescription[:N//2] = 'ibuprofen'
np.random.shuffle(prescription)
# 创建中性类
p_neutral = np.full(N, fill_value='Neutral', dtype='U20')
# 10%有黄疸病史的患者
jaundice = np.zeros(N, dtype=bool)
jaundice[0:N//10] = True
prescription[0:N//10] = 'ibuprofen'
p_neutral[0:N//10] = 'ibuprofen'
# 10%有胃溃疡病史的患者
ulcers = np.zeros(N, dtype=bool)
ulcers[(9*N)//10:] = True
prescription[(9*N)//10:] = 'acetominophen'
p_neutral[(9*N)//10:] = 'acetominophen'
return pd.DataFrame({
'jaundice': jaundice,
'ulcers': ulcers,
'prescription': prescription,
'prescription_with_neutral': p_neutral
})
模型对比
我们使用逻辑回归模型对比了两种标注方式的表现:
- 传统二分类标注(无中性类)
- 包含中性类的三分类标注
df = create_synthetic_dataset(1000, shuffle=True)
for label in ['prescription', 'prescription_with_neutral']:
lm = linear_model.LogisticRegression()
lm.fit(train_features, train_labels)
acc = lm.score(test_features, test_labels)
print(f'label={label} accuracy={acc}')
结果对比:
- 传统二分类准确率:55.5%
- 包含中性类的三分类准确率:100%
这个显著的差异说明,当中性样本确实存在时,强制将它们归入某个类别会显著降低模型性能。
真实世界应用:新生儿Apgar评分
Apgar评分是评估新生儿健康状况的重要指标:
- 10分:完全健康
- 8-9分:基本健康但略有不足
- ≤7分:需要医疗关注
二分类模型(无中性类)
我们将Apgar评分分为两类:
- ≥9分:健康
- ≤7分:需要关注
CREATE OR REPLACE MODEL mlpatterns.neutral_2classes
OPTIONS(model_type='logistic_reg', input_label_cols=['health']) AS
SELECT
IF(apgar_1min >= 9, 'Healthy', 'NeedsAttention') AS health,
plurality,
mother_age,
gestation_weeks,
ever_born
FROM `bigquery-public-data.samples.natality`
WHERE apgar_1min <= 10
评估结果:
- 准确率:56.5%
- 召回率:99.8%
- F1分数:0.722
三分类模型(包含中性类)
我们引入中性类:
- 10分:健康
- 8-9分:中性
- ≤7分:需要关注
CREATE OR REPLACE MODEL mlpatterns.neutral_3classes
OPTIONS(model_type='logistic_reg', input_label_cols=['health']) AS
SELECT
IF(apgar_1min = 10, 'Healthy', IF(apgar_1min >= 8, 'Neutral', 'NeedsAttention')) AS health,
plurality,
mother_age,
gestation_weeks,
ever_born
FROM `bigquery-public-data.samples.natality`
WHERE apgar_1min <= 10
评估结果:
- 准确率:79.5%
- 召回率:33.4%
- F1分数:0.296
分析与讨论
-
准确率提升:引入中性类后,模型准确率从56.5%提升到79.5%,说明中性类确实捕捉到了那些难以分类的样本。
-
召回率下降:召回率下降是因为中性类样本不再被强制分类,模型对主要类别的预测更加保守。
-
实际应用价值:在医疗等高风险领域,准确识别"不确定"的情况比错误分类更有价值。中性类为决策者提供了"需要进一步检查"的信号。
最佳实践建议
-
何时使用中性类:
- 当存在大量边界案例时
- 当错误分类成本很高时
- 当有资源进行人工复核时
-
中性类阈值设定:
- 基于领域知识而非统计分布
- 考虑错误分类的后果
- 可能需要调整以获得理想平衡
-
模型解释:
- 中性类样本通常具有中间特征值
- 可分析这些样本的特征分布
- 有助于理解模型的决策边界
结论
中性类设计模式为解决分类问题中的模糊边界提供了一种有效方法。通过在适当场景下引入中性类,我们可以:
- 提高模型整体准确率
- 减少高风险错误分类
- 为决策者提供更丰富的信息
在实际应用中,是否使用中性类应基于具体业务需求和错误分类的潜在影响。Google Cloud ML设计模式中的这一方法为处理分类不确定性提供了系统化的解决方案。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



