标注数据较少时【长文本分类任务】的半监督学习Python算法

文本分类与弱监督学习

数据介绍

语料下载地址:https://download.youkuaiyun.com/download/Yellow_python/12862983
新闻10分类样本总数19467,长度分布类别分布如下:

from data10 import X, Y  # 导入文本10分类
from pandas import Series
from collections import Counter
print(Counter(Y).most_common())  # 标签分类统计
print(Series(X).str.len().describe())  # 文本长度概览
类别数量类别数量
science2093car2066
finance2052sports2017
military2007medicine2000
entertainment1906politics1865
education1749fashion1712
统计指标文本长度
mean753.15
std538.73
min1
25%309
50%645
75%1065
max2094

原理

训练
输入
预测
阈值
训练
预测
预测
少量标注数据
模型1
无标注数据
预测值及其概率
高概率数据
混合标注数据
模型2
结果2
结果1
比较

极简代码

分类模型:逻辑回归;文本编码:TFIDF

import re, numpy as np
from sklearn.metrics import classification_report
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from jieba import cut

np.random.seed(7)
N = 25000
STOP_WORDS = set('''
了 是 在 和 有 他 我 的 也 为 就 这 都 等 着 来 与 要 又 而 一个 之 以 她 去 那 但 把 我们 可 他们 并 自己 或 由 其 给 使 却
这个 它 已经 及 这样 这些 此 们 这种 如果 因为 即 其中 现在 一些 以及 同时 由于 所以 这里 因 曾 呢 但是 该 每 其他 应 吧 虽然
因此 而且 啊 应该 当时 那么 这么 仍 还有 如此 既 或者 然后 有些 那个 关于 于是 不仅 只要 且 另外 而是 还是 此外 这次 如今 就是
并且 从而 其它 尽管 还要 即使 总是 只有 只是 而言 每次 这是 就会 那是'''.strip().split())  # 情感分析时不用


def tokenizer(text):
    for sentence in re.split('[^a-zA-Z\u4e00-\u9fa5]+', text):
        for word in cut(sentence):
            if word not in STOP_WORDS:
                yield word


class Model:
    def __init__(self):
        self.vec = TfidfVectorizer(tokenizer=tokenizer, max_features=N)
        self.clf = LogisticRegression(C=2, solver='liblinear')

    def fit(self, x, y):
        x = self.vec.fit_transform(x)
        self.clf.fit(x, y)
        return self

    def predict(self, x):
        return self.clf.predict(self.vec.transform(x))

    def predict_probability_one(self, text):
        """单个文本分类并返回概率"""
        proba = self.clf.predict_proba(self.vec.transform([text]))[0]
        argmax = np.argmax(proba)
        return self.clf.classes_[argmax], proba[argmax]

    def classification_report(self, x_test, y_test):
        y_pred = self.predict(x_test)  # 预测
        print('accuracy', np.average([y_test == y_pred]))
        print('\033[034m%s\033[0m' % classification_report(y_test, y_pred))  # F1-score


def experiment(x, y, test_size=.9):
    # 样本切分,设定测试集占比
    x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=test_size)
    print('\033[033m', test_size, [i.shape for i in (x_train, x_test, y_train, y_test)], '\033[0m', sep='')
    # 模型1
    m1 = Model().fit(x_train, y_train)
    m1.classification_report(x_test, y_test)
    for threshold in (.9, .8, .7, .6, .5, .4, .3, .2):
        # 高概率预测数据合并到训练集
        x_mix, y_mix = x_train.tolist(), y_train.tolist()
        for i in range(len(x_test)):
            y_pred, proba = m1.predict_probability_one(x_test[i])
            if proba > threshold:
                x_mix.append(x_test[i])
                y_mix.append(y_pred)
        print('\033[035m%.1f\033[0m' % threshold, '合并后训练集数量', len(x_mix), len(y_mix))
        # 模型2
        m2 = Model().fit(x_mix, y_mix)
        m2.classification_report(x_test, y_test)


from data10 import X, Y  # 文本10分类
experiment(X, Y, test_size=.95)
experiment(X, Y, test_size=.9)
experiment(X, Y, test_size=.8)
experiment(X, Y, test_size=.7)
experiment(X, Y, test_size=.6)
experiment(X, Y, test_size=.5)
experiment(X, Y, test_size=.4)

附两组结果

