Kaggle 数据清洗挑战 Day 2 - 数据缩放及标准化处理

今天是 Kaggle 数据清洗挑战的第二天,任务是进行数据缩放(scaling)及标准化处理(normalization),分为四个部分:

  1. Get our environment set up
  2. Scaling vs. Normalization: What's the difference?
  3. Practice scaling
  4. 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

⬇️ 扫描下方二维码关注公众号【数据池塘】 ⬇️

回复【算法】,获取最全面的机器学习算法网络图:

发布了38 篇原创文章 · 获赞 23 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/cyan_soul/article/details/79751631