李宏毅深度学习笔记-半监督学习

半监督学习是一种机器学习方法,它利用带有标签的数据和未标签的数据来进行训练。相比于监督学习,半监督学习能够更好地利用未标签的数据,提高模型的性能和泛化能力。李宏毅教授在他的深度学习笔记中详细介绍了半监督学习的概念和方法。

在半监督学习中,我们通常的做法是使用一个有标签的数据集和一个未标签的数据集。有标签的数据集包含了一些样本和它们的标签,而未标签的数据集只有样本没有标签。我们的目标是利用这些数据训练一个模型,使得模型在未标签的数据上能够预测出正确的标签。

为了实现半监督学习,李宏毅教授介绍了几种经典的方法,包括自训练、协同训练和生成模型等。

**自训练(Self-training)**是一种简单而有效的半监督学习方法。它的基本思想是将有标签的数据用来训练一个初始模型,然后用这个模型去预测未标签的数据的标签,将预测出来的标签作为这些数据的新标签,再将这些数据添加到有标签的数据集中,重复这个过程直到模型收敛。

下面是一个使用自训练进行半监督学习的示例代码:

from sklearn.linear_model import LogisticRegression

# 假设我们有一个有标签的数据集 X_labeled 和对应的标签 y_labeled,以及一个未标签的数据集 X_unlabeled
# 初始化一个逻辑回归模型
model = LogisticRegression()

# 使用有标签的数据集训练模型
model.fit(X_labeled, y_labeled)

# 使用训练好的模型预测未标签的数据集的标签
y_pred_unlabeled = model.predict(X_unlabeled)

# 将预测出来的标签加入到有标签的数据集中
X_labeled = np.concatenate((X_labeled, X_unlabeled), axis=0)
y_labeled = np.concatenate((y_labeled, y_pred_unlabeled), axis=0)

# 重复上述过程直到模型收敛

**协同训练(Co-training)**是一种利用多个视角进行半监督学习的方法。它的基本思想是将数据分为两个视角,每个视角对应一个分类器。初始时,每个分类器使用有标签的数据进行训练。然后,使用这两个分类器对未标签的数据进行预测,将预测结果相同的数据加入到有标签的数据中。接着,使用更新后的有标签的数据进行重新训练,重复这个过程直到模型收敛。

下面是一个使用协同训练进行半监督学习的示例代码:

from sklearn.svm import SVC

# 假设我们有一个有标签的数据集 X_labeled 和对应的标签 y_labeled,以及一个未标签的数据集 X_unlabeled
# 初始化两个支持向量机分类器
model1 = SVC()
model2 = SVC()

# 初始时,每个分类器使用有标签的数据进行训练
model1.fit(X_labeled, y_labeled)
model2.fit(X_labeled, y_labeled)

# 设置最大迭代次数
max_iterations = 10

for i in range(max_iterations):
    # 使用两个分类器对未标签的数据进行预测
    y_pred1_unlabeled = model1.predict(X_unlabeled)
    y_pred2_unlabeled = model2.predict(X_unlabeled)
    
    # 将两个分类器预测结果相同的数据加入到有标签的数据中
    mask = (y_pred1_unlabeled == y_pred