KNeighbors Regressor .predict () функция, которая дает подозрительно совершенные результаты при тренировке с весами = «расстояние»? - PullRequest
0 голосов
/ 08 ноября 2018

Если я обучаю KNeighborsRegressor (через scikit-learn), а затем хочу сравнить его прогнозы с целевой переменной, я могу сделать это следующим образом:

#Initiate model
knn = neighbors.KNeighborsRegressor(n_neighbors=8)

#Define independent and target variables
X = df[['var1', 'var2', 'var3']]
Y = df['target']

#fit the model and store the predictions
knn.fit(X, Y)
predicted = knn.predict(X).ravel()

Если бы я сравнил их, я увидел бы, что эта модель далека от совершенства, что и ожидается:

compare = pd.DataFrame(predicted,Y).reset_index()
compare.columns=['Y', 'predicted']
compare.head(3)

Возвращает:

+------+-----------+
| Y    | predicted |
+------+-----------+
| 985  | 2596      |
+------+-----------+
| 801  | 2464      |
+------+-----------+
| 1349 | 1907      |
+------+-----------+

Если я делаю ту же самую вещь, за исключением того, что я взвешиваю соседей по расстоянию, функция прогнозирования () возвращает целевую переменную ТОЧНО.

#Initiate model
knn_dist = neighbors.KNeighborsRegressor(n_neighbors=8, weights='distance')

#fit the model and store the predictions
knn_dist.fit(X, Y)
predicted2 = knn_dist.predict(X).ravel()

compare = pd.DataFrame(predicted2,Y).reset_index()
compare.columns=['Y', 'predicted2']
compare.head(3)

Возвращает идентичные столбцы:

+------+------------+
| Y    | predicted2 |
+------+------------+
| 985  | 985        |
+------+------------+
| 801  | 801        |
+------+------------+
| 1349 | 1349       |
+------+------------+

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

score_knn = cross_val_score(knn, X, Y, cv=ShuffleSplit(test_size=0.1))
print(score_knn.mean())
>>>>0.5306705590672681

Что я делаю не так?


Для каждого запроса вот первые пять строк соответствующих столбцов в моем фрейме данных:

| ID | var1     | var2     | var3     | target |
|----|----------|----------|----------|--------|
| 1  | 0.363625 | 0.805833 | 0.160446 | 985    |
| 2  | 0.353739 | 0.696087 | 0.248539 | 801    |
| 3  | 0.189405 | 0.437273 | 0.248309 | 1349   |
| 4  | 0.212122 | 0.590435 | 0.160296 | 1562   |
| 5  | 0.22927  | 0.436957 | 0.1869   | 1600   |

1 Ответ

0 голосов
/ 08 ноября 2018

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

knn_dist.fit (X, Y)

предсказано2 = knn_dist.predict (X) .ravel ()

Идеальное исполнение - это случай переоснащения из учебника. Для каждой точки в X вес для этой точки будет по существу 1


Далее, когда вы используете cross validation, вы видите, что модель не так совершенна. Вы всегда должны использовать перекрестную проверку, особенно в случае, когда вы пытаетесь предсказать (регрессировать) целевую переменную.

Кроме того, для задач регрессии НЕ используйте cross_val_score без указания аргумента scoring.

Вы также можете использовать cross_val_predict. Смотрите здесь

Если вы добавите некоторую информацию (например, размеры X), я мог бы помочь больше.

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