主要内容

在分类集合中处理不平衡数据或不等错误分类代价

在许多应用程序中,您可能更喜欢以非对称的方式处理数据中的类。例如,数据中对一个类的观察可能比其他类多很多。或者对一类观察结果的错误分类比对另一类观察结果的错误分类后果更严重。在这种情况下,您可以使用RUSBoost算法(指定“方法”作为“RUSBoost”)或使用名称-值对参数“之前”“成本”fitcensemble

如果某些类在您的训练集中代表不足或代表过多,请使用“之前”名称-值对参数或RUSBoost算法。例如,假设您通过模拟获得训练数据。因为模拟课堂一个比模拟班贵吗B,你选择产生较少的阶级观察一个还有更多对阶级的观察B.然而,我们的期望是那个类一个和类B在真实(非模拟)情况下以不同的比例混合。在这种情况下,使用“之前”设定类的先验概率一个而且B近似于您在实际情况下所期望观察到的值。的fitcensemble函数将先验概率归一化,使它们相加为1.将所有先验概率乘以相同的正因子不影响分类结果。处理不平衡数据的另一种方法是使用RUSBoost算法(“方法”、“RUSBoost”).使用该算法时不需要调整先验概率。详情请参见随机欠采样增强而且不平衡数据分类

如果类在训练数据中得到了充分的表示,但您希望不对称地对待它们,则使用“成本”名称-值对参数。假设您想对癌症患者的良性和恶性肿瘤进行分类。未能识别恶性肿瘤(假阴性)的后果比误将良性肿瘤识别为恶性肿瘤(假阳性)严重得多。把恶性肿瘤误诊为良性的代价很高,把良性肿瘤误诊为恶性的代价很低。

您必须将错误分类代价传递为一个包含非负元素的方阵。元素C (i, j)这个矩阵的其中之一是将一个观察数据分类的代价j如果真正的阶级是.对角线元素C(我)的代价矩阵0.对于前面的示例,您可以选择恶性肿瘤作为第1类,而选择良性肿瘤作为第2类。然后你可以设置成本矩阵为

0 c 1 0

在哪里c> 1是误认恶性肿瘤为良性肿瘤的代价。成本是相对的——所有成本乘以相同的积极因素并不影响分类的结果。

如果你只有两门课,fitcensemble调整它们的先验概率使用 P ˜ C j P 为类= 1, 2而且jP先验概率传入了吗fitcensemble或者从训练数据中的类频率计算,和 P ˜ 是调整后的先验概率。fitcensemble使用调整后的概率来训练其弱学习者,而不使用成本矩阵。因此,对成本矩阵的操作相当于对先验概率的操作。

如果你有三门或更多的课程,fitcensemble还将投入成本转换为调整后的先验概率。这种转换更加复杂。首先,fitcensemble试图求解周和刘所描述的矩阵方程[1].如果找不到解决方案,fitcensemble应用Breiman等人描述的“平均成本”调整。[2].欲了解更多信息,请参阅Zadrozny、Langford和Abe[3]

具有不等分类成本的列车集成

这个例子展示了如何训练具有不等分类成本的分类树集合。这个例子使用了肝炎患者的数据,以了解他们是死是活。数据集描述在UCI机器学习数据仓库

从UCI存储库中读取肝炎数据集作为字符数组。然后将结果转换为字符向量的单元格数组textscan.指定包含变量名的字符向量的单元格数组。

选项= weboptions(“ContentType”“文本”);肝炎,肝炎肝炎“http://archive.ics.uci.edu/ml/”...“machine-learning-databases /肝炎/ hepatitis.data”),选择),...“% % % f % f % % % f % f % % % f % f % % % f % f % % % f % f '“分隔符””、“...“EndOfLine”' \ n '“TreatAsEmpty”“?”);大小(肝炎)
ans =1×21 20
VarNames = {“dieOrLive”“年龄”“性”“类固醇”抗病毒药物的“疲劳”...“不舒服”“厌食症”“liverBig”“liverFirm”“脾”...“蜘蛛”腹水的“静脉曲张”胆红素的“alkPhosphate”“血清谷”...白蛋白的“protime”组织学的};

肝炎是字符向量的1 × 20单元格数组。细胞对应于响应(liveOrDie)和19个异质预测因子。

指定包含预测器的数值矩阵和包含“死”而且“生活”,它们是响应类别。响应包含两个值:1说明病人已经死亡,而且2说明病人还活着。使用响应类别为响应指定字符向量的单元格数组。第一个变量肝炎包含响应。

