使用Sklearn做ML时出现RuntimeWarning:除法无效值错误求助
RuntimeWarning 错误原因及解决办法
错误原因
这些RuntimeWarning是StandardScaler计算均值、方差时触发的,核心问题是数据中存在无效值(NaN/inf),或者某列特征所有值完全相同(方差为0),导致除法运算出现无效结果。
解决步骤
第一步:排查并清理无效值
先检查数据里是否有NaN或无穷大值:import numpy as np # 先保留DataFrame格式检查,不要直接转成values temp_df = df_final.drop(['fraud_reported_Y', 'policy_csl', 'policy_bind_date', 'incident_date'], axis=1) print("NaN总数量:", temp_df.isna().sum().sum()) print("Inf总数量:", np.isinf(temp_df).sum().sum())如果存在无效值,用均值/中位数填充,或者删除对应行:
# 用均值填充数值型列的NaN df_final = df_final.fillna(df_final.mean(numeric_only=True)) # 或者直接删除含NaN的行 df_final = df_final.dropna(axis=0)第二步:删除方差为0的特征列
找出所有值完全相同的列(方差为0),这类特征对模型无贡献,还会导致标准化报错:temp_df = df_final.drop(['fraud_reported_Y', 'policy_csl', 'policy_bind_date', 'incident_date'], axis=1) zero_var_cols = temp_df.columns[temp_df.var() == 0].tolist() print("方差为0的特征列:", zero_var_cols) # 删除这些无意义的列 df_final = df_final.drop(zero_var_cols, axis=1)第三步:调整数据处理流程
先完成数据清理,再拆分训练集和测试集,避免测试集出现同样问题;同时测试集标准化时不要重新拟合,复用训练集的均值和方差:# 先执行上面的清理步骤 # ... # 拆分数据集 X = df_final.drop(['fraud_reported_Y', 'policy_csl', 'policy_bind_date', 'incident_date'], axis=1).values y = df_final['fraud_reported_Y'].values X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3) # 标准化操作 sc = StandardScaler() X_train = sc.fit_transform(X_train) X_test = sc.transform(X_test)
内容的提问来源于stack exchange,提问作者Alir Riazi
相关产品推荐
相关产品推荐

