zscore不能直接作用于整张DataFrame,需先筛选数值列再逐列计算;IQR适用于偏态数据,通过分位数确定边界;IsolationForest可检测多维组合异常,但需处理缺失值并合理设置contamination参数。

zscore 不能直接扔进整张 DataFrame,否则会报 TypeError: ufunc 'isfinite' not supported for the input types —— 这是最常卡住新手的第一步。
用 scipy.stats.zscore 处理单变量正态数据
它快、轻、适合批量数值列,但只对近似正态分布有效。非数值列(如 'user_id'、'category')必须提前筛掉,否则直接崩。
- 先用
df.select_dtypes(include=['number'])拿出纯数字列 - 对每列单独调用
zscore(),别传整个DataFrame - 阈值设为
3是经验起点,业务敏感时可试2.5或3.5 - 用
np.abs(z_scores) > 3得布尔矩阵,再用.any(axis=1)标记含任一异常的整行
用 pd.Series.quantile 做 IQR 箱线图式过滤
当数据明显偏态(比如订单金额、点击次数)或有重尾,zscore 会把合理高值也干掉,这时 IQR 更稳——它不依赖均值和标准差,只靠中位数和分位数。
图片提示词生成器?不止如此。 马甲系统 —— 把脑海中的画面,翻译成AI能理解的专业表达。 用得越多,它越懂你:首次需要多问几句确认方向,用久了几乎一说就懂。 用得越多,它越快:缓存机制让后续对话越来越省。 RAG进化:成功案例持续入库,越跑越聪明。 输入「新手指南」查看完整功能介绍
- 对每列分别算
Q1 = col.quantile(0.25)、Q3 = col.quantile(0.75) -
IQR = Q3 - Q1,边界是Q1 - 1.5 * IQR和Q3 + 1.5 * IQR - 系数
1.5不是魔法数字:改成2会放过更多离群点,3几乎不删,得结合业务容忍度调 - 注意:
quantile()对含NaN的列默认跳过,但若列全NaN会返回nan,后续计算可能出错
用 IsolationForest 捕捉多维组合异常
单看每列都“正常”,但合起来就诡异(比如“低收入 + 高频奢侈品消费”),zscore 和 IQR 都无能为力。这时候必须上模型。
立即学习“Python免费学习笔记(深入)”;
- 只喂数值列,且必须先处理缺失值:
df.dropna()或用SimpleImputer填充 -
contamination参数很关键:设'auto'有时严重低估异常比例;建议按历史经验设成0.05(5%)之类的具体值 -
n_estimators=100是较稳起点;200以上提升有限,但训练变慢 -
fit_predict()返回1(正常)和-1(异常),不是0/1,别用错逻辑判断
为什么不能只信一种方法?
没有银弹。Z-score 在长尾分布里漏检严重;IQR 对高维相关异常完全失效;IsolationForest 在小样本(

















