通过删除异常值来改进 R2-python

Posted

技术标签:

【中文标题】通过删除异常值来改进 R2-python【英文标题】:Improve R2 by removing outliers-python 【发布时间】:2019-02-28 09:14:42 【问题描述】:

我正在使用以下代码查找Linregress参数:

import numpy, scipy,pandas as pd
from scipy.optimize import curve_fit
from scipy.stats import linregress
import scipy.stats
import copy
df=pd.read_excel("S:/Python/Excel.xlsx")
df.head();
xyDataPairs = df[['x', 'y']].values.tolist();
df.groupby('Test Event',as_index=True)['x', 'y'].apply(linregress)
res= df.groupby('Test Event',as_index=True)['x', 'y'].apply(linregress);
print(res)
res.to_excel('result.xlsx')

由此我得到所有 linregress 参数(斜率、截距、R2、pvalue 和 stderror)

#

我的挑战从这里开始:

我需要使用 Python 从数据集中删除异常值,以提高 R2(这将导致斜率发生相应的变化)。删除异常值后,我需要计算每个序列修改后的线性回归参数(斜率、截距、R2、pvalue 和 std 误差)。

假设未移除异常值时,R2=0.721,但移除异常值时,结果 R2 为 0.852

数据表如下:

我每个序列(A、B 和 C)有 10 个数据点,需要删除每个序列中存在的异常值。异常值在数据集中以“黄色”突出显示。我还给出了去除异常值的输出数据。

当我们移除这些异常值时,R2、斜率、截距等会发生变化。

我该如何使用 Python 来做这件事?非常感谢您对此提供任何帮助。


我在 Crossvalidate 中询问过,有人建议我使用稳健的回归方法进行此类分析。

我应该使用哪些 Python 库/包来回答这个问题?

【问题讨论】:

你的问题是 1) 你如何识别异常值,它更适合 CrossValidated,或者 2) 鉴于你对异常值的定义,一个子集如何是 DataFrame,它如果您提供minimal reproducible example,可以在这里回答? @ALollz,对我来说,异常值是 R2 值变化超过 15%。如果您认为这个问题更适合 Crossvalidated,我会在那里问。 我是 python 的新手,没有任何代码可以使用。 这是一个有点难以实现的定义。查看您的数据,我会将这些值归类为“错误”,而不是异常值。您预计数据中有一些异常值,但考虑到其他值的分布,这 4 个是完全错误的。这些不正确的值会严重扭曲您的平均值和标准偏差,因此您可以使用中值绝对偏差,它对这种错误更稳健。任何合理的门槛都会抓住他们。 嗨,ALollz,感谢您的回复,这些值被夸大了。但是,这些值也可以更接近其他数据集。因此,只要 R2 变化 15%,就需要删除。 【参考方案1】:

假设你知道你想要将异常值称为“临界值”的值。

cutoff = 100 # this is your arbitrary outlier cutoff
df = df[df[y] < cutoff] 

这应该会从数据集中删除所有异常值。

【讨论】:

问题是没有截止。因而不能使用截断法。感谢您的回复!

以上是关于通过删除异常值来改进 R2-python的主要内容,如果未能解决你的问题,请参考以下文章

java异常处理机制详解

Java基础10:全面解读Java异常

java基础学习——20异常处理

如何为管道中的异常值删除实现 Python 自定义类?

如何评估无监督异常检测

有啥方法可以减少 Radius 异常值删除 [pcl 异常值删除] 的执行时间?