样本不平衡问题分析与部分解决办法

2023-11-06

最近工作中在处理文本分类问题遇到了分类不均衡的问题,主要还是样本太少还同时非常的不均衡正负样本1:10(类别不平衡比例超过4:1,就会造成偏移),就使用了SMOTE方法。

注意:在进行数据增广的时候一定要将测试集和验证集单独提前分开,扩张只在训练集上进行,否则会造成在增广的验证集和测试集上进行验证和测试,在实际上线后再真实数据中效果可能会非常的差。

目录

什么是样本类别分布不均衡?

问题描述

样本类别分布不均衡导致的危害?

以下以二分类问题为例说明。

1. SMOTE(Synthetic Minority Over-sampling Technique)过采样小样本(扩充小类,产生新数据)

2. 欠采样大样本(压缩大类,产生新数据)

3. 对小类错分进行加权惩罚

4. 分治ensemble

5. 分层级ensemble

6. 基于异常检测的分类

7. 其他...待补充。

解决方法示例:

1.通过过抽样和欠抽样解决样本不均衡

(1)过抽样(over-sampling):通过增加分类中少数类样本的数量来实现样本均衡,比较好的方法有SMOTE算法。

(2)欠抽样(under-sampling):通过减少分类中多数类样本的数量来实现样本均衡

2.通过正负样本的惩罚权重解决样本不均衡

后附样本不平衡的问答系列

 

Jason Brownlee的回答:

 

类别不均衡问题是现实中很常见的问题

八大解决方法

Sergey Feldman的回答:

Kripa Chettiar的回答:

Roar Nybø的回答:

Dan Levin的回答:

Kaushik Kasi的回答:

Quora User的回答:

Dayvid Victor的回答:

Muktabh Mayank的回答:

Sandeep Subramanian的回答:

Quora User的回答:

Sumit Soman 的回答:


什么是样本类别分布不均衡?

举例说明,在一组样本中不同类别的样本量差异非常大,比如拥有1000条数据样本的数据集中,有一类样本的分类只占有10条,此时属于严重的数据样本分布不均衡。

问题描述

先举一个“恐怖”的例子,直观的感受一下样本不平衡问题:

你根据1000个正样本和1000个负样本正确训练出了一个准确率90%召回率90%的分类器,且通过实验验证没有欠采样过采样的问题哦~完美的样本,完美的模型,破费,你心里暗自得意。然后模型上线,正式预测每天的未知样本~。

开始一切都很美好,准确率召回率都很好。直到有一天,数据发生了一点变化,还是原来的数据类型和特征,只是每天新数据中正负样本变成了100个正样本,10000个负样本。注意,先前准确率90%的另一种表达是负样本有10%的概率被误检为正样本。好了,模型不变,现在误检的负样本数是10000*0.1=1000个,正样本被检出100*0.9(召回)=90个,好了,这个时候召回率不变仍为90%,但是新的准确率=90/(1000+90)=8.26% 。震惊吗!?恐怖吗!?

结论: 同一个模型仅仅是改变了验证集的正负样本比例,模型已经从可用退化成不可用了!!样本不平衡问题可怕就可怕在这,往往你的模型参数,训练,数据,特征都是对的!能做的都做了,但你的准确率就是上不去!!绝望吧。。。。。。
问题定义:数据集中,每个类别下的样本数目相差很大(数量级上的差距)。

样本类别分布不均衡导致的危害?

样本类别不均衡将导致样本量少的分类所包含的特征过少,并很难从中提取规律;即使得到分类模型,也容易产生过度依赖与有限的数据样本而导致过拟合问题,当模型应用到新的数据上时,模型的准确性会很差。
 

以下以二分类问题为例说明。

1. SMOTE(Synthetic Minority Over-sampling Technique)过采样小样本(扩充小类,产生新数据)

即该算法构造的数据是新样本,原数据集中不存在的。该基于距离度量选择小类别下两个或者更多的相似样本,然后选择其中一个样本,并随机选择一定数量的邻居样本对选择的那个样本的一个属性增加噪声,每次处理一个属性。这样就构造了更多的新生数据。(优点是相当于合理地对小样本的分类平面进行的一定程度的外扩;也相当于对小类错分进行加权惩罚(解释见3))

2. 欠采样大样本(压缩大类,产生新数据)

设小类中有N个样本。将大类聚类成N个簇,然后使用每个簇的中心组成大类中的N个样本,加上小类中所有的样本进行训练。(优点是保留了大类在特征空间的分布特性,又降低了大类数据的数目)

3. 对小类错分进行加权惩罚

