今天是 Kaggle 数据清洗挑战的第二天,任务是进行数据缩放(scaling)及标准化处理(normalization),分为四个部分:
- Get our environment set up
- Scaling vs. Normalization: What's the difference?
- Practice scaling
- Practice normalization
1、搭建环境
第一步依然是引入我们需要的 lib 和数据集,这次任务里我们需要的 lib 包有 pandas、numpy、scipy、mlxtend、seaborn、matplotlib:
# modules we'll use
import pandas as pd
import numpy as np
# for Box-Cox Transformation
from scipy import stats
# for min_max scaling
from mlxtend.preprocessing import minmax_scaling
# plotting modules
import seaborn as sns
import matplotlib.pyplot as plt
# read in all our data
kickstarters_2017 = pd.read_csv("../input/kickstarter-projects/ks-projects-201801.csv")
# set seed for reproducibility
np.random.seed(0)
2、数据缩放与数据标准化的差别
数据缩放(scaling)与标准化(normalization)两种操作都是对数据的大小做变化,从而便于后续的分析,那么两者的差别是什么呢?
数据缩放只是改变了数据总体的大小范围,这种方法也在之前的《机器学习:用梯度下降法实现线性回归》中介绍过,可以加速梯度下降法的进程。而数据标准化是改变了数据分布的总体形状。
3、数据缩放实例
先来看数据缩放,它可以让我们的数据在特定的范围内,0~1 或 0~100 等。往往在基于 SVM 和 KNN 算法做数据分析时需要进行数据缩放。例如有一组商品价格的数据,有的商品价格单位是美元,有的单位是日元,而1美元约为100日元,如果不进行特征缩放,SVM 或 KNN 方法对于1美元偏差和1日元偏差会给出一样的计算,这显然是不合理的。下面看一个例子:
# generate 1000 data points randomly drawn from an exponential distribution
original_data = np.random.exponential(size = 1000)
# mix-max scale the data between 0 and 1
scaled_data = minmax_scaling(original_data, columns = [0])
# plot both together to compare
fig, ax=plt.subplots(1,2)
sns.distplot(original_data, ax=ax[0])
ax[0].set_title("Original Data")
sns.distplot(scaled_data, ax=ax[1])
ax[1].set_title("Scaled data")
这个例子中,我们在指数分布上随机选取了 1000 个点,然后使用 minmax_scaling() 方法对其进行缩放处理,我们看到数据分布的形状是没有变的,只是数据的范围从 0~8 变成了 0~1.
再尝试处理我们之前引入的数据集 kickstarters_2017 中的 "goal":
goal = kickstarters_2017.goal
scaled_goal = minmax_scaling(goal, columns=[0])
fig, ax = plt.subplots(1,2)
sns.distplot(goal, ax=ax[0])
ax[0].set_title('Original data')
sns.distplot(scaled_goal, ax=ax[1])
ax[1].set_title('Scaled data')
之所以数据分布为这个形状,是因为 "goal" 中的小数据过多~
4、数据标准化实例
数据缩放只是改变了数据的大小范围,而数据标准化处理是一种更为彻底的改变。当我们基于线性回归、高丝朴素贝叶斯等方法进行数据分析时,往往需要对数据进行标准化处理。下面看一个实例,这里我们使用的是 Box-Cox 转换法:
# generate 1000 data points randomly drawn from an exponential distribution
original_data = np.random.exponential(size = 1000)
# normalize the exponential data with boxcox
normalized_data = stats.boxcox(original_data)
# plot both together to compare
fig, ax=plt.subplots(1,2)
sns.distplot(original_data, ax=ax[0])
ax[0].set_title("Original Data")
sns.distplot(normalized_data[0], ax=ax[1])
ax[1].set_title("Normalized data")
数据的分布形状由 L 形分布变成了正态分布~
再处理我们之前引入的数据集 kickstarters_2017 中的 "pledged" :
pos_indexes = kickstarters_2017.pledged > 0
vals = kickstarters_2017.pledged.loc[pos_indexes]
scaled_vals = stats.boxcox(vals)[0]
ig, ax=plt.subplots(1,2)
sns.distplot(vals, ax=ax[0])
ax[0].set_title("Original Data")
sns.distplot(scaled_vals, ax=ax[1])
ax[1].set_title("Normalized data")
标准化处理后的 "pledged" 数据分布已经接近正态,左边的凸起是因为 "pledged" 中偏小的数据更多一点。
这就是 5 Day Challenge 第二天的内容,完毕~
欢迎关注我的知乎专栏【数据池塘】,专注于分享机器学习、数据挖掘相关内容:https://zhuanlan.zhihu.com/datapool
⬇️ 扫描下方二维码关注公众号【数据池塘】 ⬇️
回复【算法】,获取最全面的机器学习算法网络图: