scikit-learn: Как вернуть предсказанное значение 'y' к исходному масштабу
Я пытаюсь изучить библиотеку 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 ответ(ов)
Вы можете использовать метод inverse_transform
вашего объекта scalery
следующим образом:
y_new_inverse = scalery.inverse_transform(y_new)
Этот код преобразует ваши данные обратно в исходный масштаб, используя настройки, сохраненные в объекте scalery
.
В ответ на ваш вопрос:
Вы немного запаздываете с этим вопросом, но не стоит масштабировать ось y. При масштабировании y вы на самом деле теряете свои единицы измерения. Регрессия или оптимизация потерь определяется относительными различиями между признаками. Кстати, для цен на дома (или любых других денежных значений) обычно используют логарифм. Тогда вам, естественно, нужно будет применять numpy.exp()
, чтобы вернуться к реальным значениям в долларах/евро/йенах...
Scikit-learn: K-Means – Метод "Локтя" для определения числа кластеров
Ошибка времени выполнения: ожидался скалярный тип Long, но найден Float
Как изменить порядок столбцов в DataFrame?
'pip' не распознан как командa внутреннего или внешнего формата
Почему statistics.mean() работает так медленно?