对分类器的小类样本数据增加权值,降低大类样本的权值(这种方法其实是产生了新的数据分布,即产生了新的数据集,译者注),从而使得分类器将重点集中在小类样本身上。一个具体做法就是,在训练分类器时,若分类器将小类样本分错时额外增加分类器一个小类样本分错代价,这个额外的代价可以使得分类器更加“关心”小类样本。如penalized-SVM和penalized-LDA算法。
对小样本进行过采样(例如含L倍的重复数据),其实在计算小样本错分cost functions时会累加L倍的惩罚分数。

4. 分治ensemble

将大类中样本聚类到L个聚类中,然后训练L个分类器;每个分类器使用大类中的一个簇与所有的小类样本进行训练得到;最后对这L个分类器采取少数服从多数对未知类别数据进行分类,如果是连续值(预测),那么采用平均值。

5. 分层级ensemble

使用原始数据集训练第一个学习器L1;将L1错分的数据集作为新的数据集训练L2;将L1和L2分类结果不一致的数据作为数据集训练L3;最后测试集上将三个分类器的结果汇总(结合这三个分类器,采用投票的方式来决定分类结果,因此只有当L2与L3都分类为false时,最终结果才为false,否则true。)

6. 基于异常检测的分类

用异常检测算法(如高斯混合模型、聚类等)检测得到离群点或异常点;再对这些异常点为训练集学习一个分类器。

7. 其他...待补充。
 

解决方法示例:

1.通过过抽样和欠抽样解决样本不均衡

(1)过抽样(over-sampling):通过增加分类中少数类样本的数量来实现样本均衡,比较好的方法有SMOTE算法。

SMOTE算法:简单来说smote算法的思想是合成新的少数类样本,合成的策略是对每个少数类样本a,从它的最近邻中随机选一个样本b,然后在a、b之间的连线上随机选一点作为新合成的少数类样本。具体的过程大家可以自行google。

附上代码示例:(首先展示示例数据,本篇文章都用此数据)

    import pandas as pd
    from imblearn.over_sampling import SMOTE       #过度抽样处理库SMOTE
    df=pd.read_table('data2.txt',sep=' ',names=['col1','col2','col3','col4','col5','label'])    
    x=df.iloc[:,:-1]
    y=df.iloc[:,-1]
    groupby_data_orginal=df.groupby('label').count()      #根据标签label分类汇总

用groupby可以看到该数据label=0的有942个样本,label=1的只有58个,存在严重的不均衡现象,在这里我们用SMOTE算法来解决一下。

    model_smote=SMOTE()    #建立smote模型对象
    x_smote_resampled,y_smote_resampled=model_smote.fit_sample(x,y)
    x_smote_resampled=pd.DataFrame(x_smote_resampled,columns=['col1','col2','col3','col4','col5'])
    y_smote_resampled=pd.DataFrame(y_smote_resampled,columns=['label'])
    smote_resampled=pd.concat([x_smote_resampled,y_smote_resampled],axis=1)
    groupby_data_smote=smote_resampled.groupby('label').count()


可以看到通过smote算法将原本只有58个数据的样本补齐成了942。

(2)欠抽样(under-sampling):通过减少分类中多数类样本的数量来实现样本均衡

    from imblearn.under_sampling import RandomUnderSampler
    model_RandomUnderSampler=RandomUnderSampler()                #建立RandomUnderSample模型对象
    x_RandomUnderSample_resampled,y_RandomUnderSample_resampled=model_RandomUnderSampler.fit_sample(x,y)         #输入数据并进行欠抽样处理
    x_RandomUnderSample_resampled=pd.DataFrame(x_RandomUnderSample_resampled,columns=['col1','col2','col3','col4','col5'])
    y_RandomUnderSample_resampled=pd.DataFrame(y_RandomUnderSample_resampled,columns=['label'])
    RandomUnderSampler_resampled=pd.concat([x_RandomUnderSample_resampled,y_RandomUnderSample_resampled],axis=1)
    groupby_data_RandomUnderSampler=RandomUnderSampler_resampled.groupby('label').count()


根据数据可看到通过随机欠抽样方法,将原本942条数据的label0删减成为58条。

2.通过正负样本的惩罚权重解决样本不均衡

算法思想:对于分类中不同样本数量的类别分别赋予不同的权重,一般是小样本量类别权重高,大样本量类别权重低。

这里以SVM为例:

    from sklearn.svm import SVC
    model_svm=SVC(class_weight='balanced')
    model_svm.fit(x,y)

这里的class_weight选项用其默认方法‘balanced’,即SVM会将权重设置为与不同类别样本数量呈反比的权重来进行自动均衡处理。
 

后附样本不平衡的问答系列

