使用Z-score算法分析Kaggle数据时代码返回-inf问题求助
Z-score计算出现-inf问题的排查与解决
在分析数据受欢迎度时,使用Z-score算法计算时遇到代码运行异常,输出的k值为-inf,以下是问题排查和解决方法:
原始代码
for header in data.columns: # average sum = 0 n = 0 crab = 0 for i in data[header]: sum += ele n += 1 average = sum / n # standard Deviation for j in data[header]: crab = np.std(crab) for k in data[header]: k = (k - average) / crab print("k = ",k) break print(data.shape) data.info() data.hist(figsize=(14, 14)) %config InlineBackend.print_figure_kwargs={'facecolor' : "w"}
问题根源
- 变量引用错误:第一个循环中使用
sum += ele,但循环变量是i,未定义的ele会导致报错(若未报错则sum始终为0,均值average为0) - 标准差计算逻辑错误:初始
crab=0,第二个循环中反复对0求标准差,结果始终为0,后续除以0直接导致-inf - 冗余循环逻辑:均值计算无需在循环内反复赋值
average;标准差不需要遍历每个元素重复计算 - Z-score计算不完整:仅处理第一个元素就
break,未覆盖整列数据
修正后的代码
手动计算优化版
import numpy as np for header in data.columns: col_values = data[header].values # 计算均值 average = np.mean(col_values) # 计算样本标准差(ddof=1,若为总体标准差可去掉该参数) std_dev = np.std(col_values, ddof=1) # 处理标准差为0的特殊情况 if std_dev == 0: print(f"列 {header} 所有值相同,无法计算Z-score") continue # 计算整列的Z-score z_scores = (col_values - average) / std_dev print(f"列 {header} 的Z-score示例: {z_scores[:5]}") # 后续数据探索代码保持不变 print(data.shape) data.info() data.hist(figsize=(14, 14)) %config InlineBackend.print_figure_kwargs={'facecolor' : "w"}
Pandas简洁版
直接利用Pandas内置函数批量计算,效率更高:
# 批量计算所有列的Z-score z_score_df = (data - data.mean()) / data.std(ddof=1) print(z_score_df.head()) # 后续数据探索代码保持不变 print(data.shape) data.info() data.hist(figsize=(14, 14)) %config InlineBackend.print_figure_kwargs={'facecolor' : "w"}
关键修正说明
- 用Numpy/Pandas内置的
mean()和std()函数替代手动循环,避免逻辑错误 - 增加标准差为0的判断,防止除以0的异常
- 一次性计算整列的Z-score,保证数据处理的完整性
内容的提问来源于stack exchange,提问作者Mark Jacobs
相关产品推荐
相关产品推荐

