当使用两个不同的数据集时,如何将模型持久性用于子任务?我创建了原始标签的副本,并用目标列中的3个标签替换了另一个标签。
例如,我有一个NLP多分类问题,需要将x分类为4个不同的标签,如1、2、3或4。1、2、3个标签是相关的,它们的标签可以被替换为5,所以现在这是一个二元分类问题。现在,我只需要区分4和5,但我仍然需要1、2、3之间的分类,我不太确定如何使用初始分类(4和5二进制分类模型(来帮助第二个模型(分类1,2,3(。我找不到任何信息,如果sci试剂盒学习允许这样做,就像Keras做的。谢谢你的建议。
目前,我使用SGD分类器,在4到5之间的分类中获得了90%的准确率,但不确定如何将其用于1、2和3的多重分类。这个功能不在sklearn中吗?
我想它和喀拉斯很相似。
编辑:经过进一步的研究,我认为我会使用"堆叠模型"然而,我在理解第二个模型如何"知道"哪些标签(1,2,3(代替了5时遇到了概念问题?
我遇到的一个问题是,集成学习者要求他们在相同的数据集上进行训练。我的是一样的,只是它不是,因为我用标签1,2,3代替了5,所以它只有4,5作为标签。这种方法会带来什么结果?
第2版:每个样本只能标记为一个类。A.原始目标列包含(1、2、3和4(。B.调整后的目标列包含(4和5(,其中5表示1、2和3
A和B是两个不同的CSV文件,唯一的区别是上面所述的,并且两者具有相同的功能。
为每个折叠(10个折叠(拟合SGDClassifier()
:
X_Train
=约(30000,54((垂直堆叠(--y_train
=约30000
测试:
X_test
=(2000至4000,54(--y_test
=(2000至4000(
现在的情况:
clf1 = SGDClassifier(max_iter=1000, tol=1e-3)
clf1.fit(X_train, y_train)
predicted = [labels[int(a)] for a in clf1.predict(X_test)]
actual = [labels[int(a)] for a in y_test]
这是我基于上面简单代码的答案。
我们有X_train,Y_train。
培训模式1
#modifiying the labels for two classes. binary prediction. 1[1,2,3] & 2[4]
y_train_copy = np.copy(y_train)
y_train_copy [y_train_copy <4] = 1
y_train_copy [y_train_copy >=4] = 2
clf1 = SGDClassifier(max_iter=1000, tol=1e-3)
clf1.fit(X_train, y_train_copy )
训练模型2
#training with classes 1 ,2, 3. filtering X based on Y
X_train = X_train[Y_train<4]
Y_train = Y_train[Y_train<4]
clf2 = SGDClassifier(max_iter=1000, tol=1e-3)
clf2.fit(X_train, y_train)
现在我们有两个模型,clf1(将2个类别(1,2,3(分类为1或(4(分类为2(,clf2将个体(1,3(进行分类,在clf1(中预测为1
预测
predicted = clf1.predict(X_test)
#make sure you get 1 & 2 filled in predicted list
这将给出1(1,2,3(或2(4(的结果
further_prediction_X_test = X_test[predicted == 1] #filtering all thats predicted as 1 by previous model
further_prediction = clf2.predict(further_repdiction_X_test)
predicted[predicted==2] = 4 #rolling back to original label
predicted[predicted==1] = further_prediction #replacing the predicted classes from second model for which first model predicted as 1. (replacing with 1, 2, 3)
注:
我强烈建议对你的类进行整数编码,这样它就很容易过滤和处理。
不要混淆1&在我上面的答案中,clf1中的2个具有1、2、3、4个原始类。