Диагностика остаточного графика c и как улучшить регрессионную модель - PullRequest
3 голосов
/ 19 июня 2020

При создании регрессионных моделей для этого набора данных жилья , мы можем построить график остатков в зависимости от реальных значений.

from sklearn.linear_model import LinearRegression

X = housing[['lotsize']]
y = housing[['price']]

model = LinearRegression()
model.fit(X, y)

plt.scatter(y,model.predict(X)-y)

enter image description here

Мы можем ясно видеть, что разница (прогноз - реальная стоимость) в основном положительна для более низких цен, а разница отрицательная для более высоких цен.

Это верно для линейной регрессии, потому что модель оптимизирована для RMSE (поэтому знак невязки не учитывается).

Но при выполнении KNN

from sklearn.neighbors import KNeighborsRegressor
model = KNeighborsRegressor(n_neighbors = 3)

Мы можем найти похожий график.

enter image description here

В этом случае, какую интерпретацию мы можем дать и как мы можем улучшить модель.

EDIT : мы можем использовать все с другими предикторами результаты аналогичны.

housing = housing.replace(to_replace='yes', value=1, regex=True)
housing = housing.replace(to_replace='no', value=0, regex=True)
X = housing[['lotsize','bedrooms','stories','bathrms','bathrms','driveway','recroom',
        'fullbase','gashw','airco','garagepl','prefarea']]

Следующий график для KNN с 3 соседями. С 3 соседями можно было бы ожидать переобучения, я не могу понять, почему существует эта тенденция.

enter image description here

1 Ответ

1 голос
/ 19 июня 2020

Если вы посмотрите на соответствие:

plt.scatter(X,y)
plt.plot(X,model.predict(X), '--k')

enter image description here

Вы получите отрицательные значения для более высоких значений y, потому что существует кластер данных около x = 8000 с высокими значениями y, которые сильно отличаются от ожидаемых.

Теперь, если вы выполняете Knn, имейте в виду, что ваша независимая переменная только одномерная, то есть вы определяете соседей на основе размера вашего участка и используете среднее значение групп в качестве прогнозного значения. Для этих высоких значений выбросов около x = 8000 они будут сгруппированы вместе со значениями ниже, чем они, что сделает разницу отрицательной

Если вы построите это:

plt.scatter(X,y)
plt.scatter(X,model.predict(X))

enter image description here

Как улучшить модель? Имея только один предсказатель, вы мало что можете сделать, возможно, классифицируйте lotsize, но я сомневаюсь, что это сильно изменится. Скорее всего, вам понадобятся другие переменные, чтобы увидеть, что вызывает этот скачок в районе lotize = 8000, тогда вы сможете лучше смоделировать зависимую переменную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...