我习惯于使用sklearn
,我发现它的文档很容易理解。然而,我现在需要学习使用OpenCV
——特别是,我需要能够使用MLP分类器,并在新的训练数据到来时更新其权重
在sklearn中,这可以使用partial_fit
方法来完成。根据OpenCV文档,有一个UPDATE_WEIGHTS
标志可以设置,但我不知道如何将其包含在代码中。
以下是我迄今为止的MCVE:
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.metrics import roc_auc_score
import numpy as np
import cv2
from sklearn.neural_network import MLPClassifier
def softmax(x):
softmaxes = np.zeros(x.shape)
for i in range(x.shape[1]):
softmaxes[:, i] = np.exp(x)[:, i]/np.sum(np.exp(x), axis=1)
return softmaxes
data = load_breast_cancer()
X = data.data
y = data.target.reshape(-1, 1)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=1729)
y2 = np.zeros((y_train.shape[0], 2))
y2[:,0] = np.where(y_train==0, 1, 0)
y2[:,1] = np.where(y_train==1, 1, 0)
ann = cv2.ml.ANN_MLP_create()
ann.setLayerSizes(np.array([X.shape[1], y2.shape[1]]))
ann.setActivationFunction(cv2.ml.ANN_MLP_SIGMOID_SYM)
ann.train(np.float32(X_train), cv2.ml.ROW_SAMPLE, np.float32(y2))
mlp = MLPClassifier()
mlp.fit(X_train, y_train)
preds_proba = softmax(ann.predict(np.float32(X_test))[1])
print(roc_auc_score(y_test, preds_proba[:,1]))
print(roc_auc_score(y_test, mlp.predict_proba(X_test)[:,1]))
由于OpenCV分类器和sklearn学习分类器之间的分数是可比较的,我非常有信心它得到了正确的实现。
我如何修改此代码,以便在新的训练样本出现时,我可以仅基于该样本更新权重,而不是对整个训练集进行重新训练?
sklearn
中的等效值为:mlp.partial_fit(X_new_sample, y_new_sample)
。
找到了答案。语法如下:
ann.train(cv2.ml.TrainData_create(np.float32(X), 0, np.float32(y)), flags=1)