机器学习的半监督学习

什么是半监督学习 (semi-supervised learning)?

  • 半监督学习是一种结合了监督学习和无监督学习的机器学习方法,它利用少量的有标签数据和大量的无标签数据来训练模型

scikit-learn 中,如何在未标记的数据上进行 “自我训练”?

  • 自我训练步骤: SelfTrainingClassifier 可以与任何实现 predict_proba 的分类器一起调用,并作为参数 base_classifier 传递。在每个迭代中,base_classifier 预测未标注样本的标签,并将这些标签的一个子集添加到标注数据集中,这个子集的选择是由选择标准决定的。这种选择可以使用预测概率的阈值,或根据预测概率选择 k_best 样本来完成
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     >>> import numpy as np
    >>> from sklearn import datasets
    >>> from sklearn.semi_supervised import SelfTrainingClassifier
    >>> from sklearn.svm import SVC
    >>> rng = np.random.RandomState(42)
    >>> iris = datasets.load_iris()
    >>> random_unlabeled_points = rng.rand(iris.target.shape[0]) < 0.3
    >>> iris.target[random_unlabeled_points] = -1
    >>> svc = SVC(probability=True, gamma="auto")
    >>> self_training_model = SelfTrainingClassifier(svc)
    >>> self_training_model.fit(iris.data, iris.target)
    SelfTrainingClassifier(...)

scikit-learn 中,如何将已标记标签的样本传播到未标记的样本上?

  • cikit-learn 提供了两种标签传播模型。LabelPropagation 和 LabelSpreading。两者都是通过在输入数据集的所有项目上构建一个相似性图来工作的
  • 方法 1:LabelPropagation
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     >>> import numpy as np
    >>> from sklearn import datasets
    >>> from sklearn.semi_supervised import LabelPropagation
    >>> label_prop_model = LabelPropagation()
    >>> iris = datasets.load_iris()
    >>> rng = np.random.RandomState(42)
    >>> random_unlabeled_points = rng.rand(len(iris.target)) < 0.3
    >>> labels = np.copy(iris.target)
    >>> labels[random_unlabeled_points] = -1
    >>> label_prop_model.fit(iris.data, labels)
    LabelPropagation(...)
  • 方法 2:LabelSpreading
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     >>> import numpy as np
    >>> from sklearn import datasets
    >>> from sklearn.semi_supervised import LabelSpreading
    >>> label_prop_model = LabelSpreading()
    >>> iris = datasets.load_iris()
    >>> rng = np.random.RandomState(42)
    >>> random_unlabeled_points = rng.rand(len(iris.target)) < 0.3
    >>> labels = np.copy(iris.target)
    >>> labels[random_unlabeled_points] = -1
    >>> label_prop_model.fit(iris.data, labels)
    LabelSpreading(...)

在 scikit-learn 中,标签传播的 2 个方法 LabelPropagation 和 LabelSpreading 有什么差异?

  • 对相似性矩阵该图的修改和对标签分布的夹紧作用。夹紧允许算法在一定程度上改变真实地面标签数据的权重
  • LabelPropagation 算法对输入标签进行硬夹紧,这意味着 α=0。这个夹紧系数可以放宽,比如说 α=0.2,这意味着我们将始终保留 80% 的原始标签分布,但算法可以在 20% 范围内改变其对分布的信心
  • LabelPropagation 使用从数据中构建的原始相似性矩阵,不做任何修改。相比之下,LabelSpreading 最小化了一个具有正则化 (regularization) 特性的损失函数,因此它通常对噪声更加稳健