使用散点图和直方图检测和去除异常值

数据挖掘 机器学习 matlab 朴素贝叶斯分类器 离群值
2022-02-14 09:18:08

假设,我们使用以下代码生成散点图,

function res = plot2features(tset, f1, f2)
% Plots tset samples on a 2-dimensional diagram
%   using features f1 and f2
% tset - training set; the first column contains class label
% f1 - index of the first feature (mapped to horizontal axis)
% f2 - index of the second feature (mapped to vertical axis)
% 
% res - matrix containing values of f1 and f2 features

    % plotting parameters for different classes
    %   restriction to 8 classes seems reasonable
    pattern(1,:) = 'ks';
    pattern(2,:) = 'rd';
    pattern(3,:) = 'mv';
    pattern(4,:) = 'b^';
    pattern(5,:) = 'gs';
    pattern(6,:) = 'md';
    pattern(7,:) = 'mv';
    pattern(8,:) = 'g^';

    res = tset(:, [f1, f2]);

    % extraction of all unique labels used in tset
    labels = unique(tset(:,1));

    % create diagram and switch to content preserving mode
    figure;
    hold on;
    for i=1:size(labels,1)
        idx = tset(:,1) == labels(i);
        plot(res(idx,1), res(idx,2), pattern(i,:));
    end
    hold off;
end

以下是它的用法,

>> plot2features(train, 3,4)

此代码在删除异常值之前生成以下图像,

在此处输入图像描述

并在去除异常值后跟随图像,

在此处输入图像描述


我有以下问题,

(1)第一张图片告诉我们异常值的存在是什么?我可以猜测远处的情节是一个异常值。但是,我怎样才能找到产生异常值的行或列?根据第一张图片,异常值位于 (27,375) 坐标处。但是,在实际数据中,它位于train(184:188,:)行上。那么,为什么会有这种差异?

(2)第二张图中的颜色代码代表什么?

(3)为什么这两个图像有那么大的不同?为什么只删除 4 行会带来如此巨大的差异?

(4)如何使用直方图分析异常值的存在?请向我提供有关使用直方图进行异常值检测的任何学习材料。


假设我们手中有以下训练和测试数据用于测试贝叶斯分类器算法,

训练数据

火车.txt

测试数据

测试.txt

第一列代表类。其余列代表特征。


2个回答
  1. 是的。这段代码只为两个选定的列绘制点并为它们分配不同的颜色和标记。它不执行任何异常值选择/删除。

  2. 第 3 列和第 4 列(它们是数据集中的特征)可以合理地预测不同的类别。

  3. 绘制直方图。看看酒吧之间是否有明显的脱节。花一点时间来找到合适的垃圾箱大小。

另外,您问题的标题与内容不符。你能更新问题吗?

为了回答您的最后一个问题,直方图将通过显示与其他人相距一段合理距离的条形图(如前面其他用户所述),让您了解异常值在哪里。您可能必须使用 bin-widths 才能发现它,但它应该很明显。

另一个可能对您有用的工具是箱线图。这种可视化不仅会为您提供有关数据分布的信息(尽管与直方图不同,不会指定频率),而且还会专门识别异常值。我建议使用散点图、直方图和箱线图的组合来更好地熟悉您的数据。

我不确定 MATLAB 是否具有此功能(尽管我认为它会),但在 R 中,当您绘制数据时,您可以选择在散点图上的数据点上方显示每个观察值的索引。深入研究 MATLAB 的绘图功能不会有什么坏处。