[英]How to store scaling parameters for later use
我想應用scikit-learn
提供的縮放sklearn.preprocessing.scale
模塊來集中我將用來訓練 svm 分類器的數據集。
然后我如何存儲標准化參數,以便我也可以將它們應用於我想要分類的數據?
我知道我可以使用標准standarScaler
但是我可以以某種方式將它序列化到一個文件中,這樣每次我想運行分類器時standarScaler
它與我的數據相匹配嗎?
我認為最好的方法是在fit
后腌制,因為這是最通用的選擇。 也許您稍后會創建一個由特征提取器和縮放器組成的管道。 通過酸洗(可能是復合的)階段,您可以使事情變得更加通用。 關於模型持久性的sklearn 文檔討論了如何做到這一點。
話雖如此,您可以查詢sklearn.preprocessing.StandardScaler
以獲取擬合參數:
scale_ : ndarray, shape (n_features,) 每個特征數據的相對縮放。 0.17 新版功能:推薦使用 scale_ 而不是不推薦使用的 std_。 mean_ :形狀為 [n_features] 的浮點數組,訓練集中每個特征的平均值。
以下簡短片段說明了這一點:
from sklearn import preprocessing
import numpy as np
s = preprocessing.StandardScaler()
s.fit(np.array([[1., 2, 3, 4]]).T)
>>> s.mean_, s.scale_
(array([ 2.5]), array([ 1.11803399]))
使用標准縮放器縮放
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit(data)
scaled_data = scaler.transform(data)
保存 mean_ 和 var_ 以備后用
means = scaler.mean_
vars = scaler.var_
(您可以打印和復制粘貼方式和變量或使用 np.save 保存到磁盤....)
以后使用保存的參數
def scale_data(array,means=means,stds=vars **0.5):
return (array-means)/stds
scale_new_data = scale_data(new_data)
酸洗通常是一個壞主意,至少在生產中( https://github.com/numpy/numpy/blob/b88b2c0c19851810d4ee07f03a7734b6e19dbdaa/numpy/lib/npyio.py#L472 ),所以我使用另一種方法:
# scaler is fitted instance of MinMaxScaler
scaler_data_ = np.array([scaler.data_min_, scaler.data_max_])
np.save("my_scaler.npy", allow_pickle=False, scaler_data_)
#some not scaled X
Xreal = np.array([1.9261148646249848, 0.7327923702472628, 118, 1083])
scaler_data_ = np.load("my_scaler.npy")
Xmin, Xmax = scaler_data_[0], scaler_data_[1]
Xscaled = (Xreal - Xmin) / (Xmax-Xmin)
Xscaled
# -> array([0.63062502, 0.35320565, 0.15144766, 0.69116555])
您可以使用 joblib 模塊來存儲縮放器的參數。
from joblib import dump
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit(data)
dump(scaler, 'scaler_filename.joblib')
稍后您可以加載定標器。
from joblib import load
scaler = load('scaler_filename.joblib')
transformed_data = scaler.transform(new_data)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.