【python】pandas数据清洗(四):使用回归分析预测异常值

使用回归分析预测异常值是一种高级的数据清洗技术,它利用了数据之间的关系来估计并修正异常值。当数据集中存在异常值时,这些值可能是因为记录错误、测量误差或是数据收集过程中的其他问题。回归分析可以帮助我们理解变量之间的关系,并预测给定一系列输入(自变量)时的输出(因变量)的期望值。这种方法特别适用于数值型数据,其中自变量和因变量之间存在着某种相关性。

回归方法概述

回归分析是一种统计方法,用于确定一个或多个自变量(X)与一个因变量(Y)之间的关系。在回归模型中,我们试图找到一个函数f,使得对于给定的自变量X,f(X)能够尽可能准确地预测因变量Y的值。回归方法包括但不限于线性回归、多项式回归、岭回归、Lasso回归和Elastic Net回归等。

使用回归预测异常值的步骤

  1. 模型建立:首先,使用没有异常值的数据点构建回归模型。这通常意味着在初步数据清洗后,移除已知的异常值,然后基于剩余数据训练回归模型。

  2. 异常值识别:通过残差分析、Cook’s距离、DFFITS等统计指标来识别潜在的异常值。残差是实际观测值与模型预测值之间的差异。异常值往往表现为较大的正或负残差。

  3. 预测修正:对于识别出的异常值,可以使用回归模型来预测这些点的合理值。这通常涉及到将异常值的自变量输入回归模型,得到预测的因变量值。

  4. 替代异常值:将异常值替换为预测值。这样,异常值就被更符合数据模式的值所替代,从而减少了异常值对后续分析的影响。

  5. 模型验证:使用交叉验证、训练/测试集分割等方法来评估模型的性能和泛化能力。确保模型在未知数据上也能表现良好。

  6. 迭代改进:重复上述过程,直到数据集中的异常值被充分处理,或模型的性能达到满意的水平。

实施细节

  • 在实际应用中,可能需要尝试多种类型的回归模型,以找到最适合数据集的模型类型。
  • 可能还需要考虑多重共线性的问题,即自变量之间存在的相关性,这可能会影响模型的稳定性和预测准确性。
  • 使用更复杂的模型,如随机森林或神经网络,也可能用于预测异常值,尤其是在非线性关系或高维数据中。

代码示例

步骤一:准备数据和环境

首先,我们需要创建一个数据集,这里我们将生成一些线性相关的数据,并人为加入一些异常值。

import numpy as np
import pandas as pd
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt

# 设置随机种子以确保结果可复现
np.random.seed(42)

# 创建数据集
X = np.linspace(0, 10, 100).reshape(-1, 1)
y = 2 * X.squeeze() + 5 + np.random.randn(100) * 2  # y = 2x + 5 + noise

# 添加异常值
y[50] = 100  # 异常值1
y[75] = -100  # 异常值2

# 将数据转换为DataFrame
df = pd.DataFrame({'X': X.squeeze(), 'y': y})
步骤二:构建回归模型

接下来,我们将使用线性回归模型拟合数据,但在此之前,我们需要将异常值从数据中移除。

# 移除异常值
Q1 = df['y'].quantile(0.25)
Q3 = df['y'].quantile(0.75)
IQR = Q3 - Q1
df_clean = df[~((df['y'] < (Q1 - 1.5 * IQR)) | (df['y'] > (Q3 + 1.5 * IQR)))]

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(df_clean['X'].values.reshape(-1, 1), df_clean['y'], test_size=0.2, random_state=42)

# 构建线性回归模型
model = LinearRegression()
model.fit(X_train, y_train)
步骤三:预测并修正异常值

使用训练好的模型预测异常值的合理值,并将其替换回原始数据集中。

# 预测异常值
predicted_y = model.predict(df.loc[df['y'] == 100, 'X'].values.reshape(-1, 1))
df.loc[df['y'] == 100, 'y'] = predicted_y

predicted_y = model.predict(df.loc[df['y'] == -100, 'X'].values.reshape(-1, 1))
df.loc[df['y'] == -100, 'y'] = predicted_y
步骤四:可视化结果
# 绘制原始数据和修正后的数据
plt.scatter(df['X'], df['y'], label='Corrected Data', color='blue')
plt.plot(X_train, model.predict(X_train), color='red', linewidth=2, label='Regression Line')
plt.scatter(df_clean['X'], df_clean['y'], label='Clean Data', color='green', alpha=0.5)
plt.legend()
plt.title('Data with Corrected Outliers')
plt.xlabel('X')
plt.ylabel('y')
plt.show()

完整代码

import numpy as np
import pandas as pd
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt

np.random.seed(42)

X = np.linspace(0, 10, 100).reshape(-1, 1)
y = 2 * X.squeeze() + 5 + np.random.randn(100) * 2
y[50] = 100
y[75] = -100

df = pd.DataFrame({'X': X.squeeze(), 'y': y})

Q1 = df['y'].quantile(0.25)
Q3 = df['y'].quantile(0.75)
IQR = Q3 - Q1
df_clean = df[~((df['y'] < (Q1 - 1.5 * IQR)) | (df['y'] > (Q3 + 1.5 * IQR)))]

X_train, X_test, y_train, y_test = train_test_split(df_clean['X'].values.reshape(-1, 1), df_clean['y'], test_size=0.2, random_state=42)

model = LinearRegression()
model.fit(X_train, y_train)

predicted_y = model.predict(df.loc[df['y'] == 100, 'X'].values.reshape(-1, 1))
df.loc[df['y'] == 100, 'y'] = predicted_y

predicted_y = model.predict(df.loc[df['y'] == -100, 'X'].values.reshape(-1, 1))
df.loc[df['y'] == -100, 'y'] = predicted_y

plt.scatter(df['X'], df['y'], label='Corrected Data', color='blue')
plt.plot(X_train, model.predict(X_train), color='red', linewidth=2, label='Regression Line')
plt.scatter(df_clean['X'], df_clean['y'], label='Clean Data', color='green', alpha=0.5)
plt.legend()
plt.title('Data with Corrected Outliers')
plt.xlabel('X')
plt.ylabel('y')
plt.show()

这段代码演示了如何使用线性回归模型预测并修正异常值,同时提供了数据可视化,以便直观地观察异常值处理前后的变化。这种方法适用于数据点之间存在明确线性关系的情况。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值