Как обновить обученную модель IsolationForest новыми наборами данных/фермами данных в python?
скажем, я подхожуIsolationForest()
алгоритм от scikit-learn на основе временных рядов Dataset1 или dataframe1
df1
и сохраните модель, используя методы, упомянутые здесь и здесь . Теперь я хочу обновить свою модель для нового набора данных2 или
df2
.
Мои выводы:
- этот обходной путь для добавочного обучения от sklearn:
... постепенное обучение на мини-партии экземпляров (иногда называемое «онлайн-обучением») является ключом к дополнительному обучению, поскольку гарантирует, что в любой момент времени в основной базе будет лишь небольшое количество экземпляров. Память. Выбор хорошего размера для мини-пакета, который уравновешивает релевантность и объем памяти, может потребовать настройки.
но, к сожалению, алгоритм IF не поддерживает
estimator.partial_fit(newdf)
- автоматический поиск предложений
refit()
также не подходит для моего случая, основанного на этом посте .
Как я могу обновить обученную на наборе данных1 и сохраненную модель IF с помощью нового набора данных2?
1 ответ
Вы можете просто повторно использовать вызов , доступный оценщику , для новых данных.
Это было бы предпочтительнее, особенно во временных рядах, поскольку сигнал меняется, и вы не хотите, чтобы старые, нерепрезентативные данные воспринимались как потенциально нормальные (или аномальные).
Если старые данные важны, вы можете просто объединить старые данные обучения и новые данные входного сигнала вместе, а затем вызвать
.fit()
опять таки.
Кроме того, в соответствии с документацией sklearn лучше использоватьjoblib
чем
pickle
MRE с ресурсами ниже:
# Model
from sklearn.ensemble import IsolationForest
# Saving file
import joblib
# Data
import numpy as np
# Create a new model
model = IsolationForest()
# Generate some old data
df1 = np.random.randint(1,100,(100,10))
# Train the model
model.fit(df1)
# Save it off
joblib.dump(model, 'isf_model.joblib')
# Load the model
model = joblib.load('isf_model.joblib')
# Generate new data
df2 = np.random.randint(1,500,(1000,10))
# If the original data is now not important, I can just call .fit() again.
# If you are using time-series based data, this is preferred, as older data may not be representative of the current state
model.fit(df2)
# If the original data is important, I can simply join the old data to new data. There are multiple options for this:
# Pandas: https://pandas.pydata.org/pandas-docs/stable/user_guide/merging.html
# Numpy: https://numpy.org/doc/stable/reference/generated/numpy.concatenate.html
combined_data = np.concatenate((df1, df2))
model.fit(combined_data)