X = cell2mat(肝炎(2:结束));ClassNames = {“死”“生活”};Y = ClassNames(hepatitis{:,1});

X是一个包含19个预测器的数值矩阵。Y包含响应的字符向量的单元格数组。

检查数据中缺少的值。

figure barh(sum(isnan(X),1)/size(X,1)) h = gca;h.YTick = 1:numel(VarNames) - 1;. yticklabel = VarNames(2:end);ylabel (“预测”)包含(“缺失值的百分比”

大多数预测器都有缺失值,其中一个预测器的缺失值接近45%。因此,使用带有代理分割的决策树可以获得更好的准确性。因为数据集很小,使用代理分割的训练时间应该是可以忍受的。

创建一个使用代理分割的分类树模板。

rng (0,“旋风”%用于重现性t = templateTree(“代孕”“所有”);

检查数据或数据的描述,看看哪些预测器是分类的。

: X (1:5)
ans =5×1930.0000 2.0000 1.0000 2.0000 2.0000 2.0000 2.0000 2.0000 1.0000 80.0 000 18.0000 4.0000南1.000 50.0000 1.000 2.0000 2.0000 2.0000 2.0000 0.9000 135.0000 42.0000 3.5000南1.000 78.0000 1.0000 2.0000 2.0000 2.0000 2.0000 0.7000 90.0 000 32.0000 4.000南1.000 2.0000 2.0000 2.0000 2.0000 2.0000 2.0000 2.0000 2.0000 0.000 0.700046.0000 520.000 4.0000 80.0000 1.000 34.0000 1.000 2.0000 2.0000 2.0000 2.0000 2.0000 2.0000 2.0000 2.0000 1.000南200.0000 4.0000南1.000

看来预测因子2到13是绝对的,预测因子19也是。您可以使用下面的数据集描述来确认这个推断UCI机器学习数据仓库

列出分类变量。

catIdx = [2:13,19];

创建一个使用50名学习者和GentleBoost算法。

集合= fitcensemble(X,Y,“方法”“GentleBoost”...“NumLearningCycles”, 50岁,“学习者”t“PredictorNames”VarNames(2:结束),...“LearnRate”, 0.1,“CategoricalPredictors”catIdx,“KFold”5);

检查混淆矩阵,看看集合预测哪些病人是正确的。

[yFit,sFit] = kfoldPredict(集合);yFit confusionchart (Y)

在存活的123名患者中,整体预测正确,有116人将存活。但对于死于肝炎的32名患者,总体预测只有大约一半人会死于肝炎。

在集合的预测中有两种类型的误差:

  • 预测病人活下来,但病人死了

  • 预测病人会死,但病人却活了下来

假设你相信第一个错误比第二个错误严重五倍。创建一个反映这一信念的新的分类成本矩阵。

成本。ClassNames = ClassNames; cost.ClassificationCosts = [0 5; 1 0];

使用。创建一个新的交叉验证集成成本作为误分类代价,并检查得到的混淆矩阵。

集合成本= fitcensemble(X,Y,“方法”“GentleBoost”...“NumLearningCycles”, 50岁,“学习者”t“PredictorNames”VarNames(2:结束),...“LearnRate”, 0.1,“CategoricalPredictors”catIdx,“KFold”5,“成本”、成本);[yFitCost,sFitCost] = kfoldPredict(集合成本);yFitCost confusionchart (Y)

正如预期的那样,新的集成系统在对死亡患者进行分类方面做得更好。有些令人惊讶的是,新的集成系统在对在世患者进行分类时也做得更好,尽管结果在统计上没有显著改善。交叉验证的结果是随机的,所以这个结果只是一个统计涨落。结果似乎表明,居住的患者的分类对费用不是很敏感。

参考文献

[1]周振华。和x - y。刘。《关于多课成本敏感学习》计算智能。第26卷,第3期,第232-257页。

[2]布莱曼,L. H.弗里德曼,R. A.奥尔申,C. J.斯通。分类和回归树。波卡拉顿,佛罗里达州:查普曼和霍尔,1984。

Zadrozny, B. J. Langford, N. Abe。“通过成本比例示例加权的成本敏感学习。”第三届IEEE数据挖掘国际会议, 435 - 442。2003.

另请参阅

||||

相关的话题

Baidu
map