|
|
|
import pickle
|
|
|
|
from tsfresh.transformers.feature_selector import FeatureSelector
|
|
|
|
from sklearn.preprocessing import MinMaxScaler
|
|
|
|
from sklearn.ensemble import IsolationForest
|
|
|
|
import pandas as pd
|
|
|
|
|
|
|
|
from sklearn import svm
|
|
|
|
|
|
|
|
|
|
|
|
class supervised_algorithm(object):
|
|
|
|
frame_size = 16
|
|
|
|
good_features = [
|
|
|
|
#"value__agg_linear_trend__f_agg_\"max\"__chunk_len_5__attr_\"intercept\"",
|
|
|
|
# "value__cwt_coefficients__widths_(2, 5, 10, 20)__coeff_12__w_20",
|
|
|
|
# "value__cwt_coefficients__widths_(2, 5, 10, 20)__coeff_13__w_5",
|
|
|
|
# "value__cwt_coefficients__widths_(2, 5, 10, 20)__coeff_2__w_10",
|
|
|
|
# "value__cwt_coefficients__widths_(2, 5, 10, 20)__coeff_2__w_20",
|
|
|
|
# "value__cwt_coefficients__widths_(2, 5, 10, 20)__coeff_8__w_20",
|
|
|
|
# "value__fft_coefficient__coeff_3__attr_\"abs\"",
|
|
|
|
"time_of_day_column_x",
|
|
|
|
"time_of_day_column_y",
|
|
|
|
"value__abs_energy",
|
|
|
|
# "value__absolute_sum_of_changes",
|
|
|
|
# "value__sum_of_reoccurring_data_points",
|
|
|
|
]
|
|
|
|
clf = None
|
|
|
|
scaler = None
|
|
|
|
|
|
|
|
def __init__(self):
|
|
|
|
self.features = []
|
|
|
|
self.col_to_max, self.col_to_min, self.col_to_median = None, None, None
|
|
|
|
self.augmented_path = None
|
|
|
|
|
|
|
|
async def fit(self, dataset, contamination=0.005):
|
|
|
|
dataset = dataset[self.good_features]
|
|
|
|
dataset = dataset[-100000:]
|
|
|
|
|
|
|
|
self.scaler = MinMaxScaler(feature_range=(-1, 1))
|
|
|
|
# self.clf = svm.OneClassSVM(nu=contamination, kernel="rbf", gamma=0.1)
|
|
|
|
self.clf = IsolationForest(contamination=contamination)
|
|
|
|
|
|
|
|
self.scaler.fit(dataset)
|
|
|
|
|
|
|
|
dataset = self.scaler.transform(dataset)
|
|
|
|
self.clf.fit(dataset)
|
|
|
|
|
|
|
|
async def predict(self, dataframe):
|
|
|
|
dataset = dataframe[self.good_features]
|
|
|
|
dataset = self.scaler.transform(dataset)
|
|
|
|
prediction = self.clf.predict(dataset)
|
|
|
|
|
|
|
|
# for i in range(len(dataset)):
|
|
|
|
# print(str(dataset[i]) + " " + str(prediction[i]))
|
|
|
|
|
|
|
|
prediction = [x < 0.0 for x in prediction]
|
|
|
|
return pd.Series(prediction, index=dataframe.index)
|
|
|
|
|
|
|
|
def save(self, model_filename):
|
|
|
|
with open(model_filename, 'wb') as file:
|
|
|
|
pickle.dump((self.clf, self.scaler), file)
|
|
|
|
|
|
|
|
def load(self, model_filename):
|
|
|
|
with open(model_filename, 'rb') as file:
|
|
|
|
self.clf, self.scaler = pickle.load(file)
|
|
|
|
|
|
|
|
def __select_features(self, x, y):
|
|
|
|
# feature_selector = FeatureSelector()
|
|
|
|
feature_selector = FeatureSelector()
|
|
|
|
|
|
|
|
feature_selector.fit(x, y)
|
|
|
|
return feature_selector.relevant_features
|