Ниже мой код, он принимает диапазон от числа, создает новый столбец метка , который содержит -1
или 1
.
В случае, если число выше чем 14000
, мы помечаем его как -1 (выброс). Если число меньше 14000
, мы помечаем его как 1 (нормальное)
## Here I just import all the libraries and import the column with my dataset
## Yes, I am trying to find anomalies using only the data from one column
df['label'] = [-1 if x >= 14000 else 1 for x in df['data_numbers']] #What I explained above
data = df.drop('label',axis=1)
target = df['label']
outliers = df[df['label']==-1]
outliers = outliers.drop('label',axis=1)
from sklearn.model_selection import train_test_split
train_data, test_data, train_target, test_target = train_test_split(data, target, train_size = 0.8)
train_data.shape
nu = outliers.shape[0] / target.shape[0]
print("nu", nu)
model = svm.OneClassSVM(nu=nu, kernel='rbf', gamma=0.00005)
model.fit(train_data)
from sklearn import metrics
preds = model.predict(train_data)
targs = train_target
print("accuracy: ", metrics.accuracy_score(targs, preds))
print("precision: ", metrics.precision_score(targs, preds))
print("recall: ", metrics.recall_score(targs, preds))
print("f1: ", metrics.f1_score(targs, preds))
print("area under curve (auc): ", metrics.roc_auc_score(targs, preds))
train_preds = preds
preds = model.predict(test_data)
targs = test_target
print("accuracy: ", metrics.accuracy_score(targs, preds))
print("precision: ", metrics.precision_score(targs, preds))
print("recall: ", metrics.recall_score(targs, preds))
print("f1: ", metrics.f1_score(targs, preds))
print("area under curve (auc): ", metrics.roc_auc_score(targs, preds))
test_preds = preds
from mlxtend.plotting import plot_decision_regions # as rbf svm is used hence lot's of decision boundaries are drawn unlike one in linear SVM
# the top one central points with blue quares are outlietrs while at the bottom they are orangy triangles(normal values)
plot_decision_regions(np.array(train_data), np.array(train_target), model)
plt.show()
В моем графике слишком много линий разделения, я думал, что получу только одну, которая будет отличать выбросы от нормальных данных.