如何正确移除异常值并匹配线性回归模型的预测变量与目标样本
如何在移除Price异常值时保持特征与目标变量样本一致?
嘿,这个问题我之前也碰到过——单独抽离目标变量过滤异常值,肯定会丢掉对应的特征行,导致X和Y的样本数对不上。问题出在你当前的reject_outliers函数只返回了过滤后的Price数值,完全没管这些数值在原始数据里对应的是哪一行,自然没法和特征数据同步。
给你两个简单有效的解决思路:
思路1:直接过滤整个数据集(推荐)
修改异常值过滤函数,让它接收完整的DataFrame,基于Price列的条件返回过滤后的整行数据,这样特征和目标变量天然就对齐了。
修改后的代码示例:
import numpy as np import pandas as pd def reject_outliers_df(df, column='Price', z_threshold=2): # 计算目标列的均值和标准差 col_mean = np.mean(df[column]) col_std = np.std(df[column]) # 生成布尔掩码,标记所有符合范围的行 valid_rows = (df[column] > col_mean - z_threshold * col_std) & \ (df[column] < col_mean + z_threshold * col_std) # 返回过滤后的完整数据集 return df[valid_rows] # 用这个函数处理你的原始数据 data_filtered = reject_outliers_df(data) # 现在提取特征和目标变量,样本数绝对一致 features = data_filtered[['SqrMeters', 'Rooms']] target = data_filtered['Price'] X = features Y = target # 验证一下,输出的两个数字应该相等 print(f"特征样本数:{len(X)},目标变量样本数:{len(Y)}")
思路2:保留过滤掩码同步过滤
如果你不想改动原来的reject_outliers函数,可以调整它返回布尔掩码,再用这个掩码同时过滤特征和目标变量:
import numpy as np import pandas as pd def get_outlier_mask(data_series, z_threshold=2): u = np.mean(data_series) s = np.std(data_series) # 返回布尔掩码,True表示该行数据有效 return (data_series > u - z_threshold * s) & (data_series < u + z_threshold * s) # 获取Price列的有效行掩码 valid_mask = get_outlier_mask(data['Price']) # 用掩码同步过滤整个数据集 features = data[valid_mask][['SqrMeters', 'Rooms']] target = data[valid_mask]['Price'] X = features Y = target
额外小提示
用均值±2倍标准差的方法适合近似正态分布的数据,如果你的Price字段分布偏态很严重(比如大部分房价集中在中低区间,少数极高价),可以考虑用**四分位数间距(IQR)**的方法过滤异常值,避免误删正常的长尾数据。
内容的提问来源于stack exchange,提问作者krakowi
相关产品推荐
相关产品推荐

