中心主题.png
1、sklearn 预处理
5.3 数据变换
标准化
讲一下几个模块的区别:
数据标准化
StandardScaler (基于特征矩阵的列,将属性值转换至服从正态分布)
标准化是依照特征矩阵的列处理数据,其通过求z-score的方法,将样本的特征值转换到同一量纲下
常用与基于正态分布的算法,比如回归
from sklearn import preprocessing
standard_scaler = preprocessing.StandardScaler()
X_train_standard = standard_scaler.fit_transform(X_train)
standard_scaler.mean_ #查看每列均值
standard_scaler.var_ #查看每列方差
数据归一化
MinMaxScaler (区间缩放,基于最大最小值,将数据转换到特定区间上,默认是0~1,也可以对feature_range参数进行设置)
提升模型收敛速度,提升模型精度
常见用于神经网络
from sklearn import preprocessing
min_max_scaler = preprocessing.MinMaxScaler((0,1)) #构建模型,如果不设置范围参数,则默认是0~1
X_train_minmax = min_max_scaler.fit_transform(X_train) #使用模型,肯定是以列进行训练哈
min_max_scaler.data_max_ #查看每列最大值
min_max_scaler.data_min_ #查看每列最小值
范式归一化(查看后面)
Normalizer (基于矩阵的行,将样本向量转换为单位向量)
其目的在于样本向量在点乘运算或其他核函数计算相似性时,拥有统一的标准
常见用于文本分类和聚类、logistic回归中也会使用,有效防止过拟合,目前没有遇到过。
from sklearn import preprocessing
normalizer = preprocessing.Normalizer(norm='l2')
X_normalized = normalizer.fit_transform(X)
标准化后的数据可以用numpy函数查看其均值和标准差,如果是标准化转换的话,均值和标准差肯定是0和1。
X_train_minmax.mean(axis=0) #每列的均值,为0
X_train_minmax.std(axis=0) #每列的标准差,为1
上面的min_max_scaler是已经训练好的缩放标准,每列的最大值和最小值都知道了,可以用这个标准来缩放其他数据(比如新来了一行数据)。
X_train_new_minmax = min_max_scaler.transform(X_train_new) #已经训练好的模型
非线性转换-转换为分位数(0~1之间)
from sklearn import preprocessing
quantile_transformer = preprocessing.QuantileTransformer(random_state=0)
X_train_trans = quantile_transformer.fit_transform(X_train)
非线性转换-高斯变换
有一些简单的变换,比如说指数变换、对数变换可以直接np函数处理,这里sklearn提供了高斯变换的模型,但是具体场景要应用变换的情况应该比较少,这里也不研究。
类别特征编码
from sklearn import preprocessing
enc = preprocessing.OrdinalEncoder()
enc.fit(X) #模型训练,实际上第一行全部编码为0,第n行编码为n-1,这样的一种对应关系,所以这里的X应当是需要编码的一个特征矩阵
enc.transform(X1) #上述模型,将X1编码,X1也是需要编码的特征矩阵
from sklearn import preprocessing
enc = preprocessing.OneHotEncoder()
enc.fit(X) # fit来学习编码
enc.transform(X1).toarray() # 进行编码
离散化
k-bins离散方法用k个等宽的bins把特征离散化
from sklearn import preprocessing
est = preprocessing.KBinsDiscretizer(n_bins=[3, 2, 2], encode='ordinal').fit(X) #针对三列数据,分别分为3\2\2个bins,最后编码采用0~n-1的编码方式
est.transform(X) #进行离散化
当然也会有分位数的离散化方式,可以采用KBinsDiscretizer来实现。
二值化
设定阈值,不超过阈值的就为0:
from sklearn import preprocessing
binarizer = preprocessing.Binarizer(threshold=0) #构建模型
binarizer.fit_transform(X)
生成多项式特征
构建多项式特征来增加模型复杂度:
from sklearn import preprocessing
poly = preprocessing.PolynomialFeatures(2) #构建二次多项式模型
poly.fit_transform(X)
X 的特征已经从(X1,X2)扩展为(1,X1,X1平方,2,X2,X2平方)。
也可以通过参数设置来构建比如像X1*X2的较差项。一般这种比较简单直接的函数也可以调用np实现。
5.4 缺失值插补
sklearn插补方法不同于dataframe自己的fillna方法,可以用训练好的模型来插补其他值,所以要看具体的需求。如果fillna可以解决那就更方便。
单变量插补
from sklearn import preprocessing
imp = preprocessing.Imputer(missing_values='NaN', strategy='mean', axis=0) #设定缺失值的识别、填补方法
imp.fit_transform(X) #用X来训练,同时插补X
imp.transform(X1) #用训练好的模型来插补X1
多变量插补
使用其他列的情况来插补自己列,暂时也用不到
5.5 无监督降维
PCA和非负矩阵因式分解NNF都可以降维,都在第二章无监督学习的机器学习模型中再介绍。
5.8 距离、相似度以及核函数
tips:距离和相似度计算肯定是按行向量算的哈
距离计算
距离的定义也有几种,可以在参数进行设置,如果不设置那就是平方距离
from sklearn import metrics
metrics.pairwise_distances(X, Y)
相似度
余弦相似度
from sklearn import metrics
metrics.pairwise.cosine_similarity(X, Y)
jaccard相似度在sklearn.metrics.jaccard_similarity_score 里面
核函数
这里不是对单一的X进行变换,而是对X和Y进行联合变换。具体要看公式,比如线性变换:
image.png
from sklearn import metrics
metrics.pairwise.linear_kernel(X, Y) #线性核函数
metrics.pairwise.polynomial_kernel(X, Y) #多项式核函数
metrics.pairwise.sigmoid_kernel(X, Y) #sigmoid核函数
metrics.pairwise.rbf_kernel(X, Y) #RBF核函数
metrics.pairwise.laplacian_kernel(X, Y) #拉普拉斯核函数
metrics.pairwise.chi2_kernel(X, Y) #卡方核函数
5.9 预测目标Y的转换
同样提供了二值化和编码的方法,但是这里要求只能输入series而不是多维的dataframe,所以更多是让你养成习惯,对特征进行编码就用OrdinalEncoder(),对标签进行编码就用LabelEncoder()
from sklearn import preprocessing
lb = preprocessing.LabelBinarizer()
lb.fit(Y)
le = preprocessing.LabelEncoder()
le.fit(Y)
1.13 特征选择(筛除列)
移除低方差特征
from sklearn import feature_selection
sel = feature_selection.VarianceThreshold(threshold=0.25)