通过删除异常值来改进 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的主要内容,如果未能解决你的问题,请参考以下文章