机器学习笔记 (二)特征预处理

特征工程(二)特征预处理

特征处理就是通过特定的统计方法(数学方法)将数据转换为算法要求的数据,可以把有量纲表达式转换为无量纲表达式。

  • 数值型的数据
    • 归一化
    • 标准化
    • 缺失值
  • 类别型数据
    • one-hot编码
  • 时间类型
    • 时间的切分

归一化

通过对原始数据进行变换把数据映射到 [ 0 , 1 ] [0,1] [0,1](或其他区间)

实质上归一化就是去掉量纲,使得多组特征在对结果的影响是相同的。

X ′ = x − m i n m a x − m i n X'=\frac{x-min}{max-min} X=maxminxmin

X ′ ′ = X ′ ∗ ( m x − m i ) + m i X''=X'*(mx-mi)+mi X=X(mxmi)+mi

作用于每一列, m a x max max为一列的最大值, m i n min min为一列的最小值,那么 X ′ ′ X'' X为最终结果, m x , m i mx,mi mx,mi为指定的区间(默认 m x = 1 , m i = 0 mx=1,mi=0 mx=1mi=0

式(1)中的分式量纲相除为1,这样就把量纲表达式转换为无量纲表达式。

归一化的问题:

异常点会严重影响归一化的结果,造成偏差

sklearn特征处理归一化API:
  • sklearn.preprocessing
    • 所有的数据预处理都要使用这个API
  • sklearn.preporcessing.MinMaxScaler(feature_range=(0,1)...)
    • 归一化API
    • feature_range=(0,1)代表缩放的给定范围
  • MinMaxScaler.fit_transform(X)
    • X:numpy array格式的数据[n_samples,n_feature]
    • 返回值:转换后的形状相同的array

示例:

# 归一化
from sklearn.preprocessing import MinMaxScaler

def mm():
    # 实例化
    mm = MinMaxScaler()
    # 调用fit_transform()转化数据
	data = mm.fit_transform(([90,2,10,40],[60,4,15,45],[75,3,13,46]))

	print(data)
	return None

if __name__ == "__main__":
    mm()

输出:

[[1.         0.         0.         0.        ]
 [0.         1.         1.         0.83333333]
 [0.5        0.5        0.6        1.        ]]

标准化

归一化的问题就是异常点对于计算结果影响较大,而标准化对于异常点并不敏感

标准化可以通过对原始数据进行变换,把数据变换到均值为0,方差为1的范围内

X ′ = x − m e a n σ X'=\frac{x-mean}{\sigma} X=σxmean

作用于每一列, m e a n mean mean为平均值, σ \sigma σ为标准差、

v a r var var为方差,

v a r = ( x 1 − m e a n ) 2 + ( x 2 − m e a n ) 2 . . . n ( 每 个 特 征 的 样 本 数 ) var=\frac{(x_1-mean)^2+(x_2-mean)^2...}{n(每个特征的样本数)} var=n()(x1mean)2+(x2mean)2...

σ = v a r \sigma=\sqrt{var} σ=var

其中 v a r var var(方差)代表数据的稳定性

标准化在已有样本足够多的情况下比较稳定,适合现代嘈杂大数据场景

sklearn特征处理标准化API:
  • sklearn.preporcessing.StandardScaler
    • 处理之后每列数据都聚集在均值0附近,标准差为1
  • StandardScaler.fit_transform(X)
    • X: numpy array格式的数据[n_samples,n_feature]
    • 返回值:转化后的形状相同的array
  • StandardScaler.mean_
    • 原始数据中每列特征的平均值
  • StandardScaler.std_
    • 原始数据每列特征的方差

示例:

# 标准化
from sklearn.preprocessing import StandardScaler
def stan():
    # 实例化
    sta = StandardScaler()
    
data = sta.fit_transform(([1,-1,3],[2,4,2],[4,6,-1]))

print(data)

return None

if __name__ == '__main__':
    stan()

输出:

[[-1.06904497 -1.35873244  0.98058068]
 [-0.26726124  0.33968311  0.39223227]
 [ 1.33630621  1.01904933 -1.37281295]]

缺失值

缺失值处理方法:

删除如果每列过着每行数据缺失值到达一定比例,建议整行或整列删除
插补可以通过缺失值每行或者每列的平均数或中位数来填充(主要按列)

sklearn缺失值处理API:

  • sklearn.perprocessing.Imputer(missing_values='NaN', strategy='mean', axis=0)
    • 完成缺失值插补
    • missing_valuess=‘NaN’代表缺失值现在的值是’NaN’
    • strategy='mean’插补的策略为平均值插补
    • axis=0按列填补
  • Imputer.fit_transform(X)
    • X:numpy array格式的数据[n_samples, n_features]
    • 返回值:转换后形状相同的array

示例:

# 缺失值填补
from sklearn.preprocessing import Imputer
import numpy as np

def inp():
    # 实例化
    i = Imputer(missing_values='NaN', strategy='mean',axis=0)
	data = i.fit_transform(([1.,2.],[np.nan,3.],[7.,6.]))  # 注意,这里需要是float型

	print(data)

return None

if __name__ == '__main__':
    inp()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值