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