Kaggle 數據清洗挑戰 Day 2 - 數據縮放及標準化處理
今天是 Kaggle 數據清洗挑戰的第二天,任務是進行數據縮放(scaling)及標準化處理(normalization),分為四個部分:
- Get our environment set up
- Scaling vs. Normalization: Whats the difference?
- Practice scaling
- Practice normalization
1、搭建環境
第一步依然是引入我們需要的 lib 和數據集,這次任務里我們需要的 lib 包有 pandas、numpy、scipy、mlxtend、seaborn、matplotlib:
# modules well useimport pandas as pdimport numpy as np# for Box-Cox Transformationfrom scipy import stats# for min_max scalingfrom mlxtend.preprocessing import minmax_scaling# plotting modulesimport seaborn as snsimport matplotlib.pyplot as plt# read in all our datakickstarters_2017 = pd.read_csv("../input/kickstarter-projects/ks-projects-201801.csv")# set seed for reproducibilitynp.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 distributionoriginal_data = np.random.exponential(size = 1000)# mix-max scale the data between 0 and 1scaled_data = minmax_scaling(original_data, columns = [0])# plot both together to comparefig, 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.goalscaled_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 distributionoriginal_data = np.random.exponential(size = 1000)# normalize the exponential data with boxcoxnormalized_data = stats.boxcox(original_data)# plot both together to comparefig, 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 > 0vals = 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 第二天的內容,完畢~
推薦閱讀:
※大數據雙創行動計劃丨校車的智慧在哪裡?
※大數據下看打虎
※基於 MaxCompute 的極速的基因測序分析
※kaggle-zillows競賽的變數分析
※這家大數據公司,竟是英國脫歐與特朗普當選的背後功臣