特征工程-数据预处理
1、标准化
- 值转换为0,方差为1的分布
- 如SVM的RBF核和线性模型的L1和L2正则化项,都假设所有特征的均值都为零,并且方差在同一个数量级。如果一个特征的方差比其余特征的方差大许多个数量级,那么该特征将会主导整个目标函数,使得模型不能从其余特征学习到数据的特征
from sklearn import preprocessing
X_scaled = preprocessing.scale(X,with_mean=True,with_std=True)
# 参数一:with_mean 均值是否转化为0
# 参数二:with_std 方差是否转化为1
print (X_scaled.mean(axis=0))
print (X_scaled.std(axis=0))
sklearn.preprocessing.StandardScaler
# 计算特征的均值和标准差,以使得可以重复利用该类对之后的测试数据进行相同的转换
preprocessing.StandardScaler().fit_transform("特征属性")
1)Min-Max标准化
- 可以将数据放缩到一个指定区间
preprocessing.MinMaxScaler(feature_range=(2, 4))
# 参数:feature_range=(min, max) 是指定区间的范围
2)稀疏数据的标准化
- 对稀疏数据直接进行标准化会破坏数据的稀疏结构,并且造成内存的过多消耗
- sklearn.preprocess提供了MaxAbsScaler和maxabs_scale
- 中心化后的数据预计足够小,也可以使用稀疏矩阵的toarray方法将稀疏输入转换为数组。
3)带离群值的标准化
- 如果数据中包含许多离群值,则使用数据的均值和方差进行缩放可能效果不佳。
- 转换后的数据将会均匀分布[0,1]区间
preprocessing.QuantileTransformer(n_quantiles=1000, random_state=0)
X_trans = quantile_transformer.fit_transform(X)
np.percentile(X_trans, [0, 25, 50, 75, 100])
X_trans_less = quantile_transformer.transform(X.iloc[:40])
np.percentile(X_trans_less, [0, 25, 50, 75, 100])
4)数据白化
- 去除特征之间的相关性
- 使用sklearn.decomposition.PCA
2、归一化
- 使得在样本向量之间进行点乘运算或者计算样本之间的相似性时,拥有统一的标准。它是文本分类和聚类上下文中使用的向量空间模型的基础。
- sklearn.preprocessing.normalize
preprocessing.normalize(X, norm='l2')
# 拿到新的样本时候,可以进行转化
normalizer.transform([[-1., 1., 0.]])
3、二值化
- 特征二值化是对数值特征进行阈值处理以获得布尔值的过程
preprocessing.Binarizer(threshold=1.0).fit(X)
# 参数:threshold 设置阈值 大于阈值的值转换为1,小于阈值的值转换为0
4、缺失值填补
- sklearn.preprocessing.Imputer类提供了用于填补缺失值的基本策略
imp = preprocessing.Imputer(missing_values='NaN', strategy='mean', axis=0)
imp.fit_transform([[1, 2], [np.nan, np.nan], [7, 10]])
5、多项式特征生成
考虑输入数据的非线性特性,增加模型的复杂性是有用的。一个简单而常用的方法就是生成多项式特征,它可以得到特征的高阶和交互项。sklearn提供sklearn.preprocessing.PolynomialFeatures实现这一过程。
poly = preprocessing.PolynomialFeatures(interaction_only=True, include_bias=False)
poly.fit_transform(X)
该类包括三个基本参数:
# degree:多项式特征的自由度,即最多由多少个特征组合而成,默认值为2;
# interaction_only:布尔值,默认为False,如果为True,则只包含多个特征相乘得到的特征(不包括自己与自己的乘积);
# include_bias:布尔值,默认为True,产生一列所有特征幂为零的列,即全为1的列。