数据处理过程中,通常需要对数据进行预处理,包括缺失值填充,异常值检测等。异常值处理对于后续数据分析,建模具有非常很重要的影响。
基于描述统计
1.基于常识判断
针对数据进行简单的描述统计,查看数据的极大值和极小值。判断数据是否处于合理的范围。进行数据筛选,筛选掉明显不符范围的数据。
2.基于3倍标准差进行筛选
如果数据整体成正态分布,可以根据常识的3σ原则进行异常值筛选。对于标准正态分布来说,(μ-3σ,μ+3σ)之间的面积为99.730020%。统计学中小概率事件为5%,则可以初略的认为处于数据3σ之外的数据为异常数据。不过在具体场景中还需要具体的讨论。
3.box-cox数据转化+3σ准则
3σ准则假设是数据整体呈正态分布。但是如果数据是有偏数据,则需要转化后再进行筛选,box-cox数据转化在前文已有描述box-cox数据转化。不再赘述。
4.基于四分位进行筛选
我们在进行箱线图描述时,通常都会绘制出上下四分位线以及处于四分位线外的离群点。通常认为位于4分位线外的点为异常值。位于上下四分位外的为异常值。
基于机器学习的异常值检测方法
1.孤立森林算法
对于孤立森林的个人理解。孤立森林算法是基于决策树的算法。在我们的一堆数据中,如果以散点图的形式,可以将每个点进行分类。对于数据中大多数点来说,大多密集的数据区分要达到的树的深度基本都是相近的,而对于异常点,应该是处于密集点之外的离群点,则区分该数据的深度应该是小于平均的树的深度。以下为我个人数据处理的代码
def Anomaly_detect(self):
'''
:param self:
:param datamatrix:
'''
rng = np.random.RandomState(42)
clf = IsolationForest(max_samples=len(self.data.columns), random_state=rng, behaviour="new",contamination='auto')
X_train = np.array(self.data).T
clf.fit(X_train)
y_pred = clf.predict(X_train)
x_left = X_train[y_pred == 1]
x_sample = []
for x in range(len(y_pred)):
if y_pred[x] == 1:
x_sample.append(self.data.columns[x])
self.data = pd.DataFrame(x_left.T,columns = x_sample ,index = self.data.index)
最终结果大致如图
2.one-class svm
未完待续