【機器學習基礎】Python數據預處理:徹底理解標準化和歸一化

2021-03-02 機器學習初學者
數據預處理

數據中不同特徵的量綱可能不一致,數值間的差別可能很大,不進行處理可能會影響到數據分析的結果,因此,需要對數據按照一定比例進行縮放,使之落在一個特定的區域,便於進行綜合分析。

常用的方法有兩種:

最大 - 最小規範化:對原始數據進行線性變換,將數據映射到[0,1]區間

Z-Score標準化:將原始數據映射到均值為0、標準差為1的分布上

為什麼要標準化/歸一化?

提升模型精度:標準化/歸一化後,不同維度之間的特徵在數值上有一定比較性,可以大大提高分類器的準確性。

加速模型收斂:標準化/歸一化後,最優解的尋優過程明顯會變得平緩,更容易正確的收斂到最優解。

如下圖所示:

哪些機器學習算法需要標準化和歸一化

1)需要使用梯度下降和計算距離的模型要做歸一化,因為不做歸一化會使收斂的路徑程z字型下降,導致收斂路徑太慢,而且不容易找到最優解,歸一化之後加快了梯度下降求最優解的速度,並有可能提高精度。比如說線性回歸、邏輯回歸、adaboost、xgboost、GBDT、SVM、NeuralNetwork等。需要計算距離的模型需要做歸一化,比如說KNN、KMeans等。

2)概率模型、樹形結構模型不需要歸一化,因為它們不關心變量的值,而是關心變量的分布和變量之間的條件概率,如決策樹、隨機森林。

徹底理解標準化和歸一化

示例數據集包含一個自變量(已購買)和三個因變量(國家,年齡和薪水),可以看出用薪水範圍比年齡寬的多,如果直接將數據用於機器學習模型(比如KNN、KMeans),模型將完全有薪水主導。

#導入數據
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
df = pd.read_csv('Data.csv')

缺失值均值填充,處理字符型變量

df['Salary'].fillna((df['Salary'].mean()), inplace= True)
df['Age'].fillna((df['Age'].mean()), inplace= True)
df['Purchased'] = df['Purchased'].apply(lambda x: 0 if x=='No' else 1)
df=pd.get_dummies(data=df, columns=['Country'])

最大 - 最小規範化

from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
scaler.fit(df)
scaled_features = scaler.transform(df)
df_MinMax = pd.DataFrame(data=scaled_features, columns=["Age", "Salary","Purchased","Country_France","Country_Germany", "Country_spain"])

Z-Score標準化

from sklearn.preprocessing import StandardScaler
sc_X = StandardScaler()
sc_X = sc_X.fit_transform(df)
sc_X = pd.DataFrame(data=sc_X, columns=["Age", "Salary","Purchased","Country_France","Country_Germany", "Country_spain"])

import seaborn as sns
import matplotlib.pyplot as plt
import statistics
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
fig,axes=plt.subplots(2,3,figsize=(18,12)) 
sns.distplot(df['Age'], ax=axes[0, 0])
sns.distplot(df_MinMax['Age'], ax=axes[0, 1])
axes[0, 1].set_title('歸一化方差:% s '% (statistics.stdev(df_MinMax['Age'])))
sns.distplot(sc_X['Age'], ax=axes[0, 2])
axes[0, 2].set_title('標準化方差:% s '% (statistics.stdev(sc_X['Age'])))
sns.distplot(df['Salary'], ax=axes[1, 0])
sns.distplot(df_MinMax['Salary'], ax=axes[1, 1])
axes[1, 1].set_title('MinMax:Salary')
axes[1, 1].set_title('歸一化方差:% s '% (statistics.stdev(df_MinMax['Salary'])))
sns.distplot(sc_X['Salary'], ax=axes[1, 2])
axes[1, 2].set_title('StandardScaler:Salary')
axes[1, 2].set_title('標準化方差:% s '% (statistics.stdev(sc_X['Salary'])))

可以看出歸一化標準化方法產生的標準差小,使用歸一化來縮放數據,則數據將更集中在均值附近。這是由於歸一化的縮放是「拍扁」統一到區間(僅由極值決定),而標準化的縮放是更加「彈性」和「動態」的,和整體樣本的分布有很大的關係。所以歸一化不能很好地處理離群值,而標準化對異常值的魯棒性強,在許多情況下,它優於歸一化。

參考:https://towardsdatascience.com/data-transformation-standardisation-vs-normalisation-a47b2f38cec2

