# train oneclassSVM
model = OneClassSVM(nu=outliers_fraction, kernel="rbf", gamma=0.01)
model.fit(data)
df['anomaly3'] = pd.Series(model.predict(data))
fig, ax = plt.subplots(figsize=(10,6))
a = df.loc[df['anomaly3'] == -1, ['date_time_int', 'price_usd']] #anomaly
ax.plot(df['date_time_int'], df['price_usd'], color='blue')
ax.scatter(a['date_time_int'],a['price_usd'], color='red')
plt.show();
基于高斯分布的异常检测
高斯分布也称为正态分布。我们将使用高斯分布来开发异常检测算法,也就是说,假设我们的数据是正态分布的。这个假设不能适用于所有的数据集,但是当它成立时,却提供了一种有效的方法来发现异常值。
Scikit-Learn的covariance.EllipticEnvelope是一个函数,它通过假设我们的整个数据集满足多元高斯分布,从而计算数据集一般分布的关键参数。过程如下:
根据前面定义的类别创建两个不同的数据集:search_Sat_night,Search_Non_Sat_night。 对每个类别相应的数据集应用EllipticEnvelope(高斯分布)。 设置contamination参数,即我们数据集中异常值的比例。 我们使用decision_function来计算给定观察点的决策函数。它等于移位的Mahalanobis 距离。异常值的阈值为0,确保了与其他异常值检测算法的兼容性。 predict(X_train) 根据拟合模型来预测X_train的标签(1表示正常,-1表示异常)。df_class0 = df.loc[df['srch_saturday_night_bool'] == 0, 'price_usd']
df_class1 = df.loc[df['srch_saturday_night_bool'] == 1, 'price_usd']
fig, axs = plt.subplots(1,2)
df_class0.hist(ax=axs[0], bins=30)
df_class1.hist(ax=axs[1], bins=30);
envelope = EllipticEnvelope(contamination = outliers_fraction)
X_train = df_class0.values.reshape(-1,1)
envelope.fit(X_train)
df_class0 = pd.DataFrame(df_class0)
df_class0['deviation'] = envelope.decision_function(X_train)
df_class0['anomaly'] = envelope.predict(X_train)
envelope = EllipticEnvelope(contamination = outliers_fraction)
X_train = df_class1.values.reshape(-1,1)
envelope.fit(X_train)
df_class1 = pd.DataFrame(df_class1)
df_class1['deviation'] = envelope.decision_function(X_train)
df_class1['anomaly'] = envelope.predict(X_train)
# plot the price repartition by categories with anomalies
a0 = df_class0.loc[df_class0['anomaly'] == 1, 'price_usd']
b0 = df_class0.loc[df_class0['anomaly'] == -1, 'price_usd']
a2 = df_class1.loc[df_class1['anomaly'] == 1, 'price_usd']
b2 = df_class1.loc[df_class1['anomaly'] == -1, 'price_usd']