R: классификация k-ближайших соседей

Я пытаюсь разделить некоторые электронные письма на объявления ("call for"), а также обсуждения ("discussions") на две группы, используя классификацию k-ближайших соседей. Я полагаю, это можно сделать с помощью

knn(train, test, cl, k = 1, l = 0, prob = FALSE, use.all = TRUE)

У меня уже есть матрица терминов документа mails. Я понятия не имею, как я мог построить матрицы train, test и фактор cl, используя эту матрицу терминов документа. Я не могу найти хороших примеров и не понимаю пример на http://stat.ethz.ch/R-manual/R-devel/library/class/html/knn.html. Есть ли кто-нибудь, кто может указать мне правильное направление?

UPD

Вся TermDocumentMatrix находится по адресу dl.dropboxusercontent.com/u/20641416/data.


person user720491    schedule 18.12.2013    source источник


Ответы (1)


Ну, я не могу решить вашу проблему, так как у меня нет образцов данных. Тем не менее, я могу пояснить пример в документации для вас, чтобы вы могли начать с представления о том, что происходит.

  • train – это "контрольные" данные, для которых уже известна классификация. Он будет использоваться для формирования структуры knn, что позволит вам делать прогнозы на будущее.

  • cl — правильные ответы для обучающего набора данных.

Здесь встроенный набор данных iris используется для имитации «известных данных». Набор данных поезда берется таким образом, чтобы было равное количество каждого вида (s - Setosa, c - Versicolor, v - Virginica).

train <- rbind(iris3[1:25,,1], iris3[1:25,,2], iris3[1:25,,3]) 
cl <- factor(c(rep("s",25), rep("c",25), rep("v",25)))
  • тест — это набор данных, который вы пытаетесь классифицировать. Учитывая существующую (обученную) структуру knn, тестовые наблюдения анализируются построчно и генерируется прогноз.

Тот же набор данных используется для построения тестовых данных. Конечно, мы знаем здесь истинную классификацию, но делаем вид, что не знаем. Истинная классификация такая же, как и раньше; он не может быть использован knn: для knn эта информация недоступна. Мы храним эти данные, чтобы оценить наши прогнозы.

test <- rbind(iris3[26:50,,1], iris3[26:50,,2], iris3[26:50,,3])
cl.test <- cl

Наконец, мы готовы продолжить. Вот вектор прогнозов для тестового набора данных. Если prob=TRUE, мы дополнительно видим, насколько «уверен» алгоритм в каждом случае:

pr.test <- knn(train, test, cl, k = 3, prob=TRUE)
 [1] s s s s s s s s s s s s s s s s s s s s s s s s s c c v c c c c c v c c c c c c c c c c
[45] c c c c c c v c c v v v v v c v v v v c v v v v v v v v v v v
attr(,"prob")
 [1] 1.0000000 1.0000000 1.0000000 1.0000000 1.0000000 1.0000000 1.0000000 1.0000000
 [9] 1.0000000 1.0000000 1.0000000 1.0000000 1.0000000 1.0000000 1.0000000 1.0000000
[17] 1.0000000 1.0000000 1.0000000 1.0000000 1.0000000 1.0000000 1.0000000 1.0000000
[25] 1.0000000 1.0000000 1.0000000 0.6666667 1.0000000 1.0000000 1.0000000 1.0000000
[33] 1.0000000 0.6666667 1.0000000 1.0000000 1.0000000 1.0000000 1.0000000 1.0000000
[41] 1.0000000 1.0000000 1.0000000 1.0000000 1.0000000 1.0000000 1.0000000 1.0000000
[49] 1.0000000 1.0000000 1.0000000 0.6666667 0.7500000 1.0000000 1.0000000 1.0000000
[57] 1.0000000 1.0000000 0.5000000 1.0000000 1.0000000 1.0000000 1.0000000 0.6666667
[65] 1.0000000 1.0000000 1.0000000 1.0000000 1.0000000 1.0000000 1.0000000 0.6666667
[73] 1.0000000 1.0000000 0.6666667
Levels: c s v

Теперь мы можем оценить, насколько верна наша модель.

sum(pr.test==cl.test)/length(cl.test)

Что составляет 70 из 75, или 93% правильно.

Обратитесь к статистической литературе за более подробной информацией о том, как работает knn. Для вашей проблемы рассмотрите метод перекрестной проверки для настройки модели.

person tonytonov    schedule 18.12.2013
comment
Я это поняла! Спасибо за это. В моем случае iris3 — это TermDocumentMatrix, и я действительно не понимаю, как я мог бы построить обучающий и тестовый набор, используя эту матрицу. Мне удалось построить cl с помощью регулярных выражений. - person user720491; 18.12.2013
comment
Поделитесь небольшим подмножеством ваших данных с помощью dput(), чтобы дать представление о том, как выглядят ваши данные. - person tonytonov; 18.12.2013
comment
Часть TermDocumentMatrix, с которой я хотел бы работать, находится по адресу pastebin.com/VpAt35bS. - person user720491; 18.12.2013
comment
Это не читается: nrow = 13880L, ncol = 537L означает, что вы используете dput() для всего объекта, который огромен. Подмножество должно быть применено до dputting. Используйте df ‹- ‹ваша вставка здесь›, чтобы проверить, можно ли загрузить обратно в R. - person tonytonov; 18.12.2013
comment
Он действительно огромен. Вся TermDocumentMatrix находится по адресу dl.dropboxusercontent.com/u/20641416/data. - person user720491; 18.12.2013
comment
@tonytonov Просто хотел добавить, что attr нуждается в аргументе (для вызова классификации knn, который мы сделали) после установки prob = TRUE .attr (pr.test, prob) является правильным использованием. - person ekta; 16.01.2014
comment
attr(,prob) здесь не вызов функции, а просто вывод print. Я отредактировал, чтобы было понятно, спасибо. - person tonytonov; 16.01.2014