理论和实践是密不可分的,在学习sklearn之前最好能学习一下周志华老师的《机器学习》,这样能对机器学习有一个深入的了解,在使用相关函数和方法的时候得心应手,知其然,更之其所以然。
另外还请各位读者在学习机器学习之前掌握一定的python语法基础,熟悉numpy,pandas和matplotlib等相关库的使用方法
我在学习sklearn时参考资料主要来自sklearn的官方英文文档和apachecn的中文文档以及相关博主的优质博客,当然中文文档由于翻译的成本和人力的限制往往会落后与官方最新版的文档,但对于初学者且英语不是很好的同学来说,可以先从中文文档和相关的书籍看起,在掌握了一定的sklearn后再通过官方英文文档进行查漏补缺
在sklearn.preprcessing包下包含很多数据预处理的方法。
规范化:
MinMaxScaler :最大最小值规范化
StandardScaler :为使各特征的均值为0,方差为1
编码:
LabelEncoder :把字符串类型的数据转化为整型
OneHotEncoder :特征用一个二进制数字来表示
Binarizer :为将数值型特征的二值化
MultiLabelBinarizer:多标签二值化
pip install sklearn -i https://pypi.douban.com/simple
from sklearn import preprocessing
标准化分为两步:均值的中心化( μ \mu μ为0),方差的标准化( σ \sigma σ为1)
标准化数学公式: x − μ σ \frac {x- \mu } {\sigma} σx−μ
x_train=np.array([[1,-1,2],[2,0,0],[0,1,-1]])
print(x_train)
print("-"*50)
# 方法一 (原生方法)
print(x_train.mean(axis=0))
print(x_train.std(axis=0))
x_scaled= (x_train-x_train.mean(axis=0))/x_train.std(axis=0)
print(x_scaled)
print("-"*50)
注:在机器学习中,一行表示一个样本,一个样本通常包含多个特征值,所以求均值和方差是按列进行的(axis=0),就比如每个人都有身高,体重,肤色,你对单个人横向求身高,体重,肤色的均值没有意义纵向按属性求每个属性的均值和标准差才有意义
x_scaled=preprocessing.scale(x_train)
print(x_scaled)
print(x_scaled.mean(axis=0))
print((x_scaled.std(axis=0)))
print("-"*50)
scaler=preprocessing.StandardScaler().fit(x_train)
print(scaler.mean_) #原数据均值
print(scaler.scale_) #原数据标准差
x_scaled=scaler.transform(x_train)
print(x_scaled)
print("-"*50)
scaler=preprocessing.StandardScaler()
x_scaled=scaler.fit_transform(x_train)
print(x_scaled)
注:可能有些通学对这里面和fit 和fit_transform 以及transform 不太了解,这里解释一下,fit+transform=fit_transform
,类比造汽车,fit其实就相当于生成了一个图纸,transform就相当于是生产汽车,fit过后的模型不仅可以用于训练数据还可以用于测试数据
X s t d = X − X . m i n ( a x i s = 0 ) X . m a x ( a x i s = 0 ) − X . m i n ( a x i s = 0 ) X_{std}=\frac {X-X.min(axis=0) } {X.max(axis=0)-X.min(axis=0)} Xstd=X.max(axis=0)−X.min(axis=0)X−X.min(axis=0)
X s c a l e d = X s t d ∗ ( m a x − m i n ) + m i n X_{scaled}=X_{std}*(max-min)+min Xscaled=Xstd∗(max−min)+min
X.max(axis=0):每列最大值的组成的行向量
X.min(axis=0):每列最小值的组成的行向量
min: 映射区间的最小值
max:映射区间的最大值
X s t d X_{std} Xstd 标准化的结果
X s c a l e d X_{scaled} Xscaled:归一化的结果
如果不是很理解的话可以看这篇博客:https://zhuanlan.zhihu.com/p/506627933
minmaxscaler默认将数据归一化到【0,1】区间,如果想要归一化到指定区间,可以设置参数feature_range=(min, max)
from sklearn import preprocessing
import numpy as np
X_train = np.array([[ 1., -1., 2.],
[ 2., 0., 0.],
[ 0., 1., -1.]])
min_max_scaler = preprocessing.MinMaxScaler()
X_train_minmax = min_max_scaler.fit_transform(X_train)
X_train_minmax
把数据变换到[-1,1]之间
max_abs_scaler = preprocessing.MaxAbsScaler()
X_train_maxabs = max_abs_scaler.fit_transform(x_train)
X_train_maxabs
到了这里大家对Normalization,Standardlizaton应该比较懵可以看一下这篇博客https://blog.csdn.net/Dhuang159/article/details/83627146
from sklearn import preprocessing
X = [[ 1., -1., 2.],
[ 2., 0., 0.],
[ 0., 1., -1.]]
X_normalized = preprocessing.normalize(X, norm='l2')
X_normalized
注:这里面的L2是范数
有些时候特征值不是连续的而是离散的,并且是有明显类别的,这个时候转化成数值是合适的,所以可以采用向量
from sklearn.preprocessing import OneHotEncoder
genders = ['female', 'male']
locations = ['from Africa', 'from Asia', 'from Europe', 'from US']
browsers = ['uses Chrome', 'uses Firefox', 'uses IE', 'uses Safari']
enc = preprocessing.OneHotEncoder(categories=[genders, locations, browsers])
X = [['male', 'from US', 'uses Safari'], ['female', 'from Europe', 'uses Firefox']]
enc.fit(X)
OneHotEncoder(categories=[['female', 'male'],
['from Africa', 'from Asia', 'from Europe',
'from US'],
['uses Chrome', 'uses Firefox', 'uses IE',
'uses Safari']])
enc.transform([['female', 'from Asia', 'uses Chrome']]).toarray()
https://scikit-learn.org/stable/modules/impute.html#impute
参考文献
https://zhuanlan.zhihu.com/p/506627933
https://blog.csdn.net/weixin_40807247/article/details/82793220