#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. Спасибо! ваш подход был полезен. Я понял это.