Python ValueError求助:用Z-score检测欺诈数据异常值时维度不匹配
解决Z-score计算时的形状不匹配错误
错误原因
你当前的代码直接对整个DataFrame的所有列计算Z-score,核心问题有两个:
- 如果DataFrame包含非数值类型列,
daily_fraud.values会变成object类型数组,scipy的zscore处理时会出现维度异常,导致均值/标准差的形状和原数据不匹配。 - 即使全是数值列,
zscore默认按列计算,返回的是二维数组(行数×列数),而你试图把它赋值给DataFrame的单一列(一维),必然触发形状不匹配的报错。
解决方案
根据你的需求选择对应的处理方式:
1. 针对单一特征计算Z-score(最常用场景)
如果是要检测某一个数值列的异常值,单独指定该列即可:
from scipy.stats import zscore # 替换成你实际要分析的数值列名,比如'交易金额'或'amount' daily_fraud['zscore'] = zscore(daily_fraud['target_column']) anomalies = daily_fraud[daily_fraud['zscore'].abs() > 2]
2. 对所有数值列批量计算并标记异常
如果需要同时检测多列的异常值,先筛选数值列,再逐列计算Z-score,最后标记任意一列超出阈值的行:
import pandas as pd from scipy.stats import zscore # 筛选所有数值类型的列 numeric_columns = daily_fraud.select_dtypes(include=['int64', 'float64']).columns # 计算每列的Z-score z_score_matrix = zscore(daily_fraud[numeric_columns]) # 转换为DataFrame方便后续处理 z_score_df = pd.DataFrame(z_score_matrix, columns=numeric_columns, index=daily_fraud.index) # 筛选任意一列Z值绝对值大于2的异常行 anomalies = daily_fraud[(z_score_df.abs() > 2).any(axis=1)]
3. 处理缺失值导致的形状异常
如果数据中存在缺失值,也可能引发维度问题,先清理缺失值再计算:
# 用均值填充数值列的缺失值(可根据业务场景替换为中位数、0等) daily_fraud_clean = daily_fraud.fillna(daily_fraud.mean(numeric_only=True)) # 再执行Z-score计算 daily_fraud_clean['zscore'] = zscore(daily_fraud_clean['target_column']) anomalies = daily_fraud_clean[daily_fraud_clean['zscore'].abs() > 2]
内容的提问来源于stack exchange,提问作者Léa
相关产品推荐
相关产品推荐

