我一直在尝试通过Python或R找到一种方法,在我拥有的csv文件中,脚本应该遍历每一行,并尝试根据其中一列中的数组值检测异常值或异常值。
据我说,这个问题相当复杂,我已经筋疲力尽,试图通过检测异常或异常值的方法。
对于这样的问题,我应该研究机器学习吗?
已经有一个类似的问题发布了,但没有得到正确的回答(我觉得(,那里给出的数据图像可以用来描述任何合理的答案。
感谢
我想在值列中找到异常值,例如,与单元格中的其他值相比,第一行142中的异常值将是异常值,我想要一些按ID(逐行(排列的东西,并将异常值写入一个新文件,其中所有这些列都在中
下面是让您开始学习的内容。假设我们将异常值定义为与平均值相差超过2个标准差的值,我们可以执行以下操作。在你继续阅读之前,请记住,在有限的数据点上做这样的事情是有风险的,因为你没有观察到足够的数据来知道它是一个异常值!
import numpy as np
import pandas as pd
df = pd.DataFrame({'id':np.arange(1,6),
'lat':np.array([43,44,45,47,48]),
'lon':np.array([16,5,12,13,17]),
'values':[[171,172,142,169,178,180],[27,150,151,162,159,165],
[151,153,152,37],[171.222,127,180,172.56],[np.nan]]
})
我们可以看看df:
id lat lon values
0 1 43 16 [171, 172, 142, 169, 178, 180]
1 2 44 5 [27, 150, 151, 162, 159, 165]
2 3 45 12 [151, 153, 152, 37]
3 4 47 13 [171.222, 127, 180, 172.56]
4 5 48 17 [nan]
我们定义了一个函数,将数据点返回给平均值2sd之外的数据点:
def func(x):
x = np.array(x)
x_mean = np.mean(x)
x_sd = np.std(x)
return(x[abs(x - x_mean)>2*x_sd])
现在我们制作一个新的数据帧:
newdf =df.copy()
newdf['outlier_values'] = newdf['values'].apply(func)
newdf
结果看起来像:
id lat lon values outlier_values
0 1 43 16 [171, 172, 142, 169, 178, 180] [142]
1 2 44 5 [27, 150, 151, 162, 159, 165] [27]
2 3 45 12 [151, 153, 152, 37] []
3 4 47 13 [171.222, 127, 180, 172.56] []
4 5 48 17 [nan] []
也许基于熵的方法可以在这里工作:http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.380.4114&rep=rep1&type=pdf
简而言之,熵是无序的度量。因此,您可以通过计算行熵来"测量"行的无序度。这是一个相对的衡量标准,所以你必须尝试确定什么对你的情况是准确的(这不是一门精确的科学(。
这里有一个例子:
from scipy.stats import entropy
def my_entropy(labels, base = None):
value,counts = np.unique(labels, return_counts=True)
return entropy(counts, base=base)
ls = [ [1,0,1,0,1,0,1,0,1,1,1,1], [1,0,1,0,1,0,1,0,1,1,9,1] , [1,0,1,'A',1,0,1,0,1,1,1,1], [1,0,1,0,5,0,1,0,7,1,0,1] ]
res = []
for labels in ls:
res.append(my_entropy(labels))
print(res)
#[0.6365141682948128, 0.887694275799104, 0.8239592165010823, 1.14370838942625]
res根据混乱程度对列表进行排名。在第一种情况下,我们只有零和一,所以熵是最低的。在其他3个列表中引入的不同异常值显著增加了熵。所以我们可以在这里使用熵作为质量度量。