在机器学习中,特征与模型都很重要,因此在数据集中寻找本质特征有利于后面的工作,借鉴了以前上课的课件,今天总结一下机器学习的几种数据预处理方法。
1. 规范化(包括标准化和归一化)
将特征值按比例缩放映射至指定的区间,例如[-1,0]、[0,1],从而克服不同特征之间的取值差异。
1.1 标准化(Standardization)
Z-score标准化
μ为所有样本特征的平均值,σ为所有样本特征的标准差,处理后的样本特征符合标准正态分布(即均值为0、标准差为1),即:
#标准化
from sklearn import preprocessing
import numpy as np
X_train = np.array([[ 1., -4., 6.], [ 0., -4., 2.], [ 1., -1., 0.]])
scaler = preprocessing.StandardScaler().fit(X_train)
X_scaled = scaler.transform(X_train)
#处理后数据的均值和方差
print(X_scaled.mean(axis=0))
print(X_scaled.std(axis=0))
#直接使用模型对测试集数据进行转换
X_test=scaler.transform([[-1., 6., 2.]])
print(X_test)
1.2 归一化(Normalization)
min-max normalization:
通过对原始样本特征的进行以下线性变换,使结果值映射到[0,1]之间。
其中,x与x*分别为原始特征与标准化后的特征,x_max与x_min分别为原理特征的最大值与最小值。
缺点:当有新数据加入时,x_max和x_min可能会发生变化,需要重新定义。
#归一化(缩放特征值)
from sklearn import preprocessing
import numpy as np
X_train = np.array([[ 2., -4., 3.],
[ 4., -1., 5.],
[ 1., 0., -2.]])
min_max_scaler=preprocessing.MinMaxScaler(feature_range=(-1, 1))#设区间为[-1,1],默认为[0,1]
x_train_feature = min_max_scaler.fit_transform(X_train)
print('x_train_feature:\n',x_train_feature)
print('----------------------------------------')
X_test = np.array([[ -1., 0., 1.]])
X_test_feature = min_max_scaler.transform(X_test)
print('X_test_feature:\n',X_test_feature)
2.离散化(Discretization)
为解决特定的分类问题或为简化分类模型的复杂度,有时需要采用特定标记将特征原始取值进行离散化处理;如在成绩预测中,将小于60分成绩标记为C,将60至80之间的成绩标记为B,将80至100之间的成绩标记为A。
scores=[20,70,60,100,80,66,88,92]
grade=[]
for i in scores:
if i<60 and i>=0:
grade.append('C')
if i>=60 and i<80:
grade.append('B')
if i>=80 and i<=100:
grade.append('A')
print(scores)
print(grade)
3.正则化(Regularization)
参考:规范化、标准化、归一化、正则化_代码_c的博客-CSDN博客_归一化和规范化
在求解最优化问题中,调节拟合程度的参数一般称为正则项,越大表明欠拟合,越小表明过拟合
为了解决过拟合问题,通常有两种方法,第一是减小样本的特征(即维度),第二是正则化(又称为惩罚penalty)
正则化的一般形式是在整个平均损失函数的最后增加一个正则项(L2范数正则化,也有其他形式的正则化,作用不同)
正则项越大表明惩罚力度越大,等于0表示不做惩罚。
正则项越小,惩罚力度越小,极端为正则项为0,则会造成过拟合问题;正则化越大,惩罚力度越大,则容易出现欠拟合问题。
了解更多特征工程的知识,可以看看大佬的文章:什么是特征工程?如何进行特征工程?_图灵的猫i的博客-CSDN博客_特征工程