原文:https://www.quora.com/In-classification-how-do-you-handle-an-unbalanced-training-set

 

Jason Brownlee的回答:

原文标题:8 Tactics to Combat Imbalanced Classes in Your Machine Learning Dataset 
  当你在对一个类别不均衡的数据集进行分类时得到了90%的准确度(Accuracy)。当你进一步分析发现,数据集的90%的样本是属于同一个类,并且分类器将所有的样本都分类为该类。在这种情况下,显然该分类器是无效的。并且这种无效是由于训练集中类别不均衡而导致的。 
  首先举几个所收到的邮件中关于类别不均衡的例子:

  • 在一个二分类问题中,训练集中class 1的样本数比class 2的样本数是60:1。使用逻辑回归进行分类,最后结果是其忽略了class 2,即其将所有的训练样本都分类为class 1。
  • 在分类任务的数据集中,有三个类别,分别为A,B,C。在训练集中,A类的样本占70%,B类的样本占25%,C类的样本占5%。最后我的分类器对类A的样本过拟合了,而对其它两个类别的样本欠拟合。

类别不均衡问题是现实中很常见的问题

  大部分分类任务中,各类别下的数据个数基本上不可能完全相等,但是一点点差异是不会产生任何影响与问题的。 
  在现实中有很多类别不均衡问题,它是常见的,并且也是合理的,符合人们期望的。如,在欺诈交易识别中,属于欺诈交易的应该是很少部分,即绝大部分交易是正常的,只有极少部分的交易属于欺诈交易。这就是一个正常的类别不均衡问题。又如,在客户流失的数据集中,绝大部分的客户是会继续享受其服务的(非流失对象),只有极少数部分的客户不会再继续享受其服务(流失对象)。一般而已,如果类别不平衡比例超过4:1,那么其分类器会大大地因为数据不平衡性而无法满足分类要求的。因此在构建分类模型之前,需要对分类不均衡性问题进行处理。 
  在前面,我们使用准确度这个指标来评价分类质量,可以看出,在类别不均衡时,准确度这个评价指标并不能work。因为分类器将所有的样本都分类到大类下面时,该指标值仍然会很高。即,该分类器偏向了大类这个类别的数据。

