数据清洗挑战Day2 | 数据缩放及标准化处理

今天的任务是进行数据缩放(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 天挑战第二天的内容,完毕~

数据集获取方式

  • 公众号后台回复关键字【第二天】获取哦~

长按二维码关注我们

有趣的灵魂在等你

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值