误差分析的骚操作
学习学习学习!
客户要求拎出来所有导致模型误差率超过10%的特征,老师给出的解决方案:
将绝对误差率是否超过10%作为target_value,造一颗以recall_score为target_metric的树。
因为想要了解特征对误差的真实影响,使用train_test_split, recall_score针对验证集。
其中透出了几层理解:
-
名义变量与其他变量的特征探索(EDA):使用classification tree
-
classification tree: 对数据进行切分,使得切分结果尽可能地pure
切分的标准:
- 数值变量/可合并的名义变量(factorize):if feature<=value; else
- one-hot变量:if 当数值<=0.5; else (其实就是0或1的判断)
- ↑以上的流程区别有针对python和R处理名义变量的意思
-
recall_score:该案例更重视找到所有的误差超过10%的项目,想要尽量减小Type II Error.
-
验证集oos metric的使用场景
另外,主要使用名义变量,因为当某数值变量极差大且与其他变量高度有关时(比如y变量),极端情况下可以只通过切割该数值变量确定树
但是,这个解决方案的本质是“boosting的一次迭代”,针对高误差样本的特征进行学习。能够成功的假设是:已有的模型没法有效学习现有特征的信息。一个训练得较为robust的模型,其误差应该是随机的。
后来尝试的方法还有:
- v1:把feature_importance不为0的特征挑出来,看看仅根据这些特征筛选,能够覆盖多少高误差项目;
- v2:尝试原特征复杂模型,预测误差>10%的项目:
- 结果导向:单独上线误差预警模型,使定价预测模型+误差预警模型的结果能覆盖90%的项目;
- v3:尝试结果解释向特征,依据新特征对项目误差进行解释:
- 结果导向:在人为填报时进行预警,并交代在实行该预警的条件下,能捕捉多少误差项目
- 与S4不同之处在于,这一轮(S5)误差分析目的在于支持预警,即找出一些特征,使满足这些特征的项目尽可能多地筛选出误差超过阈值的。而上一轮的目的是找出一些特征,使筛掉这些特征,模型能够尽量准确。
2021.12.07 更新:
新的一版预警报告里,主要采取的是依据上面v3的两个新特征,对可能有误的项目进行预警,在老师给我提报告修改意见的时候,我主要学到了以下几点:
- 如果有两个特征同时筛选,需要考虑到两个特征指标设定的合理性,比如:
- 从业务逻辑的角度来讲,“离人类相似度80%” & “离哺乳动物相似度90%” 的要求不合尝试,因为样本本身应该是“人类”,所以对人类的相似度应该更高;
- 两个条件查看一下交集和并集的情况,有可能一个条件已经把另一个条件的样本全部涵盖在内;
- 科学的效果判断方式是类似GridSearchCV,同时查看precision和recall
- 尽量用客户最关注的指标做成报告,比如PPE5+5以上预警占比
- 当客户有不切实际的想法,比如recall == 100%时,直接给他们看precision(以你们脑洞的代价要预警80%的样本!!!)
老师说这个case做完,所有误差分析相关的内容都遍历了,以后再多也不怕了(一次次失望后的平静.jpg)。所以稍微总结一下误差分析的几个阶段:
-
S1. 高误差项目:验证输入数据的准确性,排除outlier
-
S2. 误差可视化(如地图):观察有无遗漏特征,如离外溢城市的距离
-
S3. 误差和各特征的相关性:其实没做,但是说不定有用
-
S4. 高误差特征:选择重点特征分析
-
特征选择:主要是名义变量
- 简单,客户好理解,方便筛选预警
-
分析指标:MAPE、PPE
-
分析模块
-
各特征组的数量/占比(数量少的特征模型难以学习)
-
各特征组的指标情况(找出表现较差的特征组,有高误差风险)
-
各特征组误差分布情况与全市水平对比(tgi)(如果分布显著不同,则针对该特征组进行预警是有效的)
TODO:是不是可以直接做ANOVA test来着
-
-
结果导向
- 试验:去掉不准确的特征,模型是否会更加准确(在有限制的模型下,能否提升准确率)
- 试验:系统性缺失的特征,是否可以加入模型
-
-
S5: 真·误差预警(如最上)
纵观整个误差分析的过程,分为几重境界:
- 数据输入层面:验证数据的准确性(S1)
- 模型特征层面:通过控制、新增特征试图提升模型准确率;基于结果输出创造特征寻求解释
- 已有特征:观察相关性,寻求解释(S2、S3、S4)
- 遗漏特征:查漏(S2、S3、S4)
- 模型结果相关特征:创造基于结果的解释向特征(S5 v2)
- 误差的预测:接受模型准确率难以提升的结局,预测“预测得不准的项目”(S5 v3)
也是被客户一步步逼到了现在呀,不过还是学到了很多东西。