scikit-learn 1.3 自带 SelfTrainingClassifier,位于 sklearn.semi_supervised 模块,仅支持分类任务,要求 base_estimator 实现 predict_proba 或 decision_function,且 X_unlabeled 必须为纯特征矩阵。

SelfTrainingClassifier 在 scikit-learn 1.3 中的可用性确认
scikit-learn 1.3 确实自带 SelfTrainingClassifier,位于 sklearn.semi_supervised 模块下,无需额外安装或降级版本。但要注意:它只支持**分类任务**,且基估计器(base_estimator)必须实现 predict_proba 或 decision_function 方法——比如 LogisticRegression、RandomForestClassifier(需设 probability=True),而 SVC 默认不满足,除非显式启用 probability=True。
构造 SelfTrainingClassifier 的关键参数设置
最常被忽略的是 threshold 和 max_iter。默认 threshold=0.75 表示仅当模型对未标记样本的预测置信度 ≥ 75% 时才将其纳入训练集;太低会导致错误标签污染,太高则几乎不新增样本。建议从 0.8 开始试,配合 max_iter=30 防止无限循环(尤其当数据中存在难分样本时)。
-
base_estimator必须是已实例化的对象,不能传类名(如不能写base_estimator=LogisticRegression) -
verbose=True可输出每轮新增标签数量,便于观察收敛情况 - 若使用
RandomForestClassifier,务必初始化为RandomForestClassifier(n_estimators=100, probability=True)
处理 X_unlabeled 中缺失标签的常见错误
半监督流程中,X_unlabeled 必须是纯特征矩阵(numpy.ndarray 或 pandas.DataFrame),**不能含任何标签列**,哪怕填了 -1 或 np.nan。否则 fit(X_labeled, y_labeled, X_unlabeled) 会报错 ValueError: Found array with dim 2. Expected 1 或静默失败。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
- 正确做法:把原始数据拆成两部分——明确有标签的子集(
X_labeled,y_labeled),其余特征单独组成X_unlabeled -
y_labeled必须是 1D 数组,且类别数不能超过基估计器能处理的范围(如二分类用LogisticRegression没问题,多分类需确认基模型支持) - 如果原始
y是 pandas Series,用y_labeled.values转为 numpy 数组更稳妥
评估半监督效果时的真实陷阱
直接在全部测试集上比准确率容易高估效果——因为 SelfTrainingClassifier 内部使用的“伪标签”可能在测试集上恰好匹配。更合理的方式是:固定一个独立的、完全未参与训练/伪标注的 X_test 和 y_test,并在每轮迭代后单独评估,观察是否真正提升泛化能力。
- 不要复用
X_unlabeled当测试集;它已被用于生成伪标签,信息已泄露 -
SelfTrainingClassifier的predict方法返回的是最终模型的预测,不是中间伪标签——想看某轮新增了哪些样本?得监听verbose输出或重写_fit_semisupervised(不推荐) - 小样本场景下,伪标签噪声影响大,建议搭配
estimator.score(X_test, y_test)和原始监督模型对比,而非只看半监督模型自身 score
伪标签质量高度依赖初始监督模型的判别边界和数据分布,没有银弹阈值或通用基模型。跑通流程只是起点,调参和验证方式比代码本身更重要。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










