异常检测是指识别出与正常状态不同的数据点。这些异常可能因多种因素而产生,例如,肿瘤的形成可能是由于某些疾病,如癌症,导致细胞无限制地增长。在汽车行业,特定车型或其他交通工具的销售量异常高或低,也是数据中的异常。异常本质上是数据中的离群值。
在处理此类数据时,必须分析并检测这些异常,以便更容易进行治疗和了解应采取的行动。例如,当汽车行业的销售数据出现异常时,无论是高还是低,都需要识别出来。异常检测的方法包括数据可视化、统计方法和机器学习算法。
使用数据可视化工具,如seaborn、matplotlib、plotly或商业软件如tableau、PowerBI、Qlik Sense、Excel等,可以帮助理解数据及其在数据中的分布,特别是通过箱线图、小提琴图和散点图来识别异常。
在存在异常值的情况下,平均值可能无法给出正确的中间值。中位数比平均值更能准确反映数据的中心位置,因为中位数是将数据值排序后找到中间位置,而平均值则是简单地对数据值求平均。要找到数据右侧和左侧的异常值,可以使用Q3+1.5(IQR)和Q1-1.5(IQR)。此外,通过找到数据的最大值、最小值和中位数,可以判断数据中是否存在异常。
使用无监督算法进行异常检测的优势在于,可以同时为数据中的多个变量或特征检测异常,而不是单独为每个变量进行检测。这可以是单变量异常检测和多变量异常检测。
孤立森林是一种无监督技术,用于在没有标签或真实值的情况下检测异常。它是一种基于树的模型,与决策树的构建方式不同。孤立森林与决策树的主要区别在于,决策树是监督学习算法,而孤立森林是无监督学习算法。
from sklearn.ensemble import IsolationForest
isolation_forest = IsolationForest(n_estimators=1000, contamination=0.08)
isolation_forest.fit(df['Rate'].values.reshape(-1, 1))
df['anomaly_score_rate'] = isolation_forest.decision_function(df['rate'].values.reshape(-1, 1))
df['outlier_univariate_rate'] = isolation_forest.predict(df['rate'].values.reshape(-1, 1))
在孤立森林算法中,contamination参数在检测更多异常时起着重要作用。Contamination是给算法的值的百分比,表示数据中存在多少百分比的异常。例如,当给出0.10作为contamination值时,算法会认为数据中有10%的异常。通过找到最佳的contamination值,将能够以良好的数量检测异常。
当想要进行多变量异常检测时,必须首先对数据值进行归一化,以便算法可以给出正确的预测。在处理连续值时,归一化或标准化是必不可少的。
minmax = MinMaxScaler(feature_range=(0, 1))
X = minmax.fit_transform(df[['rate','scores']])
clf = IsolationForest(n_estimators=100, contamination=0.01, random_state=0)
clf.fit(X)
df['multivariate_anomaly_score'] = clf.decision_function(X)
df['multivariate_outlier'] = clf.predict(X)
局部异常因子也是一种无监督算法,它不是基于树的,而是基于密度的算法,如KNN、Kmeans。当任何数据点被视为异常值时,取决于其局部邻域,它就是局部异常值。LOF将根据邻居的密度识别异常值。当数据点的密度在整个数据集中不恒定时,LOF表现良好。
minmax = MinMaxScaler(feature_range=(0, 1))
X = minmax.fit_transform(df[['rate','scores']])
# Novelty detection
clf = LocalOutlierFactor(n_neighbors=100, contamination=0.01,novelty=True) #when novelty = True
clf.fit(X_train)
df['multivariate_anomaly_score'] = clf.decision_function(X_test)
df['multivariate_outlier'] = clf.predict(X_test)
# Outlier detection
local_outlier_factor_multi=LocalOutlierFactor(n_neighbors=15,contamination=0.20,n_jobs=-1) # when novelty = False
multi_pred=local_outlier_factor_multi.fit_predict(X)
df1['Multivariate_pred']=multi_pred
from sklearn.svm import OneClassSVM
pred=clf.predict(X)
anomaly_score=clf.score_samples(X)
clf = OneClassSVM(gamma='auto',nu=0.04,gamma=0.0004).fit(X)
from sklearn.covariance import EllipticEnvelope
model1 = EllipticEnvelope(contamination = 0.1) # fit model
model1.fit(X_train)
model1.predict(X_test)