scikit基础与机器学习入门(5) 归一化,标准化和正则化,二值化
归一化,标准化和正则化,二值化
概念和含义
数据归一化:将数据集中某一列数值特征的值缩放到0-1区间内
\[z= \frac{X-min(X)}{max(X)-min(X)}
\]
对不同特征维度进行伸缩变换,把有量纲表达式变为无量纲表达式;
改变原始数据的分布,使得各个特征维度对目标函数的影响权重归于一致;
最大值与最小值非常容易受异常点影响,鲁棒性较差。
数据标准化:将数据集中某一列数值特征的值缩放成平均值为0,标准差为1的状态
\[z = \frac{x_i-\bar{x}}{std(x)}
\]
对不同特征维度的伸缩变换使其不同度量之间的特征具有可比性;
不改变原始数据的分布,保持各个特征维度对目标函数的影响权重;
对目标函数的影响体现在几何分布上。
标准化和归一化,笔者个人认为平时在用时这两个概念并不是十分清晰的,比如最大最小标准化就可以称为归一化的一种,再HMM算法求投射矩阵和转移矩阵时,需要一步频率代表概率的过程,这一步也称作归一化,但此时不能称为标准化,貌似归一化更强调变为一这一特质。关于两者之间的联系和区别,我将在有新的理解之后更新
数据正则化:将数据集中某一个样本缩放成单位标准
正则化是缩放单个样本以具有单位范数的过程。正则化有时也叫归一化,正规化。如果你计划使用
二次形式(如点积或任何其他核函数)来量化任何样本间的相似度,则此过程将非常有用。
主要应用于文本分类和聚类中。
\[z = \frac{x_i}{||x||_p}
\]

标准化/归一化API实现
- StandardScaler: 缩放至0均值,1标准差。
- MinMaxScaler: 缩放至[0,1]之间,也可以指定范围feature_range。
- MaxAbsScaler: 缩放至[-1,1]之间,无偏移。
- RobustScaler:缩放有异常值的特征。
最大最小标准化
from sklearn import preprocessing
minmaxscaler = preprocessing.MinMaxScaler(feature_range = (0,1))
minmaxscaler.fit(df.values)
data = minmaxscaler.transform(df.values)
dfscaled = pd.DataFrame(data,columns = list(boston.feature_names))
dfscaled.plot(legend = False)
RobustScaler——用于有异常值的特征
此时既能保留异常值,又能防止异常值对整体的影响
x = np.array([10,1000,0,0,-30,0,20,0,10,0,0,-10])
x = x.reshape(-1,1)
robustscaler = preprocessing.RobustScaler(with_centering=True, with_scaling=True,
quantile_range=(25.0, 75.0), copy=True)
print(robustscaler.fit_transform(x)) # 可以这样写合两个操作为1

MaxAbsScaler——缩放稀疏矩阵
此时不改变0的个数和位置,其他元素被缩放
y = np.array([0]*95+[0.0,20,0,10,-10])
y = y.reshape(-1,1)
scaler = preprocessing.MaxAbsScaler(copy=True)
z = scaler.fit_transform(y)
z[-10:]

特征的正则化
from sklearn import preprocessing
X = [[ 1., -1., 2.],
[ 2., 0., 0.],
[ 0., 1., -1.]]
# 使用normalize函数
X_normalized = preprocessing.normalize(X, norm='l2')
print(X_normalized)
# 也可以使用Normalizer类
normalizer = preprocessing.Normalizer(norm = 'l1')
normalizer.fit(X)
normalizer.transform(X)

特征的二值化
特征二值化是将数值特征用阈值过滤得到布尔值的过程。
X = [[ 1., -1., 2.],
[ 2., 0., 0.],
[ 0., 1., -1.]]
binarizer = preprocessing.Binarizer().fit(X) # fit does nothing
binarizer
binarizer.transform(X)

设定一个阈值
binarizer = preprocessing.Binarizer(threshold=1.1)
binarizer.transform(X)

参考博客
很喜欢听到一个老师说的“半年理论”,现在做出的努力,一般要在半年的沉淀之后,才能出结果,所以在遇到瓶颈之时,不妨再努力半年

浙公网安备 33010602011771号