在标准化训练数据之后使用sklearn预测新数据

S.A*_*EEN 8 python machine-learning scikit-learn

我使用Sklearn通过以下步骤构建线性回归模型(或任何其他模型):

X_train和Y_train是训练数据

  1. 标准化培训数据

      X_train = preprocessing.scale(X_train)
    
    Run Code Online (Sandbox Code Playgroud)
  2. 适合模型

     model.fit(X_train, Y_train)
    
    Run Code Online (Sandbox Code Playgroud)

一旦模型与缩放数据拟合,我如何使用拟合模型预测新数据(一次一个或多个数据点)?

我正在使用的是

  1. 缩放数据

    NewData_Scaled = preprocessing.scale(NewData)
    
    Run Code Online (Sandbox Code Playgroud)
  2. 预测数据

    PredictedTarget = model.predict(NewData_Scaled)
    
    Run Code Online (Sandbox Code Playgroud)

我想我错过了一个转换函数,preprocessing.scale以便我可以用训练过的模型保存它,然后将它应用到新的看不见的数据上?请帮忙.

ily*_*nam 18

看看这些文档.

您可以使用StandardScaler预处理模块的类来记住训练数据的缩放,以便将其应用于未来的值.

from sklearn.preprocessing import StandardScaler
X_train = np.array([[ 1., -1.,  2.],
                    [ 2.,  0.,  0.],
                    [ 0.,  1., -1.]])
scaler = preprocessing.StandardScaler().fit(X_train)
Run Code Online (Sandbox Code Playgroud)

scaler 计算了平均值和比例因子以标准化每个特征.

>>>scaler.mean_
array([ 1. ...,  0. ...,  0.33...])
>>>scaler.scale_                                       
array([ 0.81...,  0.81...,  1.24...])
Run Code Online (Sandbox Code Playgroud)

要将其应用于数据集:

import numpy as np

X_train_scaled = scaler.transform(X_train)
new_data = np.array([-1.,  1., 0.])    
new_data_scaled = scaler.transform(new_data)
>>>new_data_scaled
array([[-2.44...,  1.22..., -0.26...]])
Run Code Online (Sandbox Code Playgroud)

  • 但这只能在同一个会话中起作用,对吗?有什么方法可以保存缩放器以供以后的会话使用,就像您可以保存经过训练的神经网络的模型/权重一样? (6认同)

Pra*_*kar 7

当您使用和单次运行时,上面的答案是可以的...... 但是如果您想要或在训练后怎么办?train datatest data
testinfer

这肯定会有所帮助

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

iris = datasets.load_iris()
X = iris.data 

sc = StandardScaler()
sc.fit(X)
x = sc.transform(X)
#On new data, though data count is one but Features count is still Four
sc.transform(np.array([[6.5, 1.5, 2.5, 6.5]]))  # to verify the last returned output



std  = np.sqrt(sc.var_)
np.save('std.npy',std )
np.save('mean.npy',sc.mean_)
Run Code Online (Sandbox Code Playgroud)

该块是独立的

s = np.load('std.npy')
m = np.load('mean.npy')
(np.array([[6.5, 1.5, 2.5, 6.5]] - m)) / s   # z = (x - u) / s ---> Main formula
# will have same output as above
Run Code Online (Sandbox Code Playgroud)