Как мне определить y_true в оценке полиномиальной регрессии, используя rsquare и mse в python - PullRequest
0 голосов
/ 14 марта 2020
from sklearn.preprocessing import PolynomialFeatures
train_x_p = np.asanyarray(train[['FUELCONSUMPTION_COMB_MPG']])
poly = PolynomialFeatures(degree = 3)
train_x_poly = poly.fit_transform(train_x_p)
regr.fit(train_x_poly, train_y)
print('Coefficients: ', regr.coef_)
print('Intercept', regr.intercept_)

test_x_poly = poly.fit_transform(test_x)
test_y_poly1 = np.asanyarray(test[['CO2EMISSIONS']]) #im not sure especially about this line 
test_y_hat_poly1 = regr.predict(test_x_poly)

mse = metrics.mean_squared_error(test_y_poly1, test_y_hat_poly1)
r2 = (r2_score(test_y_poly1,test_y_hat_poly1))
print('MSE&R2SQUARE polynomial linear regression (FUELCONSUMPTION_COMB_MPG): ')
print('MSE: ',mse)
print('r2-sq: ',r2)

, а также что заставило меня почувствовать, что это неверно, результаты mse я должен преобразовать тест y в поли, и если я должен, как я могу это сделать?

1 Ответ

1 голос
/ 14 марта 2020

Нет, вы не должны преобразовывать ваши y_true значения. Что делает полиномиальный признак, так это то, что он принимает x_1, x_2, ..., x_p предикторов и применяет полиномиальное преобразование выбранной степени к каждому из них.

Если у вас есть 2 предиктора x_1 and x_2 и вы применяете полиномиальное преобразование 3-й степени, вы сталкиваетесь с проблемой формы:

y = b_0 + b_1 * x_1 + b_2 * x_1^2 + b_3 * x_1^3 + b_4 * x_2 + b_5 * x_2^2 + b_6 * x_2^3

Вы хотите сделать это когда существует нелинейная связь между предикторами и ответом, и вы хотите использовать линейную модель для подгонки данных. y_true остается неизменным, используете ли вы полиномиальные признаки или нет (или большинство других регрессионных моделей).

Ваш код почти в порядке, за исключением одной проблемы - вы звоните fit_transform с тестовыми данными, что вы никогда не захотите делать. Вы уже поместили объект полиномиальных признаков на тренировочные данные, все, что вам нужно сделать, это вызвать метод transform для преобразования ваших тестовых данных.

test_x_poly = poly.transform(test_x)

Вот пример того, как это выглядит, когда вы используете полиномиальные особенности, когда между предиктором и ответом есть полиномиальная связь.

  1. получить данные (I будет просто генерировать некоторые)
X = np.random.randint(-100, 100, (100, 1))
y = X ** 2 + np.random.normal(size=(100, 1))
поезд / тестовый сплит
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
соответствует полиномиальным характеристикам данных поезда
poly_features = PolynomialFeatures(degree=2)
X_train_poly = poly_features.fit_transform(X_train) # transform the data as well
соответствует модели линейной регрессии на данных поезда
reg = LinearRegression()
reg.fit(X_train_poly, y_train)
(только для иллюстрации - визуализировать линию регрессии - применимо только при наличии только одного предиктора)
reg_line_x = poly_features.transform(np.linspace(-100, 100, 1000).reshape((-1, 1)))
reg_line_y = reg.predict(reg_line_x)
plt.scatter(X_train_poly[:, 1].ravel(), y_train)
plt.plot(reg_line_x[:, 1].ravel(), reg_line_y, c="red", label="regression line")
plt.legend()
plt.show()

enter image description here

преобразовать данные X_test и сделать прогноз
# do NOT call fit_transform here
X_test_poly = poly_features.transform(X_test)
y_pred = reg.predict(X_test_poly)

Существует также более удобный способ сделать это, построив конвейер, который обрабатывает все (то есть полиномиальное преобразование и регрессия в вашем случае), чтобы вам не приходилось вручную выполнять каждый отдельный шаг.

from sklearn.pipeline import Pipeline

pipe = Pipeline([
        ("poly_features", poly_features),
        ("regression", reg)
])

y_pred = pipe.predict(X_test)

print(f"r2 : {r2_score(y_test, y_pred)}")
print(f"mse: {mean_squared_error(y_test, y_pred)}")

r2: 0.9999997923643911

mse: 1.4848830127345198


Обратите внимание, что тот факт, что r в квадрате или MSE показывает плохие значения в вашем случае, не означает, что ваш код неверен. Может случиться так, что ваши данные не подходят для этой задачи, или вам нужно использовать различную степень полиномиального преобразования - вы можете либо подгонять, либо подгонять тренировочные данные и т. Д. c.

...