python中的半监督学习

时间:2021-04-22 11:58:46

标签: machine-learning scikit-learn classification text-mining

我有一个文本数据集,我想对其实施半监督算法。执行半监督算法有一些步骤,如下所示。 首先,在标记的训练数据上训练分类器。 接下来,使用分类器来预测所有未标记数据的标签,以及这些预测的概率。在这种情况下,我只会对概率大于 75% 的预测采用“伪标签”。 接下来,将“伪标记”数据与标记的训练数据连接起来,并在连接后的数据上重新训练分类器。 最后,使用训练好的分类器对标记的测试数据进行预测,并对分类器进行评估。 我的代码如下。

iterations = 1

# Containers to hold f1_scores and # of pseudo-labels
train_f1s = []
test_f1s = []
pseudo_labels = []

# Assign value to initiate while loop
high_prob = [1] 
from sklearn.naive_bayes import MultinomialNB
# Loop will run until there are no more high-probability pseudo-labels
while iterations <10:
    
# Fit classifier and make train/test predictions
clf =  MultinomialNB()
traindClassifier=clf.fit(X_train_lab, y_train_lab)
y_hat_train = traindClassifier.predict(X_train_lab)
y_hat_test = traindClassifier.predict(X_test)

# Calculate and print iteration # and f1 scores, and store f1 scores
train_f1 = f1_score(y_train_lab, y_hat_train, average='micro')
test_f1 = f1_score(y_test, y_hat_test, average='micro')
print(f"Iteration {iterations}")
print(f"Train f1: {train_f1}")
print(f"Test f1: {test_f1}")
train_f1s.append(train_f1)
test_f1s.append(test_f1)

# Generate predictions and probabilities for unlabeled data
print(f"Now predicting labels for unlabeled data...")

pred_probs = traindClassifier.predict_proba(X_test_unlab)
preds = traindClassifier.predict(X_test_unlab)
prob_0 = pred_probs[:,0]
prob_1 = pred_probs[:,1]
prob_2 = pred_probs[:,2]

# Store predictions and probabilities in dataframe
GOFdataset_pred_prob = pd.DataFrame([])
GOFdataset_pred_prob['preds'] = preds
GOFdataset_pred_prob['prob_0'] = prob_0
GOFdataset_pred_prob['prob_1'] = prob_1
GOFdataset_pred_prob['prob_2'] = prob_2
#print(GOFdataset_pred_prob['prob_1'] )
# Separate predictions with > 96% probability
high_prob = pd.concat([GOFdataset_pred_prob.loc[GOFdataset_pred_prob['prob_2'] > 0.75]],
                      axis=0)
print(f"{len(high_prob)} high-probability predictions added to training data.")
pseudo_labels.append(len(high_prob))
# Add pseudo-labeled data to training data 
X_train_lab = concatenate((X_train_lab,  X_test_unlab[high_prob.index]))

y_train_lab = concatenate((y_train_lab, high_prob.preds)) 
# Drop pseudo-labeled instances from unlabeled data
index=high_prob.index
X_test_unlab = np.delete(X_test_unlab, index, axis=0)
print(f"{len(X_test_unlab)} unlabeled instances remaining.\n")
# Update iteration counter
#print(len(high_prob))
iterations += 1

但问题不是增加f1score,甚至降低f1score的值。 有人可以帮我吗?

0 个答案:

没有答案