數據歸一化


數據歸一化:將所有數據映射到同一尺度

常用方式:最值歸一化 均值方差歸一化

最值歸一化(normalization)

把所有數據都映射到0-1之間

適用范圍: 適用於特征數組元素有明顯的分布邊界的情況(如學生成績,最高100, 最低0),但是會受到outlier(異常值)的影響

均值方差歸一化

把所有數據都映射到均值為0,方差為1的分布中

適用范圍:數據分布沒有明顯邊界,有可能存在異常值的情況 (均值方差歸一化對於有明顯邊界的分布也比較友好,所以一般都推薦均值方差歸一化)

手動對特征數組進行最值歸一化

# 生成一個(50,2)的隨機數組,使用matplotlib繪制散點圖
X = np.random.randint(0, 100, (50, 2))
X = np.array(X, dtype=float)
X
plt.scatter(X[:,0], X[:,1])
plt.show()

# 進行最值歸一化
X[:,0] = (X[:,0] - np.min(X[:,0])) / (np.max(X[:,0]) - np.min(X[:,0]))
X[:,1] = (X[:,1] - np.min(X[:,1])) / (np.max(X[:,1]) - np.min(X[:,1]))
plt.scatter(X[:,0], X[:, 1])
plt.show()

手動對特征數組進行均值方差歸一化

# 生成一個(50,2)的隨機數組,使用matplotlib繪制散點圖
X = np.random.randint(0, 100, (50, 2))
X = np.array(X, dtype=float)
X
plt.scatter(X[:,0], X[:,1])
plt.show()

# 進行均值方差歸一化
X[:, 0] = (X[:,0] - np.mean(X[:,0])) / np.std(X[:, 0])
X[:, 1] = (X[:,1] - np.mean(X[:,1])) / np.std(X[:, 1])
plt.scatter(X[:, 0], X[:, 1])
plt.show()

使用sklearn中的Scaler類對數據進行歸一化

Scaler類的使用流程

代碼示例:

import numpy as np
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler


iris = datasets.load_iris()  # 加載鳶尾花數據集
X = iris.data  # 特征數組
y = iris.target  # 標簽向量
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=666)
standardScaler = StandardScaler()  # 實例化這個類
standardScaler.fit(X_train)
print(standardScaler.mean_)  # 根據訓練數據集算出的均值向量
print(standardScaler.scale_) # 根據訓練數據集算出的方差向量
X_train_new = standardScaler .transform(X_train)  # 對訓練數據特征數組進行歸一化
X_test_new = standardScaler.transform(X_test)  # 對測試數據特征數組進行歸一化


from sklearn.neighbors import KNeighborsClassifier
knn_clf = KNeighborsClassifier(n_neighbors=3)
knn_clf.fit(X_train_new, y_train)
knn_clf.score(X_test_new, y_test)  # 當訓練數據集進行了數據歸一化,那么測試數據集也必須進行數據歸一化

運行結果:


免責聲明!

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



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