背景
- 模型自动更新策略介绍
- 一种是定时任务,凌晨执行,该策略缺点是当天不能实时更新模型参数。
- 还有一种是实时更新,为不影响使用,要使用多线程,而在模型预测进行中发生模型更新,会导致报错(即使模型更新那一刻很短),因此还要加上线程锁。
- 更新方式有全量更新,另外貌似还有小批迭代式更新,本文是全量更新方式。
多线程+线程锁 实现 机器学习模型在线更新 极简模板
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression
from threading import Thread, Lock
from time import sleep
class DataBase:
X = ['good perfect', 'horrible']
Y = ['好', '差']
@classmethod
def load_xy(cls):
"""从数据库读取带标签语料"""
return cls.X, cls.Y
@classmethod
def update_xy(cls, x, y):
cls.X.append(x)
cls.Y.append(y)
class Model:
def __init__(self):
self.vec, self.clf = None, None
self.lock = Lock()
self.fit()
self.updating()
def fit(self):
"""模型参数更新"""
vec = TfidfVectorizer()
clf = LogisticRegression()
x, y = DataBase.load_xy()
clf.fit(vec.fit_transform(x), y)
with self.lock:
self.vec, self.clf = vec, clf
print('\033[93m{}\033[0m'.format(self.fit.__doc__))
def crontab(self, interval=60):
"""定时任务:更新模型参数"""
while True:
sleep(interval)
self.fit()
def updating(self):
"""多线程更新模型参数"""
Thread(target=self.crontab).start()
def predict(self, text):
"""单个文本分类"""
with self.lock:
x = self.vec.transform([text])
return self.clf.predict(x)[0]
if __name__ == '__main__':
model = Model()
while True:
t = input('数据待预测文本:').strip()
p = model.predict(t)
print('预测结果:%s' % p)
if input('输入y以示预测正确:').strip() != 'y':
p = {'好': '差', '差': '好'}[p]
DataBase.update_xy(t, p)