八大解决方法

  • 可以扩大数据集吗? 
      当遇到类别不均衡问题时,首先应该想到,是否可能再增加数据(一定要有小类样本数据),更多的数据往往战胜更好的算法。因为机器学习是使用现有的数据多整个数据的分布进行估计,因此更多的数据往往能够得到更多的分布信息,以及更好分布估计。即使再增加小类样本数据时,又增加了大类样本数据,也可以使用放弃一部分大类数据(即对大类数据进行欠采样)来解决。
  • 尝试其它评价指标 
      从前面的分析可以看出,准确度这个评价指标在类别不均衡的分类任务中并不能work,甚至进行误导(分类器不work,但是从这个指标来看,该分类器有着很好的评价指标得分)。因此在类别不均衡分类任务中,需要使用更有说服力的评价指标来对分类器进行评价。如何对不同的问题选择有效的评价指标参见这里。 
      上面的超链接中的文章,讲述了如何对乳腺癌患者复发类别不均衡数据进行分类。在文中,推荐了几个比传统的准确度更有效的评价指标:

    • 混淆矩阵(Confusion Matrix):使用一个表格对分类器所预测的类别与其真实的类别的样本统计,分别为:TP、FN、FP与TN。
    • 精确度(Precision)
    • 召回率(Recall)
    • F1得分(F1 Score):精确度与找召回率的加权平均。

      特别是:

  • 对数据集进行重采样 
      可以使用一些策略该减轻数据的不平衡程度。该策略便是采样(sampling),主要有两种采样方法来降低数据的不平衡性。

    • 对小类的数据样本进行采样来增加小类的数据样本个数,即过采样(over-sampling ,采样的个数大于该类样本的个数)。
    • 对大类的数据样本进行采样来减少该类数据样本的个数,即欠采样(under-sampling,采样的次数少于该类样本的个素)。

      采样算法往往很容易实现,并且其运行速度快,并且效果也不错。更详细的内容参见这里。 
      一些经验法则:

    • 考虑对大类下的样本(超过1万、十万甚至更多)进行欠采样,即删除部分样本;
    • 考虑对小类下的样本(不足1为甚至更少)进行过采样,即添加部分样本的副本;
    • 考虑尝试随机采样与非随机采样两种采样方法;
    • 考虑对各类别尝试不同的采样比例,比一定是1:1,有时候1:1反而不好,因为与现实情况相差甚远;
    • 考虑同时使用过采样与欠采样。
  • 尝试产生人工数据样本 
      一种简单的人工样本数据产生的方法便是,对该类下的所有样本每个属性特征的取值空间中随机选取一个组成新的样本,即属性值随机采样。你可以使用基于经验对属性值进行随机采样而构造新的人工样本,或者使用类似朴素贝叶斯方法假设各属性之间互相独立进行采样,这样便可得到更多的数据,但是无法保证属性之前的线性关系(如果本身是存在的)。 
      有一个系统的构造人工数据样本的方法SMOTE(Synthetic Minority Over-sampling Technique)。SMOTE是一种过采样算法,它构造新的小类样本而不是产生小类中已有的样本的副本,即该算法构造的数据是新样本,原数据集中不存在的。该基于距离度量选择小类别下两个或者更多的相似样本,然后选择其中一个样本,并随机选择一定数量的邻居样本对选择的那个样本的一个属性增加噪声,每次处理一个属性。这样就构造了更多的新生数据。具体可以参见原始论文。 
      这里有SMOTE算法的多个不同语言的实现版本: 
  • 尝试不同的分类算法 
      强烈建议不要对待每一个分类都使用自己喜欢而熟悉的分类算法。应该使用不同的算法对其进行比较,因为不同的算法使用于不同的任务与数据。具体可以参见“Why you should be Spot-Checking Algorithms on your Machine Learning Problems”。 
      决策树往往在类别不均衡数据上表现不错。它使用基于类变量的划分规则去创建分类树,因此可以强制地将不同类别的样本分开。目前流行的决策树算法有:C4.5、C5.0、CART和Random Forest等。基于R编写的决策树参见这里。基于Python的Scikit-learn的CART使用参见这里
  • 尝试对模型进行惩罚 
      你可以使用相同的分类算法,但是使用一个不同的角度,比如你的分类任务是识别那些小类,那么可以对分类器的小类样本数据增加权值,降低大类样本的权值(这种方法其实是产生了新的数据分布,即产生了新的数据集,译者注),从而使得分类器将重点集中在小类样本身上。一个具体做法就是,在训练分类器时,若分类器将小类样本分错时额外增加分类器一个小类样本分错代价,这个额外的代价可以使得分类器更加“关心”小类样本。如penalized-SVM和penalized-LDA算法。 
      Weka中有一个惩罚模型的通用框架CostSensitiveClassifier,它能够对任何分类器进行封装,并且使用一个自定义的惩罚矩阵对分错的样本进行惩罚。 
      如果你锁定一个具体的算法时,并且无法通过使用重采样来解决不均衡性问题而得到较差的分类结果。这样你便可以使用惩罚模型来解决不平衡性问题。但是,设置惩罚矩阵是一个复杂的事,因此你需要根据你的任务尝试不同的惩罚矩阵,并选取一个较好的惩罚矩阵。
  • 尝试一个新的角度理解问题 
      我们可以从不同于分类的角度去解决数据不均衡性问题,我们可以把那些小类的样本作为异常点(outliers),因此该问题便转化为异常点检测(anomaly detection)与变化趋势检测问题(change detection)。 
      异常点检测即是对那些罕见事件进行识别。如通过机器的部件的振动识别机器故障,又如通过系统调用序列识别恶意程序。这些事件相对于正常情况是很少见的。 
      变化趋势检测类似于异常点检测,不同在于其通过检测不寻常的变化趋势来识别。如通过观察用户模式或银行交易来检测用户行为的不寻常改变。 
      将小类样本作为异常点这种思维的转变,可以帮助考虑新的方法去分离或分类样本。这两种方法从不同的角度去思考,让你尝试新的方法去解决问题。
  • 尝试创新 
      仔细对你的问题进行分析与挖掘,是否可以将你的问题划分成多个更小的问题,而这些小问题更容易解决。你可以从这篇文章In classification, how do you handle an unbalanced training set?中得到灵感。例如: 
    • 将你的大类压缩成小类;
    • 使用One Class分类器(将小类作为异常点);
    • 使用集成方式,训练多个分类器,然后联合这些分类器进行分类;
    • ….

  这些想法只是冰山一角,你可以想到更多的有趣的和有创意的想法去解决问题。更多的想法参加Reddit的文章http://www.quora.com/In-classification-how-do-you-handle-an-unbalanced-training-set

选择某一种方法并使用它

  你不必成为一个精通所有算法的算法奇才或者一个建立准确而可靠的处理数据不平衡的模型的统计学家,你只需要根据你的问题的实际情况从上述算法或方法中去选择一种或两种方法去使用。希望上述的某些方法能够解决你的问题。例如使用其它评价指标或重采样算法速度快并且有效。

