K-ближайший сосед модель: застрял на функции - PullRequest
0 голосов
/ 13 октября 2019

Я запускаю модель KNN на фрейме данных, пытаясь предсказать определенную функцию. Я пытаюсь выяснить, могу ли я, в зависимости от того, какую строку повторять, посмотреть, могут ли конкретные найденные «соседи» иметь определенное логическое значение, которое я определяю.

Например, допустим, я хотелитерировать по кадрам данных авторов, и я хотел предсказать ценность их книг, основываясь на количестве страниц и глав в книге. Однако в моем примере я хочу только сравнить авторов одного и того же возраста и предложить прогноз, основанный на авторах того же возраста. Я предполагаю, что где-то в коде мне нужно поместить логическое значение, я просто не уверен, где?

import pandas as pd
from sklearn.neighbors import KNeighborsRegressor
from sklearn.metrics import mean_squared_error

features = ['chapters','pages']
knn = KNeighborsRegressor(n_neighbors=16, algorithm='brute')
knn.fit(train[features], train['value'])
predictions = knn.predict(test[features])

Вот «тест» для фрейма данных:

author   age   pages   chapters    value

green     34     324     10          9
white     21     432     24          6
smith     59     567     43          3
berg      34     229     8           11
carter    34     213     10          9
bing      21     501     34          15
moon      59     132     7           7

Итак, я хотел бы найти все КНН для автора, зеленые, но только те, кто того же возраста,34, как он есть. И когда он доходит до белого автора, найдите только KNN с тем же самым возрастом 21. Другими словами, мне нужно иметь возраст от KNN == возраст автора, которого он предсказывает.

1 Ответ

0 голосов
/ 13 октября 2019

Видимо, я не смог найти нужную вам функцию в документации по модели Sklearn. Вы можете использовать что-то как:

df.loc[df['age'] == 34]

или

df_agerange1 = df.loc[df['age'].between(25, 34)]

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

for i, d in test.iterrows():
    age = d['age']
    models[age].predict(d[features])

Я знаю, что это и вычислительно дорого, и не так уж чисто, но это может сработать.

Другим подходом для вас может быть реализация вашего собственноговерсию KNN с нуля и добавить это возрастное ограничение в функцию прогнозирования.

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

...