You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确移除异常值并匹配线性回归模型的预测变量与目标样本

如何在移除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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:18:23