总结

  记住,其实并不知道哪种方法最适合你的任务与数据,你可以使用一些启发式规则或经验去选择某一个较优算法。当然最好的方法测试每一种算法,然后选择最好的方法。最重要的是,从点滴开始做起,根据自己现有的知识,并不断学习去一步步完善。

Further Reading…

  这里有一些我认为有价值的可供参考的相关资料,让你进一步去认识与研究数据不平衡问题:

Sergey Feldman的回答:

  • 设超大类中样本的个数是极小类中样本个数的L倍,那么在随机梯度下降(SGD,stochastic gradient descent)算法中,每次遇到一个极小类中样本进行训练时,训练L次。
  • 将大类中样本划分到L个聚类中,然后训练L个分类器,每个分类器使用大类中的一个簇与所有的小类样本进行训练得到。最后对这L个分类器采取少数服从多数对未知类别数据进行分类,如果是连续值(预测),那么采用平均值。
  • 设小类中有N个样本。将大类聚类成N个簇,然后使用每个簇的中心组成大类中的N个样本,加上小类中所有的样本进行训练。
  • 无论你使用前面的何种方法,都对某个或某些类进行了损害。为了不进行损害,那么可以使用全部的训练集采用多种分类方法分别建立分类器而得到多个分类器,采用投票的方式对未知类别的数据进行分类,如果是连续值(预测),那么采用平均值。
  • 最近的ICML论文中,表明增加数据量使得已知分布的训练集的误差增加了,即破坏了原有训练集的分布,从而可以提高分类器的性能。这篇论文与类别不平衡问题不相关,因为它隐式地使用数学方式增加数据而使得数据集大小不变。但是,我认为破坏原有的分布是有益的。
  • More details than you need: imho, the most interesting of the corrupting distributions is the blankout distribution, where you just zero out a random subset of features. Why is it interesting? Because you are helping your classifier be sturdier/hardier by giving it variations of your data that have essentially missing features. So it has to learn to classify correctly even in adverse conditions. 一个相关的想法是,在神经网络中,随机选择部分隐藏层单元来继续训练(即,随机去掉一部分隐藏层单元,(zeroed-out))。具体见http://web.stanford.edu/~sidaw/cgi-bin/home/lib/exe/fetch.php?media=papers:fastdropout.pdf

Kripa Chettiar的回答:

  • 增加新数据,可以使用SMOTE或SMOTEBoost产生人造数据。
  • 将大类压缩。压缩比例需要具体情况具体分析,取决于你所拥有的数据。例如,A类中有30个样本,B类中有4000个样本,那么你可以将B类压缩成1000(进行采样)。
  • 可以结合1与2
  • 对于那种极小类是异常点的分类任务,因此分类器需要学习到大类的决策分界面,即分类器是一个单个类分类器(One Class Classifier)。Weka中有相关的库
  • 获得更多的数据。

Roar Nybø的回答:

  • 对小类进行过采样。并且使用集成模式会获得更好的效果。

Dan Levin的回答:

  • 一个很好的方法去处理非平衡数据问题,并且在理论上证明了。这个方法便是由Robert E. Schapire于1990年在Machine Learning提出的”The strength of weak learnability” ,该方法是一个boosting算法,它递归地训练三个弱学习器,然后将这三个弱学习器结合起形成一个强的学习器。我们可以使用这个算法的第一步去解决数据不平衡问题。 
      首先使用原始数据集训练第一个学习器L1。 
      然后使用50%在L1学习正确和50%学习错误的的那些样本训练得到学习器L2,即从L1中学习错误的样本集与学习正确的样本集中,循环一边采样一个。 
      接着,使用L1与L2不一致的那些样本去训练得到学习器L3。 
      最后,使用投票方式作为最后输出。 
      那么如何使用该算法来解决类别不平衡问题呢? 
      假设是一个二分类问题,大部分的样本都是true类。让L1输出始终为true。使用50%在L1分类正确的与50%分类错误的样本训练得到L2,即从L1中学习错误的样本集与学习正确的样本集中,循环一边采样一个。因此,L2的训练样本是平衡的。L使用L1与L2分类不一致的那些样本训练得到L3,即在L2中分类为false的那些样本。最后,结合这三个分类器,采用投票的方式来决定分类结果,因此只有当L2与L3都分类为false时,最终结果才为false,否则true。 
      自己已经在实践中使用过很多次,并且效果都不错。

Kaushik Kasi的回答:

  • 对小类中的样本进行复制以增加该类中的样本数,但是可能会增加bias。
  • 对小类中的样本通过调整特征值来人工生成样本,而使得该类中样本个数增多。如在图像中,对一幅图像进行扭曲得到另一幅图像,即改变了原图像的某些特征值。但是该方法可能会产生现实中并存在的样本。

Quora User的回答:

  • 简单快速的方法:对大类欠采样或者对小类过采样。
  • 更有效的方法:使用代价函数学习得到每个类的权值,大类的权值小,小类的权值大。刚开始,可以设置每个类别的权值与样本个数比例的倒数,然后可以使用过采样进行调优。

Dayvid Victor的回答:

  在类别不平衡中,以下几个点需要注意:

  • 常规的分类评价指标可能会失效,比如将所有的样本都分类成大类,那么准确率、精确率等都会很高。这种情况下,AUC时最好的评价指标。
  • 你能够使用原型选择技术去降低不平衡水平。选择那些重要的样本。One-Sided Selection (OSS) 是一个预处理技术(模型训练之前使用),能够处理类别不平衡问题。
  • 从另一个角度,可以增加小类的样本个数,可以使用过采样与原型生成技术(prototype-generation techniques)。
  • 在K-Fold 校验中,每一份数据集中原则上应该保持类别样本比例一样或者近似,如果每份数据集中小类样本数目过少,那么应该降低K的值,知道小类样本的个数足够。 
      一般来说,如果事前不对不平衡问题进行处理,那么对于小类别的样本则会错误率很高,即大部分甚至全部小类样本都会分错。

Muktabh Mayank的回答:

Sandeep Subramanian的回答:

Quora User的回答:

  • 赋予小类样本更高的训练权值
  • 对小类进行过采样
  • 某些时候,高不平衡性下仍然可以得到效果较好的训练结果。我认为对于某些评价指标是有意义的,如AUC。

Sumit Soman 的回答:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

