# pu-learning 方式实现半监督分类

## 概述

PU-Learning 可以用于解决只含有正标签数据和无标签数据的二分类问题，P 即 positive，U 即 Unlabeled

PU-Learning 分两步

• 从无标签数据中选出一个可靠的负数据集合 RN (Reliable Negative)

我这里使用的方法是 1-DNF

• 使用 P (Positive) 和 RN (Reliable Negative) 训练一个分类器，使用该分类器对 U (Unlabeled) 进行分类，将被判定为负数据的部分 W 合并到 RN 中，循环直至 W 为空集。

每次循环都会得到一个分类器，通过设定规则选出最终的分类器。

我这里用的分类器是逻辑回归模型分类器

## 1-DNF

• 获取 P, U 中的所有特征 (all features)

• 对于每个特征，若它在 P 中出现的频率高于在 U 中出现的频率，则将它归入正特征集 PF (Positive Features) 中

• 对于 U 中的每条数据，若它不包含 PF 中的特征，则将它归入可靠的负数据集 RN (Reliable Negative) 中，否则归入集合 Q 中

## 训练分类器

• P 和 RN 组成训练集 X_train

• P 给定标签 1，RN 给定标签 0，组成训练集标签 y_train

• 用 X_train 和 y_train 训练逻辑回归模型 model

``1model.fit(X_train, y_train)``
• 用 model 对 Q 进行预测（分类）得到结果 result

``1result = model.predict(Q)``
• 找出 Q 中被判定为负的数据组成集合 W

``1result = np.where(result&lt;0.5, 0, 1).T2negative_index = np.where(result == 0)3W = Q[negative_index]``
• 将 W 和 RN 合并作为新的 RN，同时将 W 从 Q 中排除

``1RN = np.concatenate((RN, W))  # RN = RN + W2Q = np.delete(Q, negative_index, axis=0)  # Q = Q - W ``
• 用新的 RN 和 P 组成新的 X_train，对应生成新的 y_train

• 继续训练模型，扩充 RN，直至 W 为空集，循环结束。其中每次循环都会得到一个分类器

## 选择一个最终分类器

• 直接选用最后一次循环得到的分类器：

``1final_model = models[-1]``
• 利用规则选出一个最佳分类器：

用最后一次循环得到的分类器 S-last 对 P 进行分类，若分类结果中有超过 8% 条数据被判定为负，则选用第一次循环的分类器 S-1 作为最终分类器，否则继续选用 S-last 作为最终分类器

``1neg_predict = models[-1].predict(P)2neg_predict = np.where(neg_predict&lt;0.5, 0, 1).T3if list(neg_predict).count(0)/neg_predict.shape &gt; 0.08:4    final_model = models5else:6    final_model = models[-1]``

## 对测试数据集进行分类

``1result = final_model.predict(X_test)``
{"ft_lang_label":"__label__zh","ft_lang_prob":0.89230824,"math_prob":0.9727901,"size":1771,"snap":"2019-35-2019-39","text_gpt3_token_len":1047,"char_repetition_ratio":0.10922468,"word_repetition_ratio":0.0,"special_character_ratio":0.28289104,"punctuation_ratio":0.103559874,"nsfw_num_words":0,"has_unicode_error":false,"math_prob_llama3":0.9876749,"pos_list":[0],"im_url_duplicate_count":[null],"WARC_HEADER":"{\"WARC-Type\":\"response\",\"WARC-Date\":\"2019-08-17T10:43:53Z\",\"WARC-Record-ID\":\"<urn:uuid:e073acce-7cae-493e-b61a-74749466095e>\",\"Content-Length\":\"42489\",\"Content-Type\":\"application/http; msgtype=response\",\"WARC-Warcinfo-ID\":\"<urn:uuid:f1bbd2f1-280d-4dd7-b92f-2dfb9b88fad1>\",\"WARC-Concurrent-To\":\"<urn:uuid:a8185027-dd8d-4e93-98a3-8cd6891018cb>\",\"WARC-IP-Address\":\"39.105.208.19\",\"WARC-Target-URI\":\"https://hxhen.com/tag/classifier/\",\"WARC-Payload-Digest\":\"sha1:6UGVJOZDRLN74W3FAX2RXXDQTXC2BNPV\",\"WARC-Block-Digest\":\"sha1:ED6KNWEK3OQT25HQPADY6RPOA7ZFN4V2\",\"WARC-Identified-Payload-Type\":\"text/html\",\"warc_filename\":\"/cc_download/warc_2019/CC-MAIN-2019-35/CC-MAIN-2019-35_segments_1566027312128.3_warc_CC-MAIN-20190817102624-20190817124624-00366.warc.gz\"}"}