有没有办法扩展最初传递给 SVC 的训练集?

Posted

技术标签:

【中文标题】有没有办法扩展最初传递给 SVC 的训练集?【英文标题】:Is there a way to extend the training set initially passed to a SVC? 【发布时间】:2020-10-22 08:21:03 【问题描述】:

我想在 Python 中模拟主动学习。我有一个初始训练集和一个未标记的潜在训练数据池。现在,我想迭代地选择池中的一个元素,将其添加到传递给 SVC 的训练集中,并使用新集合重新训练 SVC。 我不确定如何正确地做到这一点。我可以做(伪代码):

for i in range(100):
    linearSVC = svm.SVC(kernel='linear', probability=True)
    linearSVC.fit(X_train, y_train)
    addElementToXtrainSetAndYtrainSet()

或者:

linearSVC = svm.SVC(kernel='linear', probability=True)
for i in range(100):
    linearSVC.fit(X_train, y_train)
    addElementToXtrainSetAndYtrainSet()

第一个肯定对我有用。每次迭代都会使用迭代扩大的训练数据来训练一个新的 SVC。但是一遍又一遍地重新初始化 SVC 感觉不对。 关于第二种方法,我不确定 SVC 是从头开始重新训练,还是在之前的迭代中保持其状态并在此状态之上重新训练。我不要那个。如果是这种情况,我认为可以选择随后将一个元素添加到旧状态而不再次传递整个训练数据。但我也不知道 .fit 在幕后的行为,我也找不到这样的选择。有没有“好”的方法来解决我的问题?

【问题讨论】:

【参考方案1】:

你想要完成的基本上是随机梯度下降的原理。因此,我建议使用scikit-learnSGDClassifier。从其文档中:

此估计器使用随机梯度下降 (SGD) 学习实现正则化线性模型:每次估计每个样本的损失梯度,并且模型在此过程中更新 (又名学习率)。 SGD 允许通过 partial_fit 方法进行小批量(在线/核外)学习。

根据指定的损失函数,它将适合不同的模型。它默认为 hinge 损失,它相当于线性 SVM

在您的情况下,您将使用 fit() 函数在初始训练数据上训练具有铰链损失的 SGDClassifier,然后使用 partial_fit() 一次一个使用潜在训练数据的元素更新模型:

from sklearn.linear_model import SGDClassifier


linearSVC = SGDClassifier(loss='hinge') # hinge is default loss anyway, just shown for clarity

# Fit on initial training set
linearSVC.fit(X_train, y_train)

# Update model one sample at a time
for i in range(100):
    linearSVC.partial_fit(X_pool[i], y_pool[i])

这将按需要工作。作为参考,您还可以查看此question 的答案,其中澄清了

[...] 在为您的模型拟合新数据时,partial_fit 只会将模型向新数据更正一步[...]

最后一点,因为您在示例中传递了probability=True 参数。请注意,此分类器仅支持 predict_proba() 函数用于日志损失和修改后的 Huber 损失。因此,您可能无法预测类的概率。

【讨论】:

有没有可能添加或模拟predict_proba()的功能?不幸的是,在每次迭代时从池中选择“正确”实例是必不可少的:/ @Lavair 鉴于您肯定希望将 SVM 用作模型,因此没有直接的方法可以做到这一点,至少 afaik 是这样。如果将 SVM 作为基础模型并不那么重要,您当然可以尝试 log 损失,这会导致 LogisticRegression 模型,然后 SGDClassifier 将支持 predict_proba()。否则,恐怕我不能再帮你了,至少现在是这样。但可能值得将其作为一个单独的问题提出。我相信这将最大限度地提高您获得明确答案的机会。

以上是关于有没有办法扩展最初传递给 SVC 的训练集?的主要内容,如果未能解决你的问题,请参考以下文章

使用 sklearn SVC 计算训练集的混淆矩阵

管道和网格搜索的 SKLearn 错误

Keras 没有在整个数据集上进行训练

数据集特征编码和缩放

有没有办法找到整个数据集中最具代表性的样本集?

详解支持向量机-SVC真实数据案例:预测明天是否会下雨-填补缺失值和编码菜菜的sklearn课堂笔记