在Pipeline中使用SimpleImputer后仍出现LinearRegression NaN错误
解决方案:加州住房数据集Pipeline训练NaN错误排查
以下是针对你遇到问题的具体排查步骤和解决方法:
1. 修正模型训练方法
你当前使用lin_reg.fit_transform(housing,housing_labels)是错误的,fit_transform方法用于转换数据,训练模型应使用fit方法:
lin_reg.fit(housing, housing_labels)
若需获取预处理后的训练数据,可单独调用预处理步骤的transform方法:
preprocessed_housing = preprocessing.fit_transform(housing)
2. 处理比率计算中的除以0问题
column_ratio函数直接做除法时,若分母列(如total_rooms、households)存在0值,会生成inf(无穷大),后续经StandardScaler标准化会产生NaN。修改函数添加防除0逻辑:
def column_ratio(X): # 添加极小值避免除以0 denominator = X[:, [1]] + 1e-6 return X[:, [0]] / denominator
3. 统一缺失值处理配置
移除SimpleImputer中的missing_values=pd.NA参数,使用默认设置(自动识别np.nan和pd.NA),确保所有缺失值被正确匹配填充:
# 示例:修改ratio_pipeline定义 def ratio_pipeline(): return make_pipeline(SimpleImputer(strategy='median'), FunctionTransformer(column_ratio, feature_names_out=ratio_name), StandardScaler())
4. 确保聚类特征输入无缺失值
尽管latitude和longitude通常无缺失值,仍可将ClusterSimilarity包装进含Imputer的Pipeline,避免潜在缺失值影响:
cluster_pipeline = make_pipeline(SimpleImputer(strategy='median'), ClusterSimilarity(n_clusters=10, gamma=1., random_state=69)) # 替换ColumnTransformer中原cluster_simil的位置 preprocessing=ColumnTransformer([ ("bedrooms_per_room",ratio_pipeline(),["total_bedrooms","total_rooms"]), ("rooms_per_house",ratio_pipeline(),["total_rooms","households"]), ("people_per_house",ratio_pipeline(),["population","households"]), ("log",log_pipeline,["total_bedrooms","total_rooms","population","households","median_income"]), ("coordinates_adjustments",cluster_pipeline,["latitude","longitude"]), ("cat",cat_pipeline,make_column_selector(dtype_include=object)) ],remainder=default_num_pipeline)
5. 验证预处理结果
训练前先检查预处理后的数据是否存在NaN或inf,定位问题源头:
preprocessed_data = preprocessing.fit_transform(housing) print("是否存在NaN:", np.isnan(preprocessed_data).any()) print("是否存在无穷大:", np.isinf(preprocessed_data).any())
内容的提问来源于stack exchange,提问作者Shaurya Agarwal
相关产品推荐
相关产品推荐