训练集:测试集测试集占比添加伪标签阈值测试集数量训练集数量混合标注数据量标注增加量模型1准度模型2准度模型2-模型1
1比190.950.91849497397300.8231318270.8231318270
1比190.950.81849497397300.8231318270.8231318270
1比190.950.71849497311982250.8231318270.818806099-0.004325727
1比190.950.618494973311121380.8231318270.773710393-0.049421434
1比190.950.518494973586248890.8231318270.753325403-0.069806424
1比190.950.418494973886778940.8231318270.782956635-0.040175192
1比190.950.31849497312501115280.8231318270.812750081-0.010381745
1比190.950.21849497316789158160.8231318270.8291337730.006001947
1比90.90.9175211946194600.8461275040.8461275040
1比90.90.817521194621762300.8461275040.845956281-0.000171223
1比90.90.7175211946474427980.8461275040.832258433-0.013869071
1比90.90.6175211946774457980.8461275040.824781691-0.021345814
1比90.90.51752119461033983930.8461275040.831801838-0.014325666
1比90.90.417521194612878109320.8461275040.843559158-0.002568347
1比90.90.317521194615582136360.8461275040.8518920150.005764511
1比90.90.217521194618401164550.8461275040.8525769080.006449404
1比40.80.91557438933906130.8620136120.8620778226.42096E-05
1比40.80.8155743893583819450.8620136120.8620136120
1比40.80.7155743893930254090.8620136120.859830487-0.002183126
1比40.80.61557438931194880550.8620136120.8592526-0.002761012
1比40.80.515574389314165102720.8620136120.8627199180.000706305
1比40.80.415574389316156122630.8620136120.8634262230.001412611
1比40.80.315574389317888139950.8620136120.8655451390.003531527
1比40.80.215574389319202153090.8620136120.8628483370.000834725
3比70.70.913627584060171770.8679092980.8679092980
3比70.70.8136275840913132910.8679092980.8679826817.33837E-05
3比70.70.71362758401220163610.8679092980.866441623-0.001467674
3比70.70.61362758401420783670.8679092980.867248844-0.000660454
3比70.70.513627584015884100440.8679092980.8685697510.000660454
3比70.70.413627584017343115030.8679092980.86834960.000440302
3比70.70.313627584018535126950.8679092980.8695971230.001687826
3比70.70.213627584019361135210.8679092980.8680560650.000146767
2比30.60.911681778682504640.8740690010.873726565-0.000342436
2比30.60.81168177861138736010.8740690010.873298519-0.000770482
2比30.60.71168177861388460980.8740690010.8740690010
2比30.60.61168177861552877420.8740690010.873726565-0.000342436
2比30.60.51168177861686990830.8740690010.873726565-0.000342436
2比30.60.411681778618046102600.8740690010.8745826560.000513655
2比30.60.311681778618925111390.8740690010.8751819190.001112918
2比30.60.211681778619415116290.8740690010.8744970460.000428046
1比10.50.997349733104837500.8734333260.8738442570.000410931
1比10.50.8973497331338636530.8734333260.872097802-0.001335525
1比10.50.7973497331525455210.8734333260.872508732-0.000924594
1比10.50.6973497331654068070.8734333260.8735360590.000102733
1比10.50.5973497331755478210.8734333260.873330594-0.000102733
1比10.50.4973497331847187380.8734333260.8745633860.00113006
1比10.50.3973497331913093970.8734333260.8738442570.000410931
1比10.50.2973497331943997060.8734333260.8736387920.000205465
3比20.40.91168077871253947520.879157570.878772313-0.000385257
3比20.40.81168077871491071230.879157570.8794144090.000256838
3比20.40.71168077871634085530.879157570.8795428280.000385257
3比20.40.61168077871730595180.879157570.878900732-0.000256838
3比20.40.511680778718138103510.879157570.877102864-0.002054707
3比20.40.411680778718777109900.879157570.879029151-0.000128419
3比20.40.311680778719217114300.879157570.8792859890.000128419
3比20.40.211680778719450116630.879157570.878772313-0.000385257

训练集:测试集测试集占比添加伪标签阈值测试集数量训练集数量混合标注数据量标注增加量模型1准度模型2准度模型2-模型1
1比190.950.91849497397300.8251865470.8251865470
1比190.950.81849497397300.8251865470.8251865470
1比190.950.71849497313193460.8251865470.822050395-0.003136152
1比190.950.618494973316321900.8251865470.79366281-0.031523737
1比190.950.518494973615151780.8251865470.780198983-0.044987564
1比190.950.418494973939484210.8251865470.791391803-0.033794744
1比190.950.31849497312994120210.8251865470.813453012-0.011733535
1比190.950.21849497317059160860.8251865470.8321617820.006975235
1比90.90.9175211946194600.8505793050.8505793050
1比90.90.817521194621101640.8505793050.8512071230.000627818
1比90.90.7175211946444625000.8505793050.842531819-0.008047486
1比90.90.6175211946776358170.8505793050.830717425-0.01986188
1比90.90.51752119461062986830.8505793050.835055077-0.015524228
1比90.90.417521194613375114290.8505793050.840990811-0.009588494
1比90.90.317521194615980140340.8505793050.849380743-0.001198562
1比90.90.217521194618519165730.8505793050.8545174360.003938131
1比40.80.91557438933907140.8641967380.864132529-6.42096E-05
1比40.80.8155743893570918160.8641967380.862912547-0.001284192
1比40.80.7155743893937554820.8641967380.858674714-0.005522024
1比40.80.61557438931208381900.8641967380.858931553-0.005265186
1比40.80.515574389314279103860.8641967380.860729421-0.003467317
1比40.80.415574389316135122420.8641967380.863362014-0.000834725
1比40.80.315574389317879139860.8641967380.8650314630.000834725
1比40.80.215574389319222153290.8641967380.8639399-0.000256838
3比70.70.913627584060041640.8641667280.863799809-0.000366919
3比70.70.8136275840907032300.8641667280.862699053-0.001467674
3比70.70.71362758401220563650.8641667280.862332135-0.001834593
3比70.70.61362758401434285020.8641667280.86262567-0.001541058
3比70.70.513627584015964101240.8641667280.8651207160.000953988
3比70.70.413627584017381115410.8641667280.8652674840.001100756
3比70.70.313627584018549127090.8641667280.8667351580.00256843
3比70.70.213627584019367135270.8641667280.8650473330.000880605
2比30.60.911681778682464600.8725280370.8725280370
2比30.60.81168177861153937530.8725280370.872356819-0.000171218
2比30.60.71168177861399862120.8725280370.8725280370
2比30.60.61168177861562078340.8725280370.8725280370
2比30.60.51168177861692191350.8725280370.8729560830.000428046
2比30.60.411681778618052102660.8725280370.8727848640.000256827
2比30.60.311681778618895111090.8725280370.8742402190.001712182
2比30.60.211681778619403116170.8725280370.8728704730.000342436
1比10.50.997349733103966630.880830080.880110951-0.000719129
1比10.50.8973497331337636430.880830080.879494555-0.001335525
1比10.50.7973497331541356800.880830080.878878159-0.001951921
1比10.50.6973497331662268890.880830080.879700021-0.00113006
1比10.50.5973497331762278890.880830080.8810355460.000205465
1比10.50.4973497331849987660.880830080.880419149-0.000410931
1比10.50.3973497331910193680.880830080.8812410110.000410931
1比10.50.2973497331943296990.880830080.8813437440.000513663
3比20.40.91168077871253047430.8797996660.8799280850.000128419
3比20.40.81168077871498471970.8797996660.879414409-0.000385257
3比20.40.71168077871643486470.8797996660.8801849240.000385257
3比20.40.61168077871736895810.8797996660.8797996660
3比20.40.511680778718168103810.8797996660.878772313-0.001027353
3比20.40.411680778718797110100.8797996660.879671247-0.000128419
3比20.40.311680778719241114540.8797996660.878643894-0.001155772
3比20.40.211680778719446116590.8797996660.87915757-0.000642096

结论

多数情况不提升,某些情况下有轻微提升,有空再做更多微调

