libsvm中数据归一化的重要性

  这两天用Python来实现手写数字识别,刚开始用原始数据进行训练,结果预测结果都是同一个类别,全部是对应数字1。正确率也只有10%左右,下面是代码及运行结果截图:
这里写图片描述

预测结果都是数字1。

  数据归一化是指将特征值从一个大范围映射到[0,1]或者[-1,1],如果原始值都是正数,则建议选择映射到[0,1];如果原始值有正数又有负数,则建议映射到[-1,1];具体情况需要具体分析。映射到[0,1]的实现是:
  

new_value=valuemin_valuemax_valuemin_value

这样就能实现从原来的范围映射到[0,1]之间。
  libsvm中提供了数据归一化工具,就是svm-scale这个工具。如果你的数据文件已经满足了svm的格式要求,即 label1:value12:value2.... 这种格式,那么在window平台下,你可以直接调用libsvm\windows\svm-scale.exe文件来进行归一化操作。具体步骤是在cmd命令行中进入到svm-scale.exe所在文件夹,然后运行svm-scale来实现归一化。svm-scale的语法截图如下:
scale语法
其中-l 指定下界,-u指定上界,-s指定保存scale参数文件路径,-r源文件路径

下面以数据源train.txt为例,将其归一化到[0,1],并存入到train-to-one.txt中,语句截图如下:
这里写图片描述

  因为手写数字图片是由一系列的像素点组成的,像素值从0到255,所以可以让每一个像素值除以255,从而实现映射。可以调用svm-scale来实现,也可以直接编写java代码来实现,然后再以归一化之后的数据进行训练模型并预测,其代码和截图如下:
归一化数据

可以看出,准确率和速率明显提高了,不会出现仅仅只有一类的问题。但是其中的原理,本人现在还不知道,等我理解了再解释吧!

  • 3
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
libsvm数据归一是指将数据的特征值按照一定的比例缩放到某个范围内,以确保所有特征的数值具有相似的尺度。数据归一的目的是消除不同特征之间的量纲差异,避免某些特征对于模型的训练产生过大的影响。 libsvm提供了两种常见的数据归一方式:线性归一和标准。 1. 线性归一(Min-Max Scaling)是将数据按照线性比例缩放到[0, 1]的范围内。公式如下: X_scaled = (X - X_min) / (X_max - X_min) 其,X_scaled是归一后的特征值,X是原始特征值,X_min和X_max分别是原始特征值的最小值和最大值。 2. 标准(Standardization)是将数据按照正态分布的标准差进行缩放,使得数据的均值为0,标准差为1。公式如下: X_scaled = (X - X_mean) / X_std 其,X_scaled是归一后的特征值,X是原始特征值,X_mean是原始特征值的均值,X_std是原始特征值的标准差。 数据归一可以通过sklearn库的preprocessing模块来实现。具体步骤如下: 1. 导入preprocessing模块:from sklearn import preprocessing 2. 实例一个归一器:scaler = preprocessing.MinMaxScaler() 或 scaler = preprocessing.StandardScaler() 3. 调用fit_transform()方法进行数据归一:X_scaled = scaler.fit_transform(X) 其,X是原始的特征矩阵。 4. 对于测试数据,可以使用已经实例归一器进行相同的归一处理:X_test_scaled = scaler.transform(X_test)。 归一后的数据可以提高模型的训练效果,使得各特征的权重更加平衡,同时也可以提高模型的稳定性和可解释性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值