0

scikit-learn: Как вернуть предсказанное значение 'y' к исходному масштабу

13

Я пытаюсь изучить библиотеку scikit-learn и машинное обучение, используя набор данных о жилье в Бостоне.

Я разделил исходный набор данных на обучающий и тестовый, используя следующий код:

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(housing_X, housing_y, test_size=0.25, random_state=33)

Затем я масштабировал эти два набора данных:

from sklearn.preprocessing import StandardScaler
scalerX = StandardScaler().fit(X_train)
scalery = StandardScaler().fit(y_train)
X_train = scalerX.transform(X_train)
y_train = scalery.transform(y_train)
X_test = scalerX.transform(X_test)
y_test = scalery.transform(y_test)

После этого я создал модель:

from sklearn import linear_model
clf_sgd = linear_model.SGDRegressor(loss='squared_loss', penalty=None, random_state=42) 
train_and_evaluate(clf_sgd, X_train, y_train)

Теперь, основываясь на этой новой модели clf_sgd, я пытаюсь предсказать значение y, основываясь на первом экземпляре X_train:

X_new_scaled = X_train[0]
print(X_new_scaled)
y_new = clf_sgd.predict(X_new_scaled)
print(y_new)

Однако результат выглядит довольно странно для меня (1.34032174 вместо 20-30, диапазон цен на дома).

[-0.32076092  0.35553428 -1.00966618 -0.28784917  0.87716097  1.28834383
  0.4759489  -0.83034371 -0.47659648 -0.81061061 -2.49222645  0.35062335
 -0.39859013]
[ 1.34032174]

Я подозреваю, что значение 1.34032174 нужно масштабировать обратно, но я не могу понять, как это сделать. Буду признателен за любые советы. Спасибо!

2 ответ(ов)

0

Вы можете использовать метод inverse_transform вашего объекта scalery следующим образом:

y_new_inverse = scalery.inverse_transform(y_new)

Этот код преобразует ваши данные обратно в исходный масштаб, используя настройки, сохраненные в объекте scalery.

0

В ответ на ваш вопрос:

Вы немного запаздываете с этим вопросом, но не стоит масштабировать ось y. При масштабировании y вы на самом деле теряете свои единицы измерения. Регрессия или оптимизация потерь определяется относительными различиями между признаками. Кстати, для цен на дома (или любых других денежных значений) обычно используют логарифм. Тогда вам, естественно, нужно будет применять numpy.exp(), чтобы вернуться к реальным значениям в долларах/евро/йенах...

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь