Как перенести границу принятия решения, полученную из масштабированных данных, в исходные данные (уменьшенные данные)?

#python #scikit-learn #svm

#python #scikit-learn #svm

Вопрос:

Я установил SVM на масштабированные входные данные, и прямо сейчас я пытаюсь найти способ перенести границу принятия решения, полученную из масштабированных данных, в исходные данные (немасштабированные данные). Как мне это сделать?

Я использовал следующее для построения границы решения:

 svc0.fit(Xs, y)
plot_decision_regions(X=Xs, y=y ,clf=svc0,legend=2)
  

введите описание изображения здесь

затем я просто уменьшил данные (svc0 по-прежнему устанавливается на масштабированные данные), но граница принятия решения выглядит странно:

 Xs_scaledback=scaler.inverse_transform(Xs) 

plot_decision_regions(X=Xs_scaledback,y=y,clf=svc0,legend=2)
  

введите описание изображения здесь

Мне нужно показать границу принятия решения для исходных (уменьшенных) данных. Как я могу это исправить ?!

Ответ №1:

Вы пытались объединить масштабирование ваших данных в оценщик?

Что-то вроде этого

 import numpy as np
import matplotlib.pyplot as plt

from sklearn.svm import SVC
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler

from sklearn.datasets import load_iris

data_dict = load_iris()

X, y = data_dict['data'][:, :2], data_dict['target']

model = make_pipeline(StandardScaler(), SVC())
model.fit(X,y) # You should do a train test split

def plot_decision_boundary(pred_func, X, y):
    # Set min and max values and give it some padding
    x_min, x_max = X[:, 0].min() - .5, X[:, 0].max()   .5
    y_min, y_max = X[:, 1].min() - .5, X[:, 1].max()   .5
    h = 0.01
    # Generate a grid of points with distance h between them
    xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
    # Predict the function value for the whole gid
    Z = pred_func(np.c_[xx.ravel(), yy.ravel()])
    Z = Z.reshape(xx.shape)
    # Plot the contour and training examples
    plt.contourf(xx, yy, Z, cmap=plt.cm.Spectral)
    plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Spectral)
    
    
plot_decision_boundary(model.predict, X, y)
  

Частично адаптировано из https://scikit-learn.org/stable/auto_examples/ensemble/plot_voting_decision_regions.html

Комментарии:

1. Спасибо Myccha. Масштабирование данных в этом случае реализуется на большем наборе данных (X_all), а Xs является подмножеством X_all. Мне нужно показать границу принятия решения, когда я уменьшил данные, которые, как ожидается, будут выглядеть как в масштабированных данных.

2. Можете ли вы попробовать мой код, используя plot_decision_boundary(make_pipeline(scaler, svc0).predict, Xs_scaledback)

3. Спасибо! ваш подход был полезен. Я понял это.