在 sklearn 中使用子任务和两个不同的数据集时,您将如何实现模型组合
How would you implement model combination when using sub tasks and two different datasets with sklearn
当使用两个不同的数据集时,如何将模型持久性用于子任务?我创建了原件的副本,并将目标列中的 3 个标签替换为另一个标签。
例如,我有一个 NLP 多 class 化问题,我需要将 x class 化为 4 个不同的标签,例如 1、2、3 或 4。1, 2、3个标签是相关的,它们的标签可以代入5,所以现在是一个二元class化问题。现在,我只需要区分 4 和 5,但我还剩下 1、2、3 之间的 class 化,我不太确定如何使用初始 class ification(4 和 5 二元 classification 模型)有助于第二个模型(classifying 1,2,3)。如果 sci-kit learn 像 Keras 那样允许这样做,我找不到任何信息。感谢您的任何建议。
目前,我正在使用 SGDClassifier 并在 class4 和 5 之间获得 90% 的准确率,但不确定如何将其用于 1、2 的多重 class 化, 和 3. 这个功能不在 sklearn 中吗?
我认为它类似于 Keras。
编辑:
经过进一步研究,我认为我会使用 'stacking models.' 但是,我在理解第二个模型将如何 'know' 哪些标签 (1,2,3) 被替换为 5 时遇到了概念性问题?
我 运行 关注的一个问题是,集成学习器要求他们在同一数据集上接受训练。我的是一样的,除了它不是因为我已经将标签 1、2、3 替换为 5,所以它只有 4、5 作为标签。这种方法会导致什么结果?
编辑2:
每个样本只能标记为一个class。
A. 原始目标列包含 (1,2,3, 和 4)。
B、调整后的目标列包含(4,和5),其中5代表1、2、3
A和B是两个不同的CSV文件,唯一的区别就是上面所说的,两者的特点是一样的。
每次折叠(10 次折叠)拟合 SGDClassifier()
:
X_Train
= about (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)
现在我们有 2 个模型,clf1(将 2 类 (1,2,3) 分类为 1 或 (4) 分类为 2),clf2 将预测的个体 (1,2,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)
注:
我强烈建议对您的 类 进行整数编码,以便于过滤和使用它。
不要将 clf1 的 1 和 2 与我上面的答案中的 1,2,3,4 原始 类 混淆。
当使用两个不同的数据集时,如何将模型持久性用于子任务?我创建了原件的副本,并将目标列中的 3 个标签替换为另一个标签。
例如,我有一个 NLP 多 class 化问题,我需要将 x class 化为 4 个不同的标签,例如 1、2、3 或 4。1, 2、3个标签是相关的,它们的标签可以代入5,所以现在是一个二元class化问题。现在,我只需要区分 4 和 5,但我还剩下 1、2、3 之间的 class 化,我不太确定如何使用初始 class ification(4 和 5 二元 classification 模型)有助于第二个模型(classifying 1,2,3)。如果 sci-kit learn 像 Keras 那样允许这样做,我找不到任何信息。感谢您的任何建议。
目前,我正在使用 SGDClassifier 并在 class4 和 5 之间获得 90% 的准确率,但不确定如何将其用于 1、2 的多重 class 化, 和 3. 这个功能不在 sklearn 中吗?
我认为它类似于 Keras。
编辑: 经过进一步研究,我认为我会使用 'stacking models.' 但是,我在理解第二个模型将如何 'know' 哪些标签 (1,2,3) 被替换为 5 时遇到了概念性问题?
我 运行 关注的一个问题是,集成学习器要求他们在同一数据集上接受训练。我的是一样的,除了它不是因为我已经将标签 1、2、3 替换为 5,所以它只有 4、5 作为标签。这种方法会导致什么结果?
编辑2: 每个样本只能标记为一个class。 A. 原始目标列包含 (1,2,3, 和 4)。 B、调整后的目标列包含(4,和5),其中5代表1、2、3
A和B是两个不同的CSV文件,唯一的区别就是上面所说的,两者的特点是一样的。
每次折叠(10 次折叠)拟合 SGDClassifier()
:
X_Train
= about (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)
现在我们有 2 个模型,clf1(将 2 类 (1,2,3) 分类为 1 或 (4) 分类为 2),clf2 将预测的个体 (1,2,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)
注:
我强烈建议对您的 类 进行整数编码,以便于过滤和使用它。
不要将 clf1 的 1 和 2 与我上面的答案中的 1,2,3,4 原始 类 混淆。