今天的任务是进行数据缩放(scaling)及标准化处理(normalization),分为四个部分:
1、建立我们的环境
2、缩放和标准化:有什么区别?
3、实践扩展
4、实践标准化
01
搭建环境
我们使用的数据集是:众筹网站Kickstarter项目数据集,获取方式见文末~
第一步依然是引入我们需要的 lib 和数据集,这次任务里我们需要的 lib 包有 pandas、numpy、scipy、mlxtend、seaborn、matplotlib:
1# 我们使用的模块pandas和numpy
2import pandas as pd
3import numpy as np
4
5# Box-Cox转换:Box-Cox变换是统计建模中常用的一种数据变换,用于连续的响应变量不满足正态分布的情况。
6from scipy import stats
7
8# 线性归一化函数
9from mlxtend.preprocessing import minmax_scaling
10
11# 画图模块seaborn和matplotlib
12import seaborn as sns
13import matplotlib.pyplot as plt
14
15# 读取数据
16kickstarters_2017 = pd.read_csv("../input/Kickstarter2074/ks-projects-201801.csv")
02
数据缩放与数据标准化的区别
数据缩放(scaling)与标准化(normalization)两种操作都是对数据的大小做变化,从而便于后续的分析,那么两者的差别是什么呢?
数据缩放只是改变了数据总体的大小范围,可以加速梯度下降法的进程。
数据标准化是改变了数据分布的总体形状。
03
数据缩放实例
先来看数据缩放,它可以让我们的数据在特定的范围内,0~1 或 0~100 等。往往在基于 SVM 和 KNN 算法做数据分析时需要进行数据缩放。例如有一组商品价格的数据,有的商品价格单位是美元,有的单位是日元,而1美元约为100日元,如果不进行特征缩放,SVM 或 KNN 方法对于1美元偏差和1日元偏差会给出一样的计算,这显然是不合理的。下面看一个例子:
1# 从指数分布中随机抽取1000个数据点
2original_data = np.random.exponential(size = 1000)
3# 标准化
4scaled_data = minmax_scaling(original_data, columns = [0])
5# # 画图比较
6fig, ax=plt.subplots(1,2)
7sns.distplot(original_data, ax=ax[0])
8ax[0].set_title("Original Data")
9sns.distplot(scaled_data, ax=ax[1])
10ax[1].set_title("Scaled data")
这个例子中,我们在指数分布上随机选取了 1000 个点,然后使用 minmax_scaling() 方法对其进行缩放处理,我们看到数据分布的形状是没有变的,只是数据的范围从 0~8 变成了 0~1
再尝试处理我们之前引入的数据集 kickstarters_2017 中的 "goal":
1goal = kickstarters_2017.goal
2scaled_goal = minmax_scaling(goal, columns=[0])#axis=0或'index',对行进行操作,就是对每一列的所有行进行操作。xis=1或‘columns’,对列进行操作,就是对每一行的所有列进行操作。
3
4fig, ax = plt.subplots(1,2)
5sns.distplot(goal, ax=ax[0])
6ax[0].set_title('Original data')
7sns.distplot(scaled_goal, ax=ax[1])
8ax[1].set_title('Scaled data')
之所以数据分布为这个形状,是因为 "goal" 中的小数据过多~
04
数据标准化实例
数据缩放只是改变了数据的大小范围,而数据标准化处理是一种更为彻底的改变。当我们基于线性回归、高丝朴素贝叶斯等方法进行数据分析时,往往需要对数据进行标准化处理。
下面看一个实例,这里我们使用的是 Box-Cox 转换法:
1original_data = np.random.exponential(size = 1000)
2normalized_data = stats.boxcox(original_data)
3fig, ax=plt.subplots(1,2)
4sns.distplot(original_data, ax=ax[0])
5ax[0].set_title("Original Data")
6sns.distplot(normalized_data[0], ax=ax[1])
7ax[1].set_title("Normalized data")
数据的分布形状由 L 形分布变成了正态分布~
再处理我们之前引入的数据集 kickstarters_2017 中的 "pledged"
1pos_indexes = kickstarters_2017.pledged > 0
2vals = kickstarters_2017.pledged.loc[pos_indexes]
3scaled_vals = stats.boxcox(vals)[0]
4
5ig, ax=plt.subplots(1,2)
6sns.distplot(vals, ax=ax[0])
7ax[0].set_title("Original Data")
8sns.distplot(scaled_vals, ax=ax[1])
9ax[1].set_title("Normalized data")
标准化处理后的 "pledged" 数据分布已经接近正态,左边的凸起是因为 "pledged" 中偏小的数据更多一点。
这就是 5 天挑战第二天的内容,完毕~
注
数据集获取方式
公众号后台回复关键字【第二天】获取哦~
长按二维码关注我们
有趣的灵魂在等你