nydus官网论坛退款多久到

从重采样到数据合成:如何处理机器学习中的不平衡分类问题?
选自Analytics Vidhya作者:Upasana Mukherjee机器之心编译参与:马亚雄、微胖、黄小天、吴攀如果你研究过一点机器学习和数据科学,你肯定遇到过不平衡的类分布(imbalanced class distribution)。这种情况是指:属于某一类别的观测样本的数量显著少于其它类别。这个问题在异常检测是至关重要的的场景中很明显,例如电力盗窃、银行的欺诈交易、罕见疾病识别等。在这种情况下,利用传统机器学习算法开发出的预测模型可能会存在偏差和不准确。发生这种情况的原因是机器学习算法通常被设计成通过减少误差来提高准确率。所以它们并没有考虑类别的分布/比例或者是类别的平衡。这篇指南描述了使用多种采样技术来解决这种类别不平衡问题的各种方法。本文还比较了每种技术的优缺点。最后,本文作者还向我们展示了一种让你可以创建一个平衡的类分布的方法,让你可以应用专门为此设计的集成学习技术(ensemble learning technique)。本文作者为来自 KPMG 的数据分析顾问 Upasana Mukherjee。目录1. 不平衡数据集面临的挑战2. 处理不平衡数据集的方法3. 例证4. 结论1. 不平衡数据集面临的挑战当今公用事业行业面临的主要挑战之一就是电力盗窃。电力盗窃是全球第三大盗窃形式。越来越多的公用事业公司倾向于使用高级的数据分析技术和机器学习算法来识别代表盗窃的消耗模式。然而,最大的障碍之一就是海量的数据及其分布。欺诈性交易的数量要远低于正常和健康的交易,也就是说,它只占到了总观测量的大约 1-2%。这里的问题是提高识别罕见的少数类别的准确率,而不是实现更高的总体准确率。当面临不平衡的数据集的时候,机器学习算法倾向于产生不太令人满意的分类器。对于任何一个不平衡的数据集,如果要预测的事件属于少数类别,并且事件比例小于 5%,那就通常将其称为罕见事件(rare event)。不平衡类别的实例让我们借助一个实例来理解不平衡类别。例子:在一个公用事业欺诈检测数据集中,你有以下数据:总观测 = 1000欺诈观测 = 20非欺诈观测 = 980罕见事件比例 = 2%这个案例的数据分析中面临的主要问题是:对于这些先天就是小概率的异常事件,如何通过获取合适数量的样本来得到一个平衡的数据集?使用标准机器学习技术时面临的挑战面临不平衡数据集的时候,传统的机器学习模型的评价方法不能精确地衡量模型的性能。诸如决策树和 Logistic 回归这些标准的分类算法会偏向于数量多的类别。它们往往会仅预测占数据大多数的类别。在总量中占少数的类别的特征就会被视为噪声,并且通常会被忽略。因此,与多数类别相比,少数类别存在比较高的误判率。对分类算法的表现的评估是用一个包含关于实际类别和预测类别信息的混淆矩阵(Confusion Matrix)来衡量的。如上表所示,模型的准确率 = (TP+TN) / (TP+FN+FP+TP)然而,在不平衡领域时,准确率并不是一个用来衡量模型性能的合适指标。例如:一个分类器,在包含 2% 的罕见事件时,如果它将所有属于大部分类别的实例都正确分类,实现了 98% 的准确率;而把占 2% 的少数观测数据视为噪声并消除了。不平衡类别的实例因此,总结一下,在尝试利用不平衡数据集解决特定业务的挑战时,由标准机器学习算法生成的分类器可能无法给出准确的结果。除了欺诈性交易,存在不平衡数据集问题的常见业务问题还有:识别客户流失率的数据集,其中绝大多数顾客都会继续使用该项服务。具体来说,电信公司中,客户流失率低于 2%。医疗诊断中识别罕见疾病的数据集自然灾害,例如地震使用的数据集这篇文章中,我们会展示多种在高度不平衡数据集上训练一个性能良好的模型的技术。并且用下面的欺诈检测数据集来精确地预测罕见事件:总观测 = 1000欺诈观测 = 20非欺诈性观测 = 980事件比例 = 2%欺诈类别标志 = 0(非欺诈实例)欺诈类别标志 = 1(欺诈实例)2. 处理不平衡数据集的方法2.1 数据层面的方法:重采样技术&处理不平衡数据集需要在往机器学习算法输入数据之前,制定诸如提升分类算法或平衡训练数据的类(数据预处理)的策略。后者因为应用范围广泛而更常使用。平衡分类的主要目标不是增加少数类的的频率就是降低多数类的频率。这样做是为了获得大概相同数量的两个类的实例。让我们一起看看几个重采样(resampling)技术:2.1.1 随机欠采样(Random Under-Sampling)随机欠采样的目标是通过随机地消除占多数的类的样本来平衡类分布;直到多数类和少数类的实例实现平衡,目标才算达成。总观测 = 1000欺诈性观察 = 20非欺诈性观察 = 980事件发生率 = 2%这种情况下我们不重复地从非欺诈实例中取 10% 的样本,并将其与欺诈性实例相结合。随机欠采样之后的非欺诈性观察 = 980 x 10% = 98结合欺诈性与非欺诈性观察之后的全体观察 = 20+98 = 118欠采样之后新数据集的事件发生率 = 20/118 = 17%优点它可以提升运行时间;并且当训练数据集很大时,可以通过减少样本数量来解决存储问题。缺点它会丢弃对构建规则分类器很重要的有价值的潜在信息。被随机欠采样选取的样本可能具有偏差。它不能准确代表大多数。从而在实际的测试数据集上得到不精确的结果。2.1.2 随机过采样(Random Over-Sampling)过采样(Over-Sampling)通过随机复制少数类来增加其中的实例数量,从而可增加样本中少数类的代表性。总观测 = 1000欺诈性观察 = 20非欺诈性观察 = 980事件发生率 = 2%这种情况下我们复制 20 个欺诈性观察 20 次。非欺诈性观察 = 980复制少数类观察之后的欺诈性观察 = 400过采样之后新数据集中的总体观察 = 1380欠采样之后新数据集的事件发生率 = 400/1380 = 29%优点与欠采样不同,这种方法不会带来信息损失。表现优于欠采样。缺点由于复制少数类事件,它加大了过拟合的可能性。2.1.3 基于聚类的过采样(Cluster-Based Over Sampling)在这种情况下,K-均值聚类算法独立地被用于少数和多数类实例。这是为了识别数据集中的聚类。随后,每一个聚类都被过采样以至于相同类的所有聚类有着同样的实例数量,且所有的类有着相同的大小。总观测 = 1000欺诈性观察 = 20非欺诈性观察 = 980事件发生率 = 2%多数类聚类&1. 聚类 1:150 个观察&2. 聚类 2:120 个观察&3. 聚类 3:230 个观察&4. 聚类 4:200 个观察&5. 聚类 5:150 个观察&6. 聚类 6:130 个观察少数类聚类&1. 聚类 1:8 个观察&2. 聚类 2:12 个观察每个聚类过采样之后,相同类的所有聚类包含相同数量的观察。多数类聚类&1. 聚类 1:170 个观察&2. 聚类 2:170 个观察&3. 聚类 3:170 个观察&4. 聚类 4:170 个观察&5. 聚类 5:170 个观察&6. 聚类 6:170 个观察少数类聚类&1. 聚类 1:250 个观察&2. 聚类 2:250 个观察基于聚类的过采样之后的事件率 = 500/ () = 33 %优点这种聚类技术有助于克服类之间不平衡的挑战。表示正例的样本数量不同于表示反例的样本数量。有助于克服由不同子聚类组成的类之间的不平衡的挑战。每一个子聚类不包含相同数量的实例。缺点正如大多数过采样技术,这一算法的主要缺点是有可能过拟合训练集。2.1.4 信息性过采样:合成少数类过采样技术(SMOTE)这一技术可用来避免过拟合——当直接复制少数类实例并将其添加到主数据集时。从少数类中把一个数据子集作为一个实例取走,接着创建相似的新合成的实例。这些合成的实例接着被添加进原来的数据集。新数据集被用作样本以训练分类模型。总观测 = 1000欺诈性观察 = 20非欺诈性观察 = 980事件发生率 = 2%从少数类中取走一个包含 15 个实例的样本,并生成相似的合成实例 20 次。生成合成性实例之后,创建下面的数据集少数类(欺诈性观察)= 300多数类(非欺诈性观察)= 980事件发生率 = 300/1280 = 23.4 %优点通过随机采样生成的合成样本而非实例的副本,可以缓解过拟合的问题。不会损失有价值信息。缺点当生成合成性实例时,SMOTE 并不会把来自其他类的相邻实例考虑进来。这导致了类重叠的增加,并会引入额外的噪音。SMOTE 对高维数据不是很有效。图 1:合成少数类过采样算法,其中 N 是属性的数量图 2:借助 SMOTE 的合成实例生成2.15 改进的合成少数类过采样技术(MSMOTE)这是 SMOTE 的改进版本,SMOTE 没有考虑数据集中少数类和潜在噪声的基本分布。所以为了提高 SMOTE 的效果,MSMOTE 应运而生。该算法将少数类别的样本分为 3 个不同的组:安全样本、边界样本和潜在噪声样本。分类通过计算少数类的样本和训练数据的样本之间的距离来完成。安全样本是可以提高分类器性能的那些数据点。而另一方面,噪声是可以降低分类器的性能的数据点。两者之间的那些数据点被分类为边界样本。虽然 MSOMTE 的基本流程与 SMOTE 的基本流程相同,在 MSMOTE 中,选择近邻的策略不同于 SMOTE。该算法是从安全样本出发随机选择 k-最近邻的数据点,并从边界样本出发选择最近邻,并且不对潜在噪声样本进行任何操作。2.2 算法集成技术(Algorithmic Ensemble Techniques)上述部分涉及通过重采样原始数据提供平衡类来处理不平衡数据,在本节中,我们将研究一种替代方法:修改现有的分类算法,使其适用于不平衡数据集。集成方法的主要目的是提高单个分类器的性能。该方法从原始数据中构建几个两级分类器,然后整合它们的预测。图 3:基于集成的方法2.2.1 基于 Bagging 的方法Bagging 是 Bootstrap Aggregating 的缩写。传统的 Bagging 算法包括生成「n」个不同替换的引导训练样本,并分别训练每个自举算法上的算法,然后再聚合预测。Bagging 常被用于减少过拟合,以提高学习效果生成准确预测。与 boosting 不同,bagging 方法允许在自举样本中进行替换。图 4:Bagging 方法总观测= 1000欺诈观察= 20非欺诈观察= 980事件率= 2%从具有替换的群体中选择 10 个自举样品。每个样本包含 200 个观察值。每个样本都不同于原始数据集,但类似于分布和变化上与该数据集类似。机器学习算法(如 logistic 回归、神经网络与决策树)拟合包含 200 个观察的自举样本,且分类器 c1,c2 ... c10 被聚合以产生复合分类器。这种集成方法能产生更强的复合分类器,因为它组合了各个分类器的结果。优点提高了机器学习算法的稳定性与准确性减少方差减少了 bagged 分类器的错误分类在嘈杂的数据环境中,bagging 的性能优于 boosting缺点bagging 只会在基本分类器效果很好时才有效。错误的分类可能会进一步降低表现。2.2.2. 基于 Boosting 的方法Boosting 是一种集成技术,它可以将弱学习器结合起来创造出一个能够进行准确预测的强大学习器。Boosting 开始于在训练数据上准备的基本分类器/弱分类器。基本学习器/分类器是弱学习器,即预测准确度仅略好于平均水平。弱是指当数据的存在小变化时,会引起分类模型出现大的变化。在下一次迭代中,新分类器将重点放在那些在上一轮中被错误分类的案例上。图 5:Boosting 方法2.2.2.1 自适应 boosting——Ada BoostAda Boost 是最早的 boosting 技术,其能通过许多弱的和不准确的规则的结合来创造高准确度的预测。其中每个训练器都是被串行地训练的,其目标在每一轮正确分类上一轮没能正确分类的实例。对于一个学习过的分类器,如果要做出强大的预测,其应该具备以下三个条件:规则简单分类器在足够数量的训练实例上进行了训练分类器在训练实例上的训练误差足够低每一个弱假设都有略优于随机猜测的准确度,即误差项 EUR (t) 应该略大约
1/2 -β,其中 β&0。这是这种 boosting 算法的基础假设,其可以产生一个仅有一个很小的误差的最终假设。在每一轮之后,它会更加关注那些更难被分类的实例。这种关注的程度可以通过一个权重值(weight)来测量。起初,所有实例的权重都是相等的,经过每一次迭代之后,被错误分类的实例的权重会增大,而被正确分类的实例的权重则会减小。图 6:自适应 boosting 的方法比如如果有一个包含了 1000 次观察的数据集,其中有 20 次被标记为了欺诈。刚开始,所有的观察都被分配了相同的权重 W1,基础分类器准确分类了其中 400 次观察。然后,那 600 次被错误分类的观察的权重增大为 W2,而这 400 次被正确分类的实例的权重减小为 W3。在每一次迭代中,这些更新过的加权观察都会被送入弱的分类器以提升其表现。这个过程会一直持续,直到错误分类率显著降低,从而得到一个强大的分类器。优点非常简单就能实现可以很好地泛化——适合任何类型的分类问题且不易过拟合缺点对噪声数据和异常值敏感2.2.2.2 梯度树 boosting在梯度 Boosting(Gradient Boosting)中,许多模型都是按顺序训练的。其是一种数值优化算法,其中每个模型都使用梯度下降(Gradient Descent)方法来最小化损失函数 y = ax+b+e。在梯度 Boosting 中,决策树(Decision Tree)被用作弱学习器。尽管 Ada Boost 和梯度 Boosting 都是基于弱学习器/分类器工作的,而且都是在努力使它们变成强大的学习器,但这两种方法之间存在一些显著的差异。Ada Boost 需要在实际的训练过程之前由用户指定一组弱学习器或随机生成弱学习器。其中每个学习器的权重根据其每步是否正确执行了分类而进行调整。而梯度 Boosting 则是在训练数据集上构建第一个用来预测样本的学习器,然后计算损失(即真实值和第一个学习器的输出之间的差),然后再使用这个损失在第二个阶段构建改进了的学习器。在每一个步骤,该损失函数的残差(residual)都是用梯度下降法计算出来的,而新的残差会在后续的迭代中变成目标变量。梯度 Boosting 可以通过 R 语言使用 SAS Miner 和 GBM 软件包中的 Gradient Boosting Node 实现。图 7:梯度 Boosting 方法比如,如果有一个包含了 1000 次观察的训练数据集,其中有 20 次被标记为了欺诈,并且还有一个初始的基础分类器。目标变量为 Fraud,当交易是欺诈时,Fraud=1;当交易不是欺诈时,Fraud=0.比如说,决策树拟合的是准确分类仅 5 次观察为欺诈观察的情况。然后基于该步骤的实际输出和预测输出之间的差,计算出一个可微的损失函数。该损失函数的这个残差是下一次迭代的目标变量 F1。类似地,该算法内部计算该损失函数,并在每个阶段更新该目标,然后在初始分类器的基础上提出一个改进过的分类器。缺点梯度增强过的树比随机森林更难拟合梯度 Boosting 算法通常有 3 个可以微调的参数:收缩(shrinkage)参数、树的深度和树的数量。要很好拟合,每个参数都需要合适的训练。如果这些参数没有得到很好的调节,那么就可能会导致过拟合。2.2.2.3 XGBoostXGBoost(Extreme Gradient Boosting/极限梯度提升)是 Gradient Boosting 算法的一种更先进和更有效的实现。相对于其它 Boosting 技术的优点:速度比普通的 Gradient Boosting 快 10 倍,因为其可以实现并行处理。它是高度灵活的,因为用户可以自定义优化目标和评估标准,其具有内置的处理缺失值的机制。和遇到了负损失就会停止分裂节点的 Gradient Boosting 不同,XGBoost 会分裂到指定的最大深度,然后会对其树进行反向的剪枝(prune),移除仅有一个负损失的分裂。XGBoost 可以使用 R 和 Python 中的 XGBoost 包实现。3. 实际案例3.1 数据描述这个例子使用了电信公司的包含了 47241 条顾客记录的数据集,每条记录包含的信息有 27 个关键预测变量罕见事件数据集的数据结构如下,缺失值删除、异常值处理以及降维从这里下载数据集:/wp-content/uploads/63705/SampleData_IMC.csv3.2 方法描述使用合成少数类过采样技术(SMOTE)来平衡不平衡数据集——该技术是试图通过创建合成实例来平衡数据集。下面以 R 代码为例,示范使用 Gradient Boosting 算法来训练平衡数据集。R 代码# 加载数据rareevent_boost &- read.table("D:/Upasana/RareEvent/churn.txt",sep="|", header=TRUE) dmy&-dummyVars("~.",data=rareevent_boost) rareeventTrsf&-data.frame(predict(dmy,newdata= rareevent_boost)) set.seed(10) sub &- sample(nrow(rareeventTrsf), floor(nrow(rareeventTrsf) * 0.9)) sub1 &- sample(nrow(rareeventTrsf), floor(nrow(rareeventTrsf) * 0.1)) training &- rareeventTrsf [sub, ] testing &- rareeventTrsf [-sub, ] training_sub&- rareeventTrsf [sub1, ] tables(training_sub) head(training_sub)# 对于不平衡的数据集 #install.packages("unbalanced") library(unbalanced) data(ubIonosphere) n&-ncol(rareevent_boost) output&- rareevent_boost $CHURN_FLAG output&-as.factor(output) input&- rareevent_boost [ ,-n] View(input)# 使用 ubSMOTE 来平衡数据集 #data&-ubBalance(X= input, Y=output, type="ubSMOTE", percOver=300, percUnder=150, verbose=TRUE View(data)# 平衡的数据集 #balancedData&-cbind(data$X,data$Y) View(balancedData) table(balancedData$CHURN_FLAG)# 写入平衡的数据集来训练模型 #write.table(balancedData,"D:/ Upasana/RareEvent /balancedData.txt", sep="\t", row.names=FALSE)# 创建 Boosting 树模型 #repalceNAsWithMean &- function(x) {replace(x, is.na(x), mean(x[!is.na(x)]))} training &- repalceNAsWithMean(training) testing &- repalceNAsWithMean(testing)# 重采样技术 #View(train_set) fitcontrol&-trainControl(method="repeatedcv",number=10,repeats=1,verbose=FALSE) gbmfit&-train(CHURN_FLAG~.,data=balancedData,method="gbm",verbose=FALSE)# 为测试数据评分 #testing$score_Y=predict(gbmfit,newdata=testing,type="prob")[,2] testing$score_Y=ifelse(testing$score_Y&0.5,1,0) head(testing,n=10) write.table(testing,"D:/ Upasana/RareEvent /testing.txt", sep="\t", row.names=FALSE) pred_GBM&-prediction(testing$score_Y,testing$CHURN_FLAG)# 模型的表现 #model_perf_GBM &- performance(pred_GBM, "tpr", "fpr") model_perf_GBM1 &- performance(pred_GBM, "tpr", "fpr") model_perf_GBM pred_GBM1&-as.data.frame(model_perf_GBM) auc.tmp_GBM &- performance(pred_GBM,"auc") AUC_GBM &- as.numeric(auc.tmp_GBM@y.values) auc.tmp_GBM结果这个在平衡数据集上使用了 SMOTE 并训练了一个 gradient boosting 算法的平衡数据集的办法能够显著改善预测模型的准确度。较之平常分析建模技术(比如 logistic 回归和决策树),这个办法将其 lift 提升了 20%,精确率也提升了 3 到 4 倍。4. 结论遇到不平衡数据集时,没有改善预测模型准确性的一站式解决方案。你可能需要尝试多个办法来搞清楚最适合数据集的采样技术。在绝大多数情况下,诸如 SMOTE 以及 MSMOTE 之类的合成技术会比传统过采样或欠采样的办法要好。为了获得更好的结果,你可以在使用诸如 Gradeint boosting 和 XGBoost 的同时也使用 SMOTE 和 MSMOTE 等合成采样技术。通常用于解决不平衡数据集问题的先进 bagging 技术之一是 SMOTE bagging。这个办法采取了一种完全不同于传统 bagging 技术的办法来创造每个 Bag/Bootstrap。通过每次迭代时设置一个 SMOTE 重采样率,它可以借由 SMOTE 算法生成正例。每次迭代时,负例集会被 bootstrap。不平衡数据集的特点不同,最有效的技术也会有所不同。对比模型时要考虑相关评估参数。在对比通过全面地结合上述技术而构建的多个预测模型时,ROC 曲线下的 Lift & Area 将会在决定最优模型上发挥作用。参考文献1. Dmitry Pavlov, Alexey Gorodilov, Cliff Brunk「BagBoo: A Scalable Hybrid Bagging-theBoosting Model」.20102. Fithria Siti Hanifah , Hari Wijayanto , Anang Kurnia「SMOTE Bagging Algorithm for Imbalanced Data Set in Logistic Regression Analysis」. Applied Mathematical Sciences, Vol. 9, 20153. Lina Guzman, DIRECTV「Data sampling improvement by developing SMOTE technique in SAS」.Paper 4. Mikel Galar, Alberto Fern?andez, Edurne Barrenechea, Humberto Bustince and Francisco Herrera「A Review on Ensembles for the Class Imbalance Problem: Baggng-, Boosting-, and Hybrid-Based Approaches」.2011 IEEE &原文地址:/blog/2017/03/imbalanced-classification-problem/机器之心编译,转载请联系本公众号获得授权。?------------------------------------------------加入机器之心(全职记者/实习生):投稿或寻求报道:广告&商务合作:
没有账号请
官方讨论群:
迅雷VIP群:
Copyright (C) , , All Rights Reserved. 业务QQ:
Powered by &&用R语言实现对不平衡数据的四种处理方法,电机值阻不平衡原因 - 帮帮忙资讯网
帮帮忙资讯网
&&&&&& & 正文 &
用R语言实现对不平衡数据的四种处理方法
时间: 04:43
点击:3243次
来自:网络原创
作者:PPV课大数据
在对不平衡的分类数据集进行建模时,机器学习算法可能并不稳定,其预测结果甚至可能是有偏的,而预测精度此时也变得带有误导性。那么,这种结果是为何发生的呢?到底是什么因素影响了这些算法的表现?
在不平衡的数据中,任一算法都没法从样本量少的类中获取足够的信息来进行精确预测。因此,机器学习算法常常…
在对不平衡的分类数据集进行建模时,机器学习算法可能并不稳定,其预测结果甚至可能是有偏的,而预测精度此时也变得带有误导性。那么,这种结果是为何发生的呢?到底是什么因素影响了这些算法的表现?在不平衡的数据中,任一算法都没法从样本量少的类中获取足够的信息来进行精确预测。因此,机器学习算法常常被要求应用在平衡数据集上。那我们该如何处理不平衡数据集?本文会介绍一些相关方法,它们并不复杂只是技巧性比较强。本文会介绍处理非平衡分类数据集的一些要点,并主要集中于非平衡二分类问题的处理。一如既往,我会尽量精简地叙述,在文末我会演示如何用R中的ROSE包来解决实际问题。什么是不平衡分类不平衡分类是一种有监督学习,但它处理的对象中有一个类所占的比例远远大于其余类。比起多分类,这一问题在二分类中更为常见。(注:下文中占比较大的类称为大类,占比较小的类称为小类)不平衡一词指代数据中响应变量(被解释变量)的分布不均衡,如果一个数据集的响应变量在不同类上的分布差别较大我们就认为它不平衡。举个例子,假设我们有一个观测数为100000的数据集,它包含了哈佛大学申请人的信息。众所周知,哈佛大学以极低的录取比例而闻名,那么这个数据集的响应变量(即:该申请人是否被录取,是为1,否为0)就很不平衡,大致98%的观测响应变量为0,只有2%的幸运儿被录取。在现实生活中,这类例子更是不胜枚举,我在下面列举了一些实例,请注意他们的不平衡度是不一样的。1.一个自动产品质量检测机每天会检测工厂生产的产品,你会发现次品率是远远低于合格率的。2.某地区进行了居民癌症普查,结果患有癌症的居民人数也是远远少于健康人群。3.在信用卡欺诈数据中,违规交易数比合规交易少不少。4.一个遵循6δ原则的生产车间每生产100万个产品才会产出10个次品。生活中的例子还有太多,现在你可以发现获取这些非平衡数据的可能性有多大,所以掌握这些数据集的处理方法也是每个数据分析师的必修课。为什么大部分机器学习算法在不平衡数据集上表现不佳?我觉得这是一个很有意思的问题,你不妨自己先动手试试,然后你就会了解把不平衡数据再结构化的重要性,至于如何再结构化,我会在操作部分中讲解。下面是机器学习算法在不平衡数据上精度下降的原因:响应变量的分布不均匀使得算法精度下降,对于小类的预测精度会很低。算法本身是精度驱动的,即该模型的目标是最小化总体误差,而小类对于总体误差的贡献很低。算法本身假设数据集的类分布均衡,同时它们也可能假定不同类别的误差带来相同的损失(下文会详细叙述)。针对不平衡数据的处理方法这类处理方法其实就是大名鼎鼎的“采样法”,总的说来,应用这些方法都是为了把不平衡数据修正为平衡数据。修正方法就是调整原始数据集的样本量,使得不同类的数据比例一致。而在诸多学者研究得出基于平衡数据的模型整体更优的结论后,这一类方法越来越受到分析师们的青睐。下列是一些具体的处理方法名称:欠采样法(Undersampling)过采样法(Oversampling)人工数据合成法(Synthetic Data Generation)代价敏感学习法(Cose Sensitive Learning)让我们逐一了解它们。1.欠采样法该方法主要是对大类进行处理。它会减少大类的观测数来使得数据集平衡。这一办法在数据集整体很大时较为适宜,它还可以通过降低训练样本量来减少计算时间和存储开销。欠采样法共有两类:随机(Random)的和有信息的(Informative)。随机欠采样法会随机删除大类的观测直至数据集平衡。有信息的欠采样法则会依照一个事先制定的准则来删去观测。有信息的欠采样中,利用简易集成算法(EasyEnsemble)和平衡级联算法(BalanceCascade)往往能得到比较好的结果。这两种算法也都很直白易懂。简易集成法:首先,它将从大类中有放回地抽取一些独立样本生成多个子集。然后,将这些子集和小类的观测合并,再基于合并后的数据集训练多个分类器,以其中多数分类器的分类结果为预测结果。如你所见,整个流程和无监督学习非常相似。平衡级联法:它是一种有监督的学习法,首先将生成多个分类器,再基于一定规则系统地筛选哪些大类样本应当被保留。但欠采样法有一个显而易见的缺陷,由于要删去不少观测,使用该方法会使得大类损失不少重要信息。2.过采样法这一方法针对小类进行处理。它会以重复小类的观测的方式来平衡数据。该方法也被称作升采样(Upsampling)。和欠采样类似,它也能分为随机过采样和有信息的过采样两类。随机过采样会将小类观测随机重复。有信息过采样也是遵循一定的准则来人工合成小类观测。使用该方法的一大优势是没有任何信息损失。缺点则是由于增加了小类的重复样本,很有可能导致过拟合(译者注:计算时间和存储开销也增大不少)。我们通过该方法可以在训练集上得到非常高的拟合精度,但在测试集上预测的表现则可能变得愈发糟糕。3.人工数据合成法简单说来,人工数据合成法是利用生成人工数据而不是重复原始观测来解决不平衡性。它也是一种过采样技术。在这一领域,SMOTE法(Synthetic Minority Oversampling Technique)是有效而常用的方法。该算法基于特征空间(而不是数据空间)生成与小类观测相似的新数据(译者注:总体是基于欧氏距离来度量相似性,在特征空间生成一些人工样本,更通俗地说是在样本点和它近邻点的连线上随机投点作为生成的人工样本,下文叙述了这一过程但有些晦涩)。我们也可以说,它生成了小类观测的随机集合来降低分类器的误差。为了生成人工数据,我们需要利用自助法(Bootstrapping)和K近邻法(K-neraest neighbors)。详细步骤如下:计算样本点间的距离并确定其近邻。生成一个0到1上的均匀随机数,并将其乘以距离。把第二步生成的值加到样本点的特征向量上。这一过程等价于在在两个样本的连线上随机选择了一个点。R中有一个包专门用来实现SMOTE过程,我们将在实践部分做演示。4.代价敏感学习(CSL)这是另一种常用且有意思的方法。简而言之,该方法会衡量误分类观测的代价来解决不平衡问题。这方法不会生成平衡的数据集,而是通过生成代价矩阵来解决不平衡问题。代价矩阵是描述特定场景下误分类观测带来的损失的工具。近来已有研究表明,代价敏感学习法很多时候比采样法更优,因此这种方法也值得一学。让我们通过一个例子来了解该方法:给定一个有关行人的数据集,我们想要了解行人是否会携带炸弹。数据集包含了所有的必要信息,且携带炸弹的人会被标记为正类,不带炸弹的就是负类。现在问题来了,我们需要把行人都分好类。让我们先来设定下这一问题的代价矩阵。如果我们将行人正确分类了,我们不会蒙受任何损失。但如果我们把一个恐怖分子归为负类(False Negative),我们要付出的代价会比把和平分子归为正类(False Positive)的代价大的多。代价矩阵和混淆矩阵类似,如下所示,我们更关心的是伪正类(FP)和伪负类(FN)。只要观测被正确分类,我们不会有任何代价损失。该方法的目标就是找到一个使得总代价最小的分类器Total Cost = C(FN)xFN + C(FP)xFP其中,FN是被误分类的正类样本数FP是被误分类的负类样本数C(FN)和C(FP)分别代表FN和FP带来的损失。本例中C(FN) > C(FP)除此之外,我们还有其他的比较前沿的方法来处理不平衡样本。比如基于聚类的采样法(Cluster based sampling),自适应人工采样法(adaptive synthetic sampling),边界线SMOTE(border line SMOTE),SMOTEboost,DataBoost-IM,核方法等。这些方法的基本思想和前文介绍的四类方法大同小异。还有一些更直观的方法可以帮助你提升预测效果:如利用聚类技术,把大类分为K个次类,每个此类的样本不重叠。再基于每个次类和小类的合并样本来训练分类器。最后把各个分类结果平均作为预测值。除此之外,也可以聚焦于获取更多数据来提高小类的占比。应当使用哪类评价测度来评判精度?选择合适的评价测度是不平衡数据分析的关键步骤。大部分分类算法仅仅通过正确分类率来衡量精度。但在不平衡数据中,使用这种方法有很大的欺骗性,因为小类对于整体精度的影响太小。混淆矩阵混淆矩阵和代价矩阵的差异就在于代价矩阵提供了跟多的误分类损失信息,其对角元素皆为0。而混淆举证只提供了TP,TN,FP,FN四类样本的比例,它常用的统计量则为正确率和错误率:Accuracy: (TP + TN)/(TP+TN+FP+FN)Error Rate = 1 – Accuracy = (FP+FN)/(TP+TN+FP+FN)如前文所提,混淆矩阵可能会提供误导性结果,并且它对数据变动非常敏感。更进一步,我们可以从混淆矩阵衍生出很多统计量,其中如下测度就提供了关于不平衡数据精度的更好度量:准确率(Preciosion):正类样本分类准确性的度量,即被标记为正类的观测中被正确分类的比例。Precision = TP / (TP + FP)召回率(Recall):所有实际正类样本被正确分类的比率。也被称作敏感度(Sensitivity)Recall = TP / (TP + FN)F测度(F measure):结合准确率和召回率作为分类有效性的测度。具体公式如下(ss常取1):F measure = ((1 + β)? × Recall × Precision) / ( β? × Recall + Precision )尽管这些测度比正确率和错误率更好,但总的说来对于衡量分类器而言还不够有效。比如,准确率无法刻画负类样本的正确率。召回率只针对实际正类样本的分类结果。这也就是说,我们需要寻找更好的测度来评价分类器。谢天谢地!我们可以通过ROC(Receiver Operationg Characterstics)曲线来衡量分类预测精度。这也是目前广泛使用的评估方法。ROC曲线是通过绘制TP率(Sensitivity)和FP率(Specificity)的关系得到的。Specificity = TN / (TN + FP)ROC图上的任意一点都代表了单个分类器在一个给定分布上的表现。ROC曲线之所以有用是因为它提供了分类数据收益(TP)和损失(FP)的可视化信息。ROC曲线下方区域的面积(AUC)越大,整体分类精度就越高。但有时ROC曲线也会失效,它的不足包括:对于偏态分布的数据,可能会高估精度没有提供分类表现的置信区间无法提供不同分类器表现差异的显著性水平作为一种替代方法,我们也可以选择别的可视化方式比如PR曲线和代价曲线。特别地,代价曲线被认为有以图形方式描述分类器误分类代价的能力。但在90%的场合中,ROC曲线已经足够好。在R中进行不平衡数据分类我们已经学习了不平衡分类的一些重要理论技术。是时候来应用它们了!在R中,诸如ROSE包和EMwR包都可以帮助我们快速实现采样过程。我们将以一个二分类案例做演示。ROSE(Random Over Sampling Examples)包可以帮助我们基于采样和平滑自助法(smoothed bootstrap)来生成人工样本。这个包也提供了一些定义良好的函数来快速完成分类任务。让我们开始吧# 设定工作目录setwd("C:/Users/manish/desktop/Data)# 安装包(“ROSE”)library(ROSE)ROSE包中内置了一个叫做hacide的不平衡数据集,它包括和两个部分,让我们把它读入R环境:data(hacide)str()'': 1000 obs. of 3 variables:$ cls: Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...$ x1 : num 0.6 0.4 0.6008 ...$ x2 : num 0.678 1.5 -0.4 ...如你所见,数据集有3个变量的1000个观测。cls是响应变量,x1和x2是解释变量。让我们检查下cls的不平衡程度:# 检查cls的不平衡度table($cls)0
20# 检查cls的分布(table($cls))0
0.02可以看到,数据集中只有2%的正样本,其余98%都属于负类。数据的不平衡性极其严重。那么,这对我们的分类精度会带来多大影响?我们先建立一个简单的决策树模型:library(rpart)treeimb <- rpart(cls ~ ., data = )<- predict(treeimb, newdata = )然我们看看这个模型的预测精度,ROSE包提供了名为()的函数,它能用来计算准确率,召回率和F测度等统计量。($cls, [,2])Call:(response = $cls, predicted = [, 2])Examples are labelled as positive when predicted is greater than 0.5 precision: 1.000recall: 0.200F: 0.167这些测度值看上去很有意思。如果我们设定阈值为0.5,准确率等于1说明没有被误分为正类的样本。召回率等于0.2意味着有很多样本被误分为负类。0.167的F值也说明模型整体精度很低。我们再来看看模型的ROC曲线,它会给我们提供这个模型分类能力的直观评价。使用()函数可以绘制该曲线:($cls, [,2], plotit = F)Area under the curve (AUC): 0.600AUC值等于0.6是个很槽糕的结果。因此我们很有必要在建模前将数据集修正平衡。在本案例中,决策树算法对于小类样本无能为力。我们将使用采样技术来提升预测精度。这个包提供了()的函数来实现过采样和欠采样。我们先试试过采样# 过采样data_balanced_over <- (cls ~ ., data = , method = "over",N = 1960)$datatable(data_balanced_over$cls)0
上述代码实现了过采样方法。N代表最终平衡数据集包含的样本点,本例中我们有980个原始负类样本,所以我们要通过过采样法把正类样本也补充到980个,数据集共有1960个观测。与之类似,我们也能用欠采样方法,请牢记欠采样是无放回的。data_balanced_under <- (cls ~ ., data = , method = "under", N = 40, seed = 1)$datatable(data_balanced_under$cls)0
20欠采样后数据是平衡了,但由于只剩下了40个样本,我们损失了太多信息。我们还可以同时采取这两类方法,只需要把参数改为method = “both”。这时,对小类样本会进行有放回的过采样而对大类样本则进行无放回的欠采样。data_balanced_both <- (cls ~ ., data = , method = "both", p=0.5, N=1000, seed = 1)$datatable(data_balanced_both$cls)0
函数的参数p代表新生成数据集中正类的比例。但前文已经提过两类采样法都有自身的缺陷,欠采样会损失信息,过采样容易导致过拟合,因而ROSE包也提供了ROSE()函数来合成人工数据,它能提供关于原始数据的更好估计。<- ROSE(cls ~ ., data = , seed = 1)$datatable($cls)0
这里生成的数据量和原始数据集相等(1000个观测)。现在,我们已经用4种方法平衡了数据,我们分别建模评评估精度。# 训练决策树<- rpart(cls ~ ., data = )<- rpart(cls ~ ., data = data_balanced_over)<- rpart(cls ~ ., data = data_balanced_under)<- rpart(cls ~ ., data = data_balanced_both)# 在测试集上做预测<- predict(, newdata = )<- predict(, newdata = )<- predict(, newdata = )<- predict(, newdata = )是时候用()函数来评估精度了!# 人工数据合成AUC值($cls, [,2])Area under the curve (AUC): 0.989# 过采样AUC值($cls, [,2])Area under the curve (AUC): 0.798# 欠采样AUC值($cls, [,2])Area under the curve (AUC): 0.867# 双采样AUC值($cls, [,2])Area under the curve (AUC): 0.798因此,我们发现利用人工数据合成法可以带来最高的预测精度,它的表现比采样法要好。这一技术和更稳健的模型结合(随机森林,提升法)可以得到更高的精度。这个包为我们提供了一些基于holdout和bagging的模型评估方法,这有助于我们判断预测结果是否有太大的方差。ROSE.holdout <- ROSE.eval(cls ~ ., data = , learner = rpart,
= "holdout",
= function(obj)obj[,2], seed = 1)ROSE.holdoutCall:ROSE.eval(formula = cls ~ ., data = , learner = rpart,= function(obj) obj[, 2],
= “holdout”,seed = 1)Holdout estimate of auc: 0.985可以发现预测精度维持在0.98附近,这意味着预测结果波动不大。类似的,你可以用自助法来评估,只要把改为”BOOT”。参数是一个输出预测结果为正类的列的函数。结语当我们面对不平衡数据集时,我们常常发现利用采样法修正的效果不错。但在本例中,人工数据合成比传统的采样法更好。为了得到更好的结果,你可以使用一些更前沿的方法,诸如基于boosting 的人工数据合成。来源:R语言中文社区R语言数据挖掘实习就来班大数据时代的必备技能R语言位居数据挖掘领域所有语言之首R语言数据挖掘基础班9/16-10/23 (深圳8天)R语言数据挖掘进阶班10/29-11/27(深圳8天)R语言学习工具班10月15-10月23(深圳4天)全程项目学习9/16-11/27(深圳18天)/9/24-11/27(广州18天)全面掌握R语言工具,熟悉数据挖掘业务流程和常见算法,通过真实的案例掌握数据挖掘相关技能。 详情见“阅读原文”

我要回帖

更多关于 nydus新官网 的文章

 

随机推荐