4 votes

Comment mettre à l'échelle un échantillon unique pour la prédiction dans sklearn ?

J'ai un ensemble de données mises à l'échelle qui est déjà ajusté à un modèle de régression.

Lorsque l'on introduit un seul échantillon à prédire, comment doit-on mettre à l'échelle cette entrée avant la prédiction ?

Je pourrais concat au cadre de données d'origine, le redimensionner et extraire la ligne du bas. Mais cela ne crée-t-il pas une fuite de données ? N'est-ce pas ? Il faudrait aussi que je réorganise le modèle ?

Quelle est la bonne façon de faire face à cette situation ?

3voto

Infinite Points 559

Vous devez utiliser le modèle que vous avez formé précédemment pour mettre à l'échelle les données de test.

Si vous insérez cette ligne dans le cadre de données d'origine, ce n'est pas la bonne méthode, car vous provoquez une fuite de données, et vous ne pourrez pas voir les données réelles dans Production de cette manière.

Supposons que vous ayez plus d'un de ces échantillons et que vous décidiez de modéliser le curvimètre en regardant ces nouvelles données à nouveau, ceci est considéré comme une mauvaise pratique et cause des fuites de données, votre modèle original de curvimètre qui a été formé en regardant les données de formation devrait seulement être utilisé.

Ce qui est intéressant pour moi, c'est ce qui se passe si vos données de formation et de test ont des distributions différentes. Dans ce cas, peu importe la façon dont vous choisissez votre stratégie de mise à l'échelle, elle ne fonctionnera pas bien avec les données de test.
lien qui décrit le problème et les solutions possibles.

Voici un exemple de mise à l'échelle de vos données d'entraînement et de test, reproduit à partir de -. aquí

import numpy as np
import matplotlib as mpl
from matplotlib import pyplot as plt
from matplotlib import cm
from sklearn.preprocessing import RobustScaler
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split

## load the dataset
dataset = fetch_california_housing()
X_full, y_full = dataset.data, dataset.target
##split into train and test
X_train,X_test,y_train,y_test = train_test_split(X_full,y_full)

## initialize the scaler
scale = RobustScaler()

### you are fitting the scaler and then transforming the data
## the scaler looks at the data in the train set and creates a model
## which will be used to transform the data
X_train_scaled = scale.fit_transform(X_train)
print(X_train)
print(X_train_scaled)

#### scale has been fitted once , you should be using this now
### on all test/ predict data that come in
### hence the below line only applies transform on the data
### if you are going to fit again that would mean data-leakage
X_test_scale = scale.transform(X_test)

1voto

seralouk Points 5618

Cet exemple utilise MinMaxScaler pour mettre à l'échelle les données mais le même principe s'applique à all cas.

La procédure en résumé :

  • Étape 1 : adapter le scaler sur le TRAINING data
  • Étape 2 : utiliser le scaler a transform the training data
  • Étape 3 : utiliser le transformed training data a fit the predictive model
  • Étape 4 : utiliser le scaler a transform the TEST data
  • Étape 5 : predict en utilisant le trained model et le transformed TEST data

Exemple utilisant les données de l'iris :

import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
from sklearn.svm import SVC

data = datasets.load_iris()
X = data.data
y = data.target

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)

scaler = MinMaxScaler()
X_train_scaled = scaler.fit_transform(X_train) # fit it on the training data

model = SVC()
model.fit(X_train_scaled, y_train)

X_test_scaled = scaler.transform(X_test) # apply it on the test data
y_pred = model.predict(X_test_scaled) # model prediction on the scaled test set

J'espère que cela vous aidera. Cheers

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X