scikit-learn中KNN演算法資料歸一化的分裝

我是馬克思小清新發表於2018-10-31

現在已經通過大量資料訓練出模型,那麼在做資料歸一化時,要考慮對訓練資料和測試資料都要歸一化。

但是測試資料在後面是需要當作測試模型效能的工具,它的存在是模擬真實環境。

1,真實環境是很可能無法得到所有測試資料的均值和方差的。

2,而且資料歸一化是KNN演算法的一部分。

比如,預測一朵花的型別,由一個資料是不能得到方差和均值的。

所以,對於測試資料應該使用訓練資料的均值和方差進行資料歸一化。

Xscale = (X_test - mean_train)/std_train

經過資料歸一化的預測流程如下:

只涉及到了均值方差的方法

import numpy as np

class StandardScaler:
    def __init__(self):
        """初始化"""
        """用符號和下劃線表示非使用者傳入的引數"""
        self.mean_ = None
        self.std_ = None

    def fit(self,X):
        """根據訓練資料獲得每一列的均值和方差"""
        """只處理2維的資料"""
        assert X.ndim == 2
        self.mean_ = np.array([np.mean(X[:,i]) for i in X.shape[1]])
        self.std_ = np.array([np.std(X[:,i]) for i in X.shape[1]])
        return  self

    def transform(self,X):
        """根據公式和求的均值方差求出資料歸一化的矩陣"""
        assert X.ndim  == 2
        assert self.mean_ and self.std_ is not None
        """建立一個和X大小,資料型別一樣的矩陣,用來存放歸一化後的資料"""
        resx = np.empty(shape = X.shape,dtype= float)
        for col in range(X.shape[1]):
            resx[:,col] = (X[:,col] - self.mean_[col]) /self.std_[col]
        return resx

 

相關文章