样本不平衡问题分析与部分解决办法 的相关文章

  • 这个 NLP 问题层次结构描述中的最大池化是什么类型

    我正在尝试实现这个描述以及我所做的 我生成了形状的 uni gram bi gram tri gram 15 512 使用填充 然后对于每个单词 我连接三个特征向量 3 512 然后我向他们申请 Globalmaxpooling1D 我不知
  • Blenderbot 微调

    我一直在尝试微调 HuggingFace 的对话模型 Blendebot 我已经尝试过官方拥抱脸网站上给出的传统方法 该方法要求我们使用 trainer train 方法来完成此操作 我使用 compile 方法尝试了它 我尝试过使用 Py
  • 生成易于记忆的随机标识符

    与所有开发人员一样 我们在日常工作中不断处理某种标识符 大多数时候 它与错误或支持票有关 我们的软件在检测到错误后 会创建一个包 该包的名称由时间戳和版本号格式化 这是创建合理唯一标识符以避免混淆包的一种廉价方法 例子 错误报告 20101
  • 如何训练斯坦福 NLP 情感分析工具

    地狱大家 我正在使用斯坦福核心 NLP 包 我的目标是对推文直播进行情感分析 按原样使用情感分析工具对文本 态度 的分析非常差 许多积极因素被标记为中性 许多消极因素被评为积极 我已经在文本文件中获取了超过一百万条推文 但我不知道如何实际获
  • NLTK 中的无监督 HMM 训练

    我只是想进行非常简单的无监督 HMM 训练nltk http www nltk org 考虑 import nltk trainer nltk tag hmm HiddenMarkovModelTrainer from nltk corpu
  • Fine-Tuning DistilBertForSequenceClassification:不是学习,为什么loss没有变化?权重没有更新?

    我对 PyTorch 和 Huggingface transformers 比较陌生 并对此尝试了 DistillBertForSequenceClassificationKaggle 数据集 https www kaggle com c
  • 举例解释bpe(字节对编码)?

    有人可以帮忙解释一下背后的基本概念吗BPE模型 除了这张纸 https arxiv org abs 1508 07909 目前还没有那么多解释 到目前为止我所知道的是 它通过将罕见和未知的单词编码为子词单元序列来实现开放词汇表上的 NMT
  • 使用“自然”语言编写代码更好吗?

    我最近看到一种编程语言叫做超新星 http supernova sourceforge net 他们在网页上说 超新星编程语言是 现代脚本语言和 第一个提出了概念 用直接虚构进行编程 描述使用 纯人类语言的清晰子集 你可以编写如下代码 i
  • Lucene 标准分析器与 Snowball

    刚刚开始使用 Lucene Net 我使用标准分析器索引了 100 000 行 运行了一些测试查询 并注意到如果原始术语是单数 则复数查询不会返回结果 我知道雪球分析器增加了词干支持 这听起来不错 不过 我想知道 超过标准的雪球锣是否有任何
  • nltk 标记化和缩写

    我用 nltk 对文本进行标记 只是将句子输入到 wordpunct tokenizer 中 这会拆分缩写 例如 don t 到 don t 但我想将它们保留为一个单词 我正在改进我的方法 以实现更精确的文本标记化 因此我需要更深入地研究
  • spacy 如何使用词嵌入进行命名实体识别 (NER)?

    我正在尝试使用以下方法训练 NER 模型spaCy识别位置 人 名和组织 我试图理解如何spaCy识别文本中的实体 但我无法找到答案 从这个问题 https github com explosion spaCy issues 491在 Gi
  • NLTK 可用的停用词语言

    我想知道在哪里可以找到 NLTK 停用词支持的语言 及其键 的完整列表 我找到一个列表https pypi org project stop words https pypi org project stop words 但它不包含每个国家
  • 如何使用Bert进行长文本分类?

    我们知道 BERT 有 token 的最大长度限制 512 因此如果一篇文章的长度远大于 512 例如文本中有 10000 个 token 如何使用 BERT 您基本上有三个选择 您可以剪掉较长的文本并仅使用前 512 个令牌 最初的 BE
  • 如何从Python中的阿拉伯字符串中删除英文文本?

    我有一个带有英文文本和标点符号的阿拉伯字符串 我需要过滤阿拉伯文本 我尝试使用 sting 删除标点符号和英语单词 但是 我失去了阿拉伯语单词之间的空格 我哪里错了 import string exclude set string punc
  • 使用 NLTK 生成字典以将推文分类为预定义类别

    我有一个 Twitter 用户 screen names 列表 我需要根据他们的兴趣领域将他们分为 7 个预定义类别 教育 艺术 体育 商业 政治 汽车 技术 我用 Python 提取了用户的最后 100 条推文 并在清理推文后为每个用户创
  • 如何改进 NLTK 中的荷兰语 NER 词块划分器

    感谢这个伟大的答案 我使用 NLTK 和 Conll2002 语料库训练自己的荷兰语 NE 词块划分器 有了一个良好的开端 NLTK 荷兰语命名实体识别 https stackoverflow com questions 11293149
  • 更换色谱柱时出现稀疏效率警告

    def tdm modify feature names tdm non useful words kill stampede trigger cause death hospital minister said told say inju
  • BERT 获取句子嵌入

    我正在复制代码这一页 https colab research google com drive 1yFphU6PW9Uo6lmDly ud9a6c4RCYlwdX 我已将 BERT 模型下载到本地系统并获取句子嵌入 我有大约 500 00
  • 如何在 scikit-learn 的 SVM 中使用非整数字符串标签? Python

    Scikit learn 具有相当用户友好的用于机器学习的 python 模块 我正在尝试训练用于自然语言处理 NLP 的 SVM 标记器 其中我的标签和输入数据是单词和注释 例如 词性标记 而不是使用双精度 整数数据作为输入元组 1 2
  • 在具有不平衡数据的管道中进行交叉验证的正确方法

    对于给定的不平衡数据 我创建了一种不同的标准化管道和一种热编码 numeric transformer Pipeline steps scaler StandardScaler categorical transformer Pipelin

随机推荐

  • java实现获取两个list交集,并集,差集

    import java util ArrayList import java util List import static java util stream Collectors toList public class Main publ
  • java读取文件方法大全

    一 多种方式读文件内容 1 按字节读取文件内容 2 按字符读取文件内容 3 按行读取文件内容 4 随机读取文件内容 import java io BufferedReader import java io File import java
  • PHP性能优化

    PHP性能优化首先分为三个方向 PHP语言级别的性能优化 gt PHP周边问题的性能优化 gt PHP自身优化 一 PHP语言级别的性能优化 1 多使用PHP 的内置函数 2 少使用错误抑制符 会产生额外的opcode开销 opcode 当
  • 练习二、用JS语言输入数组并判断是否数组,并从小到大进行冒泡排序

    功能描述 在界面输入以逗号间隔开的字符串 转换成数组并判断是否有效 有效即进行排序 选择冒泡排序 主要考点 以输入框为输入参数入口 进行逐步推导 2 1 输入框是字符串需要转换成数组 2 2 一个输入框 要是输入双位数还是会分割成 单位数值
  • Linux中在线yum源的配置

    在线源的配置 配置环境 root localhost cat etc redhat release CentOS release 6 5 Final root localhost uname r 2 6 32 431 el6 x86 64
  • c语言六子棋(Alpha-Beta剪枝算法)

    c语言Alpha Beta剪枝算法六子棋 介绍 Alpha Beta剪枝算法是一种用于优化博弈树搜索的算法 可以在搜索过程中减少不必要的计算 从而提高搜索效率 该算法常用于博弈游戏 如六子棋 六子棋是一种类似于五子棋的棋类游戏 在一个六边形
  • 响应支付宝宣布的刷脸支付商业化

    二维码普及才没多久 刷脸支付已经悄无声息的走进我们的生活 刷脸支付作为一种全新的支付方式 将彻底改变人类的生活方式 有些人感慨道 这个时代变化太快了 快到一切技术的发展犹如坐上了火箭 去年8月中下旬 广电运通与深圳地铁腾讯共同打造生物识别
  • 为什么选择SpringCloud

    SpringCloud的诞生 SpringCloud是集成了众多开源的框架 利用SpringBoot的开发便利性实现服务治理 服务注册与发现 负载均衡 数据监控 REST API发布方式等 基本囊括了分布式框架所需要的所有功能 是一套易开放
  • 饮冰l于 2021-02-05 15:16:54 发布 1288收藏 11分类专栏: 图 文章标签: 算法 数据挖掘 机器学习 深度学习版权图 专栏收录该内容66 篇文章 23 订阅订

    前言 本文的作者认为对于 GNN 的可解释性不足 基于此 作者在节点分类任务上提出可以通过将忽略图结构的浅层模型与两个利用标签结构中相关性的后处理方法相结合 超越或匹配最先进的 GNN 具体如下 i 误差相关性 传播训练数据中的残余误差以纠
  • CMake编程实践(五) 编译静态库和动态库

    使用Cmake 编译库 本篇使用CMake编译一个动态库和静态库 并安装到系统中 对应的工程是cmake utilsbox lib 编译静态库 指定编译静态库 关键词为static 不添加关键字默认静态库 add library utils
  • 存档用【20考研】国家线/34所自划线 集合!【计算机和软件专业】

    为了同学们更方便快捷的了解34所院校的自划线和国家分数线 小编在这里开了一个专区 提供给同学们计算机 软件工程等相关专业的考研分数线 这是20考研的数据 我发现当时没有发 现在发一下存档用的 不发没办法设置链接 什么是A类 什么是B类 可以
  • 【Windows】如何使用Windbg检测Windows程序内存泄漏

    文章目录 使用Windbg检测Windows程序内存泄漏的步骤如下 启动程序 使用Windbg启动需要检测内存泄漏的程序 可以通过在Windbg中选择 文件 gt 打开程序 来打开程序 设置符号路径 在Windbg中 可以通过设置符号路径来
  • python 多线程模拟多用户访问接口

    coding utf 8 import threading import requests from urllib parse import quote 定义访问接口的函数 def access api user id params E4
  • Kafka数据丢失原因及解决方案

    Kafka包括Producer Broker Consumer 因此从这三个方面分析 Producer端 丢失原因 Kafka在Producer端的消息发送采用的是异步发送的方式 还有同步发送 但是同步发送会导致消息阻塞 需要等待 丢失数据
  • XSS漏洞学习

    原理 XSS攻击通常指的是通过利用网页开发时留下的漏洞 通过巧妙的方法注入恶意指令代码到网页 使用户加载并执行攻击者恶意制造的网页程序 这些恶意网页程序通常是JavaScript 但实际上也可以包括Java VBScript ActiveX
  • openmpi参数_Open MPI的目标、概念及实现

    目前 许多可用的MPI实现只关注HPC 高性能计算 的部分方面或是专注于解决某个具体问题 这导致了这些MPI实现不兼容 如果独立安装组合来获取它们的特有功能 Open MPI是在LAM MPI LA MPI and FT MPI的基础上的一
  • 目标检测如何计算召回率_目标检测+准确率、召回率、PR曲线、AP、mAp、mmAp

    查准率 查全率 AP map 参考知乎地址 https zhuanlan zhihu com p 94597205 TP True Positive 一个正确的检测 检测的IOU threshold 即预测的边界框 bounding box
  • JavaScript中常用的三种弹窗

    目录 一 alert 警告框 二 confirm 确认框 三 prompt 提示框 JavaScript 中可以创建三种消息框 警告框 确认框 提示框 一 alert 警告框 alert 方法是显示一条弹出提示消息和确认按钮的警告框 需要注
  • 【js】删除数组中的指定元素,且不改变原数组

    笨办法 export function remove arr item let result arr forEach function element if element item result push element return r
  • 样本不平衡问题分析与部分解决办法

    最近工作中在处理文本分类问题遇到了分类不均衡的问题 主要还是样本太少还同时非常的不均衡正负样本1 10 类别不平衡比例超过4 1 就会造成偏移 就使用了SMOTE方法 注意 在进行数据增广的时候一定要将测试集和验证集单独提前分开 扩张只在训