相關焦點

  • Python數據預處理:徹底理解標準化和歸一化
    數據預處理數據中不同特徵的量綱可能不一致,數值間的差別可能很大,不進行處理可能會影響到數據分析的結果,因此,需要對數據按照一定比例進行縮放,使之落在一個特定的區域,便於進行綜合分析。為什麼要標準化/歸一化?提升模型精度:標準化/歸一化後,不同維度之間的特徵在數值上有一定比較性,可以大大提高分類器的準確性。加速模型收斂:標準化/歸一化後,最優解的尋優過程明顯會變得平緩,更容易正確的收斂到最優解。
  • Python數據預處理
    ,首先需要進行初步的數據探索性分析,對數據探索性分析之後要先進行一系列的數據預處理步驟。因為拿到的原始數據存在不完整、不一致、有異常的數據,而這些「錯誤」數據會嚴重影響到數據挖掘建模的執行效率甚至導致挖掘結果出現偏差,因此首先要數據清洗。數據清洗完成之後接著進行或者同時進行數據集成、轉換、歸一化等一系列處理,該過程就是數據預處理。一方面是提高數據的質量,另一方面可以讓數據更好的適應特定的挖掘模型,在實際工作中該部分的內容可能會佔整個工作的70%甚至更多。
  • Python數據分析之scikit-learn與數據預處理​
    1 無量綱化對於大部分機器學習任務而言,對原始數據進行無量綱化是是建模前的必不可少的一個環節。通過無量綱化,可以消除量綱不一致對模型造成的不良影響。標準化和歸一化是最為常見的兩種無量綱化方法,下面分別展開介紹這兩種方法。1.1 標準化標準化對數據的分布的進行轉換,使其符合某種分布(一般指正態分布)的一種特徵變換。
  • 數據轉換 :標準化vs 歸一化(附代碼&連結)
    翻譯:林鶴衝  校對:王紫嶽本文將解釋數據轉換中常見的特徵縮放方法:「標準化」和「歸一化」的不同之處,並舉例說明何時使用,以及如何使用它們。數本文將解釋數據轉換中常見的特徵縮放方法:「標準化」和「歸一化」的不同之處,並舉例說明何時使用,以及如何使用它們。數據轉換是數據處理中十分基本的步驟之一。當我初學特徵縮放的時候,經常用到「縮放」 「標準化」「歸一化」等術語。但是卻很難找到應該在什麼時候,使用哪一種方法的信息。
  • 數據處理中的標準化、歸一化究竟是什麼?
    今天說一個比較重要的內容,無論是在算法建模還是在數據分析都比較常見:數據歸一化和標準化。開始之前,請你先把網上看到的所有相關的博客、帖子都忘掉。當然,如果你在閱讀文章的時候,發現存在問題歡迎留言批評指正但是我覺得你可能沒有批評指正的機會先來說下概念數據歸一化和標準化都屬於數據特徵無量綱的一種方式。無量綱指的是將不同規格的數據轉換到同一規格,或不同分布的數據轉換到某個特定分布的需求,稱之為數據「無量綱化」。
  • B站最強學習資源匯總(Python,數據科學,機器學習)
    強調在知識的廣度、深度和趣味性之間尋找最佳平衡點,在生動幽默中講述數據挖掘的核心思想、關鍵技術以及一些在其它相關課程和教科書中少有涉及的重要知識點,適合對大數據和數據科學感興趣的各專業學生以及工程技術人員學習。
  • 利用 Scikit Learn的Python數據預處理實戰指南
    有更多的選擇來進行預處理,這將是我們要探索的。讀完本文,你將具備數據預處理的基本技能並對其有更深入的理解。為了方便起見,我附上了進一步學習機器學習算法的一些資源,並且為更好地掌握這些概念,設計了幾個小練習。
  • python數據科學-數據預處理
    數據預處理是我們在做機器學習之前必經的一個過程,在機器學習中常見的數據預處理包括缺失值處理,縮放數據以及對數據進行標準化處理這三個過程
  • 數據變換-歸一化與標準化
    數據變換的方法有很多,比如數據平滑,數據聚集,數據概化,數據規範化和屬性構造等。本篇文章主要介紹數據規範化,這是一種比較常用,也比較簡單的方法。1,數據歸一化歸一化就是獲取原始數據的最大值和最小值,然後把原始值線性變換到 [0,1] 範圍之內,變換公式為:其中:x 是當前要變換的原始值。min 是當前特徵中的最小值。
  • 【機器學習基礎】Python機器學習入門指南(全)
    按照學習數據分布的方式的不同,主要可以分為監督學習和非監督學習:1.1 監督學習從有標註的數據(x為變量特徵空間, y為標籤)中,通過選擇的模型及確定的學習策略,再用合適算法計算後學習到最優模型,並用模型預測的過程。
  • 表達矩陣的歸一化和標準化,去除極端值,異常值
    上一期:RNA-seq的counts值,RPM, RPKM, FPKM, TPM 的異同在數據挖掘過程,數據的歸一化和標準化是必須的。取log值就是一種歸一化的方法,z-score是常用的標準正態分布化的方法。歸一化和標準化的區別實際上口語裡面通常是沒辦法很便捷的區分這兩個概念。
  • Python視頻教程網課編程零基礎入門數據分析網絡爬蟲全套Python...
    20爬蟲scrapy框架及案例 21數據分析 22機器學習 23深度學習 24數據結構和算法 25python網絡爬蟲 26機器學習入門篇 27機器學習入門篇2 28機器學習提升篇 29數據挖掘篇 30深度學習必備原理與實戰 31深度學習必備原理與實戰
  • 專業解讀:為什麼要做特徵歸一化和標準化?
    本文解讀了一項數據預處理中的重要技術——特徵歸一化,提出並解答了5個相關問題,同時分析了相關方法和適用場景。
  • 入門 | 三行Python代碼,讓數據預處理速度提高2到6倍
    本文可以教你僅使用 3 行代碼,大大加快數據預處理的速度。Python 是機器學習領域內的首選程式語言,它易於使用,也有很多出色的庫來幫助你更快處理數據。但當我們面臨大量數據時,一些問題就會顯現……目前,大數據(Big Data)這個術語通常用於表示包含數十萬數據點的數據集。在這樣的尺度上,工作進程中加入任何額外的計算都需要時刻注意保持效率。
  • 用Python 做機器學習不得不收藏的重要庫
    -82a9ada57aeb 用 Python 做機器學習不得不收藏的重要庫 Python庫幫助那些不具備開發人員知識的研究人員/數學家輕鬆地「進行機器學習」。 他基於兩個python庫:Numpy 和 Scipy 。 他為常見的機器學習和數據挖掘提供了一組算法:聚類,回歸和分類。甚至像數據轉換,特徵選擇,集成學習這樣的任務也可與通過簡短幾行代碼實現。 對於機器學習的新手來說,Scikit-learn 是一個夠用的工具,直到你自己開始實現更複雜的算法。
  • 【動手學計算機視覺】第十三講:批量歸一化
    備註:在有些文章中Batch Normalization也有被譯作批量標準化當我們用一些數據做一個預測系統時,我們首先需要對數據進行預處理,例如標準化、正則化、滑動窗口等,比如常用的Z-score、最大最小標準化,它能將數據轉化為同一個量級,這樣的話能夠保證數據的穩定性、可比性。
  • 解讀:為什麼要做特徵歸一化/標準化?
    本文解讀了一項數據預處理中的重要技術——特徵歸一化,提出並解答了5個相關問題,同時分析了相關方法和適用場景。
  • Python機器學習·微教程
    而是引導你從一個機器學習初級開發者,到能夠基於python生態開展機器學習項目的專業開發者。教程目錄第2節:熟悉使用python、numpy、matplotlib和pandas希望大家在學習的過程中能夠自主尋找解決困難的辦法,網上資源很豐富,這也是自我提升很關鍵的一步。當然也可以在評論區留言哦!
  • 機器學習模型必不可少的5種數據預處理技術
    如果您曾經參與過數據科學項目,那麼您可能會意識到數據挖掘的第一步和主要步驟是數據預處理。在現實生活問題中,我們得到的原始數據往往非常混亂,機器學習模型無法識別模式並從中提取信息。1.處理null值:null值是數據中任何行或列中缺失的值。
  • 深入探討:為什麼要做特徵歸一化/標準化?
    文 | shine-lee源 | CSDN本文解讀了一項數據預處理中的重要技術——特徵歸一化,提出並解答了5個相關問題,同時分析了相關方法和適用場景。Feature scaling,常見的提法有「特徵歸一化」、「標準化」,是數據預處理中的重要技術,有時甚至決定了算法能不能work以及work得好不好。