<think>嗯,用户之前问过小样本学习,现在又问如果样本数据较少该选择哪些机器学习方法。看来他可能在实际项目中遇到了数据不足的问题,需要具体的解决方案。我需要先回顾一下小样本学习的相关内容,然后扩展到更一般的少样本场景下的方法选择。 首先,用户之前的问题是关于小样本学习如何进行学习,现在的问题是更广泛的,当样本少该选哪些方法。所以需要从小样本学习扩展到其他传统方法,比如数据增强、迁移学习、基于模型的方法等等。 用户可能是想解决实际应用中的问题,比如在医疗、金融等领域,数据获取困难,样本量小,需要推荐合适的方法。需要考虑到不同方法的适用性,以及它们的优缺点。 接下来要整理出几种常见的方法,比如集成学习中的简单模型,数据增强,迁移学习,半监督学习,基于贝叶斯的方法,主动学习,生成对抗网络,基于度量的学习,正则化和早停,以及传统机器学习模型如SVM和决策树。这些方法在不同的场景下有不同的效果,需要详细说明每种方法的适用情况和例子。 同,可能需要比较不同方法的优缺点,比如生成对抗网络需要较高的计算资源,而数据增强则相对简单。还要注意实际应用中的建议,比如如何结合业务理解,使用交叉验证,避免过拟合等。 需要确保回答结构清晰,分点列出,每个方法有核心思想、适用场景和示例,方便用户理解和应用。同,避免使用过于专业的术语,保持口语化,但又要准确。最后总结一个选择方法的流程图,帮助用户快速决策。</think>当样本数据较少,传统机器学习方法容易过拟合或泛化能力不足。以下是针对**低数据场景**的优化方法及选型建议,按优先级排序: --- ### 一、数据层面:**低成本扩增样本** | 方法 | 核心思想 | 适用场景 | 示例(代码片段参考) | |-------------------|----------------------------|----------------------|---------------------------| | **传统数据增强** | 通过变换生成新样本 | 图像、文本、数据 | `torchvision.transforms`随机裁剪、旋转 | | **特征工程增强** | 人工构造高信息量特征 | 表格数据 | 组合特征(如年龄×收入)、统计特征(滑动均值) | | **合成数据生成** | 用生成模型模拟真实分布 | 图像、文本生成任务 | 使用GAN生成人脸:`TF-GAN`或`PyTorch-GAN`库 | | **半监督学习** | 利用未标注数据辅助训练 | 有大量未标注数据的场景 | 自训练(Self-training)伪标签迭代优化 | --- ### 二、模型层面:**选择高样本效率的模型** | 方法 | 核心思想 | 适用场景 | 工具/库推荐 | |--------------------|----------------------------|----------------------|------------------------| | **简单模型优先** | 降低模型复杂度避免过拟合 | 所有低数据场景 | 逻辑回归、朴素贝叶斯(`scikit-learn`) | | **集成学习 + 降维** | 组合弱模型提升稳定性 | 特征维度高且样本少 | Bagging + PCA(`sklearn.ensemble.BaggingClassifier`) | | **贝叶斯方法** | 引入先验分布约束参数空间 | 小数据下的概率建模 | 高斯过程(`GPyTorch`)、贝叶斯神经网络 | | **迁移学习** | 复用预训练模型的特征提取能力 | 图像、文本领域 | `ResNet`预训练 + 微调顶层(PyTorch `torchvision.models`) | | **小样本学习框架** | 元学习或度量学习优化泛化 | 需快速适应新类别任务 | Prototypical Networks(`learn2learn`库) | --- ### 三、训练策略层面:**优化学习过程** 1. **正则化强化** - 添加L1/L2正则化(权重衰减) - 使用Dropout(即使在小数据下,比例需调低) ```python # PyTorch示例 model = nn.Sequential( nn.Linear(100, 50), nn.Dropout(p=0.3), # 小数据建议p=0.2~0.5 nn.ReLU(), nn.Linear(50, 10) ) ``` 2. **早停(Early Stopping)** - 监控验证集损失,防止过拟合 ```python from pytorch_lightning.callbacks import EarlyStopping early_stop = EarlyStopping(monitor="val_loss", patience=5) ``` 3. **交叉验证变体** - 使用留一法(Leave-One-Out)或分层K折(Stratified K-Fold) ```python from sklearn.model_selection import LeaveOneOut loo = LeaveOneOut() for train_idx, test_idx in loo.split(X): X_train, X_test = X[train_idx], X[test_idx] ... ``` --- ### 四、实际场景选型指南 #### 1. **图像分类(样本<100)** - **首选方法**:迁移学习(如微调ResNet最后一层) + 数据增强(旋转、裁剪) - **备选方案**:原型网络(Prototypical Networks) + 特征蒸馏 #### 2. **文本分类(样本<200)** - **首选方法**:预训练语言模型(如BERT) + 微调分类头 - **备选方案**:TF-IDF特征 + SVM(线性核) #### 3. **表格数据预测(样本<50)** - **首选方法**:XGBoost/LightGBM(限制树深度) + 特征交叉 - **风险警告**:避免使用深度学习(易过拟合) --- ### 五、避坑指南 1. **避免复杂模型**:神经网络在小数据下容易记忆噪声,优先选择线性模型或树模型。 2. **慎用自动调参**:网格搜索或贝叶斯优化可能因数据不足而失效,建议手动设定参数范围。 3. **评估指标选择**:使用AUC-ROC(对类别不平衡更鲁棒)而非准确率。 --- ### 六、扩展工具推荐 | 工具库 | 核心功能 | 链接 | |--------------------|--------------------------|-----------------------------| | `imbalanced-learn` | 处理类别不平衡 | [GitHub](https://github.com/scikit-learn-contrib/imbalanced-learn) | | `tpot` | 自动化机器学习(AutoML) | [文档](https://epistasislab.github.io/tpot/) | | `snorkel` | 弱监督数据标注 | [官网](https://snorkel.org/) | --- ### 总结流程图 ```mermaid graph TD A[样本量少] --> B{数据类型} B -->|图像/文本| C[迁移学习+数据增强] B -->|表格数据| D[简单模型+特征工程] C --> E[评估验证集效果] D --> E E -->|效果差| F[尝试半监督/生成数据] E -->|效果达标| G[部署模型] ``` **核心原则**:**先优化数据,再简化模型,最后调整训练策略**。小数据场景下,模型的天花板常由数据质量决定,而非算法复杂度。
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小基基o_O

您的鼓励是我创作的巨大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值