Julia 机器学习----基于DataFrame 的特征标准化方法

1、概述

评价是现代社会各领域的一项经常性的工作,是科学做出管理决策的重要依据。随着人们研究领域的不断扩大,所面临的评价对象日趋复杂,如果仅依据单一指标对事物进行评价往往不尽合理,必须全面地从整体的角度考虑问题,多指标综合评价方法应运而生。所谓多指标综合评价方法,就是把描述评价对象不同方面的多个指标的信息综合起来,并得到一个综合指标,由此对评价对象做一个整体上的评判,并进行横向或纵向比较。

而在多指标评价体系中,由于各评价指标的性质不同,通常具有不同的量纲和数量级。当各指标间的水平相差很大时,如果直接用原始指标值进行分析,就会突出数值较高的指标在综合分析中的作用,相对削弱数值水平较低指标的作用。因此,为了保证结果的可靠性,需要对原始指标数据进行标准化处理。当原始数据不同维度上的特征的尺度(单位)不一致时,需要标准化步骤对数据进行预处理。

目前数据标准化方法有多种,归结起来可以分为直线型方法(如极值法、标准差法)、折线型方法(如三折线法)、曲线型方法(如半正态性分布)。不同的标准化方法,对系统的评价结果会产生不同的影响,然而不幸的是,在数据标准化方法的选择上,还没有通用的法则可以遵循。

数据的标准化(normalization)是将数据按比例缩放,使之落入一个小的特定区间。在某些比较和评价的指标处理中经常会用到,去除数据的单位限制,将其转化为无量纲的纯数值,便于不同单位或量级的指标能够进行比较和加权。其中最典型的就是数据的归一化处理,即将数据统一映射到[0,1]区间上,常见的数据归一化的方法有:min-max标准化(Min-max normalization),log函数转换,atan函数转换,z-score标准化(zero-mena normalization,此方法最为常用),模糊量化法。本文只介绍min-max法(规范化方法),z-score法(正规化方法),比例法(名字叫啥不太清楚,归一化方法)。

2、z-score标准化(zero-mena normalization)

最常见的标准化方法就是Z标准化;也是SPSS中最为常用的标准化方法,也叫标准差标准化

代码示例:

using ScikitLearn,DataFrames
using CSV,CSVFiles
using StatsBase,Statistics
using RDatasets,StaticArrays,DataStructures
using Clustering, Plots

##################################标准差标准化  z-score 标准化(zero-meannormalization)
#不分类直接标准化
#标准化所有的列,直接改变原值,不会增加额外的存储空间,这种方式处理效率最高
h_mean = map(mean,eachcol(iris[!,1:end-1]))
h_sdt  = map(std,eachcol(iris[!,1:end-1]))
h,c = size(iris[!,1:end-1])
for col in 1:c
    mean_v=h_mean[col]
    std_v = h_sdt[col]
    println(mean_v)
    for hex in 1:h
        @inbounds iris[hex,col] = (iris[hex,col]-mean_v)/std_v
    end
end

features = collect(Matrix(iris[:, 1:4])')
result = kmeans(features, 3)
scatter(iris.PetalLength, iris.PetalWidth, marker_z=result.assignments,
                color=:lightrainbow, legend=false)

#标准化指定的列,但是会增加额外的存储空间
function standardization_v(v::AbstractArray)
    iris_array = v
    mean_v = mean(v)
    std_v =  std(v)
    col = [i-mean_v for i in iris_array[1:end] ]/std_v
    return col
end
r = map(standardization_v, eachcol(iris[!,1:end-1], false)) #
iris_standardization_v = insertcols!(DataFrame(r),5,:x5=>convert(Array{String},iris[1:end,5]))

features = collect(Matrix(iris_standardization_v[:, 1:4])')
result = kmeans(features, 3)
scatter(iris_standardization_v.x3, iris_standardization_v.x4, marker_z=result.assignments,
                color=:lightrainbow, legend=false)

 

3、归一化方法

using ScikitLearn,DataFrames
using CSV,CSVFiles
using StatsBase,Statistics
using RDatasets,StaticArrays,DataStructures
using Clustering, Plots

#Iris 鸢尾花数据集是一个经典数据集,这里面有三个品种的数据,所以需要分类标准化
iris = dataset("datasets", "iris"); # load the data

######### 归一化方法
h_sum = map(sum,eachcol(iris[!,1:end-1]))
h,c = size(iris[!,1:end-1])
for col in 1:c
    sum_v=h_sum[col]
    for hex in 1:h
        @inbounds iris[hex,col] = iris[hex,col]/sum_v
    end
end


features = collect(Matrix(iris[:, 1:4])')
result = kmeans(features, 3)
scatter(iris.SepalLength, iris.SepalWidth, marker_z=result.assignments,
                color=:lightrainbow, legend=false)

 

4、atan函数转换

用反正切函数也可以实现数据的归一化,使用这个方法需要注意的是如果想映射的区间为[0,1],则数据都应该大于等于0,小于0的数据将被映射到[-1,0]区间上。

using ScikitLearn,DataFrames
using CSV,CSVFiles
using StatsBase,Statistics
using RDatasets,StaticArrays,DataStructures
using Clustering, Plots

#Iris 鸢尾花数据集是一个经典数据集,这里面有三个品种的数据,所以需要分类标准化
iris = dataset("datasets", "iris"); # load the data

##################################atan函数转换 反正切函
#atan标准化指定的列,但是会增加额外的存储空间
function standardization_atan(v::AbstractArray)
    iris_array = v
    col = [atan(i) for i in iris_array[1:end] ]
    return col
end
r = map(standardization_atan, eachcol(iris[!,1:end-1], false)) #

#atan标准化所有的列,直接改变原值,不会增加额外的存储空间,这种方式处理效率最高
for col in eachcol(iris[!,1:end-1], false)
    for i in eachindex(col)
        @inbounds col[i] = tand(col[i])
    end
end

features = collect(Matrix(iris[:, 1:4])')
result = kmeans(features, 3)
scatter(iris.PetalLength, iris.PetalWidth, marker_z=result.assignments,
                color=:lightrainbow, legend=false)

5、min-max标准化(Min-maxnormalization)

也叫离差标准化,是对原始数据的线性变换,使结果落到[0,1]区间,转换函数如下:

  • 其中max为样本数据的最大值,min为样本数据的最小值。
  • 这种方法有一个缺陷就是当有新数据加入时,可能导致max和min的变化,需要重新定义。
##################################标准差标准化  min-max标准化(Min-maxnormalization)

#标准化指定的列,但是会增加额外的存储空间
function standardization_v(v::AbstractArray)
    iris_array = v
    min_v = min(v)
    max_v =  max(v)
    col = [i-min_v for i in iris_array[1:end] ]/max_v
    return col
end
r = map(standardization_v, eachcol(iris[!,1:end-1], false)) #
iris_standardization_v = insertcols!(DataFrame(r),5,:x5=>convert(Array{String},iris[1:end,5]))

features = collect(Matrix(iris_standardization_v[:, 1:4])')
result = kmeans(features, 3)
scatter(iris_standardization_v.x3, iris_standardization_v.x4, marker_z=result.assignments,
                color=:lightrainbow, legend=false)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

October-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值