【筆記】scikit-learn中的Scaler(歸一化)


scikit-learn中的數據歸一化

在機器學習使用數據歸一化的時候有一個重要的注意事項

我們對訓練數據進行均值和方差的處理,得到mean_train以及std_train,但是在對測試數據進行歸一化的時候,是不能直接用測試數據的均值和方差來進行歸一化的,應該使用訓練數據的均值和方差對測試數據進行均值方差歸一化

為什么要這樣做呢,我們訓練這個模型是為了在真實的環境中去使用的,測試數據是模擬真實的環境,但是真實環境很有可能是沒法得到所有的測試數據的均值和方差的,是很難得到這種統計數據的,另外,對數據的歸一化也是算法的一部分,我們針對后面來的數據,應該也對其進行這樣的處理

那么我們就必須要保存訓練數據集得到的均值和方差
整體流程

實際操作(以鳶尾花為例)
x前十行的內容(並未進行歸一化處理)

scikit-learn中的standardscaler
想調用,只需要

  from sklearn.preprocessing import StandardScaler

創建一個實例

  standardScaler = StandardScaler()

進行fit操作,其包含了很多的信息

  standardScaler.fit(X_train)

數組的均值(對應的四個特征的均值)
對於mean_的_,對於是由用戶傳進去的變量計算得到的,用戶可以隨時在外圍進行查詢的,在后面要有_才行

方差

  standardScaler.std_

這個我的版本已經棄用了,使用的話會報錯

標准差

  standardScaler.scale_

現在可以正式使用transform進行數據歸一化處理

注意:這樣處理以后,X_train實際上沒有進行變化

使用

  X_train = standardScaler.transform(X_train)

就可以使X_train保存下歸一化以后的矩陣了
在對訓練矩陣進行歸一化

  X_test_standard = standardScaler.transform(X_test)

使用knn算法進行預測分析准確率

值得注意的是,當我們用歸一化以后的訓練集來訓練機器算法之后,我們在預測的時候,測試數據集必須同樣進行歸一化,不然的話准確率會相當的低

在pc中手動寫出可以實現的歸一化

  import numpy as np


  class StandardScaler:

      def __init__(self):
          self.mean_ = None
          self.scale_ = None;

      def fit(self, X):
          assert X.ndim == 2, "The dimension of X must be 2"

          self.mean_ = np.array([np.mean(X[:, i]) for i in range(X.shape[1])])
          self.scale_ = np.array([np.std(X[:, i]) for i in range(X.shape[1])])

          return self

      def tranform(self, X):
          assert X.ndim == 2, "The dimension of X must be 2"
          assert self.mean_ is not None and self.scale_ is not None, \
              "must fit before transform!"
          assert X.shape[1] == len(self.mean_), \
              "the feature number of X must be equal to mean_ and std_"

          resX = np.empty(shape=X.shape, dtype=float)
          for col in range(X.shape[1]):
              resX[:, col] = (X[:, col] - self.mean_[col]) / self.scale_[col]

          return resX


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM