如何使用MATLAB神经网络工具箱进行数据预处理

一、数据预处理的核心目的

神经网络对数据的分布、量纲、完整性非常敏感,预处理主要解决以下问题:

  1. 消除量纲差异(如特征A取值范围0-10,特征B取值范围0-10000);
  2. 处理缺失值、异常值,保证数据完整性;
  3. 移除无效特征(如全为常量的列),降低计算复杂度;
  4. 标准化数据分布,加速模型收敛。

MATLAB神经网络工具箱(Neural Network Toolbox)内置了一系列专用预处理函数,无需手动编写复杂逻辑,可直接调用。

二、常用预处理方法与实战代码

以下结合经典的“房价预测数据集”为例,演示核心预处理步骤,所有代码均可直接复制运行。

1. 数据加载与初步查看

首先加载数据并查看基本信息,明确数据维度、是否有缺失值/异常值:

% 加载MATLAB内置的波士顿房价数据集
[inputs, targets] = house_dataset;

% 查看数据基本信息
fprintf('输入特征维度:%d行(特征数)×%d列(样本数)\n', size(inputs,1), size(inputs,2));
fprintf('输出标签维度:%d行×%d列\n', size(targets,1), size(targets,2));

% 检查缺失值(NaN)
inputNaN = sum(isnan(inputs(:)));
targetNaN = sum(isnan(targets(:)));
fprintf('输入特征缺失值数量:%d\n', inputNaN);
fprintf('输出标签缺失值数量:%d\n', targetNaN);

2. 核心预处理操作

(1)移除无效特征/样本

  • removeconstantrows:移除全为常量的行(特征),这类特征无信息价值;
  • removenanrows:移除包含缺失值的行(样本);
  • removeoutliers:移除异常值样本(基于标准差/中位数法)。
% 1. 移除输入特征中全为常量的行
inputs = removeconstantrows(inputs);

% 2. 处理缺失值(若有):移除含NaN的样本
inputs = removenanrows(inputs'); % 转置为样本×特征格式
inputs = inputs'; % 转回特征×样本格式(MATLAB神经网络默认行向量为特征)
targets = removenanrows(targets');
targets = targets';

% 3. 移除异常值(基于3倍标准差法)
[inputs, outliersIdx] = removeoutliers(inputs', 'Method', 'zscore', 'Threshold', 3);
inputs = inputs';
% 同步移除标签中的异常值样本
targets(:, outliersIdx) = [];

fprintf('预处理后输入特征维度:%d×%d\n', size(inputs,1), size(inputs,2));

(2)数据归一化/标准化(核心步骤)

这是神经网络预处理最关键的一步,MATLAB提供两种常用方法:

  • mapminmax:将数据归一化到指定区间(默认[-1,1],可自定义[0,1]),适合大部分场景;
  • mapstd:将数据标准化为均值0、标准差1,适合数据分布接近正态的场景。
% 方法1:归一化到[0,1]区间(推荐用于回归/分类任务)
% 设置归一化参数
minVal = 0;
maxVal = 1;
% 对输入特征归一化
[inputsNorm, inputSettings] = mapminmax(inputs, minVal, maxVal);
% 对输出标签归一化(需单独保存设置,用于后续反归一化)
[targetsNorm, targetSettings] = mapminmax(targets, minVal, maxVal);

% 方法2:标准化(均值0,标准差1)
% [inputsStd, inputStdSettings] = mapstd(inputs);

% 查看归一化后的数据范围
fprintf('输入特征归一化后最小值:%.4f,最大值:%.4f\n', min(inputsNorm(:)), max(inputsNorm(:)));

(3)数据集划分

将预处理后的数据划分为训练集、验证集、测试集,避免过拟合:

% 按70%训练、15%验证、15%测试的比例划分
trainRatio = 0.7;
valRatio = 0.15;
testRatio = 0.15;

[inputTrain, inputVal, inputTest, targetTrain, targetVal, targetTest] = dividerand(...
    inputsNorm, targetsNorm, trainRatio, valRatio, testRatio);

fprintf('训练集样本数:%d\n', size(inputTrain,2));
fprintf('验证集样本数:%d\n', size(inputVal,2));
fprintf('测试集样本数:%d\n', size(inputTest,2));

(4)自动绑定预处理流程到网络(懒人方法)

MATLAB可将预处理逻辑直接绑定到神经网络对象,训练时自动执行,无需手动分步处理:

% 创建BP神经网络
net = feedforwardnet(8);

% 为网络输入层绑定预处理流程:移除常量行 → 归一化
net.inputs{1}.processFcns = {'removeconstantrows', 'mapminmax'};
% 为网络输出层绑定预处理流程
net.outputs{2}.processFcns = {'removeconstantrows', 'mapminmax'};

% 训练时网络会自动对输入数据执行上述预处理
[net, tr] = train(net, inputTrain, targetTrain);

3. 预处理后的数据还原(反归一化/反标准化)

模型预测的结果是归一化后的值,需还原为原始尺度才能解读,核心用mapminmax('reverse')

% 用测试集预测
yTestNorm = net(inputTest);

% 反归一化:还原为原始房价尺度
yTest = mapminmax('reverse', yTestNorm, targetSettings);
targetTest = mapminmax('reverse', targetTest, targetSettings);

% 输出真实值与预测值对比
fprintf('前5个样本真实房价:');
disp(targetTest(:,1:5));
fprintf('前5个样本预测房价:');
disp(yTest(:,1:5));

三、关键注意事项

  1. 归一化参数复用:必须用训练集的mapminmax设置(inputSettings/targetSettings)处理验证集/测试集,避免数据泄露;
  2. 维度匹配:MATLAB神经网络默认输入为“特征×样本”的行向量格式,预处理时需注意维度转换;
  3. 异常值处理:移除异常值时需同步处理输入和输出标签,保证样本一一对应;
  4. 方法选择:回归任务优先用mapminmax,分类任务可根据数据分布选择mapminmaxmapstd
posted @ 2026-01-19 20:24  程大人  阅读(2)  评论(0)    收藏  举报