У меня есть база данных из приложения Facebook, и я пытаюсь использовать машинное обучение для оценки возраста пользователей на основе того, какие сайты Facebook им нравятся.
Есть три важных характеристики моей базы данных:
распределение по возрасту в моем обучающем наборе (в сумме 12 тыс. пользователей) перекошено в сторону более молодых пользователей (т.е. у меня 1157 пользователей в возрасте 27 лет и 23 пользователя в возрасте 65 лет);
у многих сайтов не более 5 пользователей (я отфильтровал сайты FB с менее чем 5 пользователями).
есть намного больше возможностей, чем образцов.
Итак, мои вопросы: какую стратегию вы бы предложили для подготовки данных для дальнейшего анализа? Должен ли я выполнить какое-то уменьшение размерности? Какой метод ML будет наиболее подходящим для использования в этом случае?
Я в основном использую Python, так что советы, специфичные для Python, будут высоко оценены.
источник
Ответы:
Одна вещь, с которой нужно начать, была бы k-NN. Идея заключается в том, что у вас есть матрица пользователей / предметов, а для некоторых пользователей вы сообщаете возраст. Возраст человека в матрице элементов пользователя может быть хорошо определен чем-то вроде среднего или среднего возраста некоторых ближайших соседей в пространстве элементов.
Таким образом, каждый пользователь выражается в виде вектора в пространстве элементов, находите k ближайших соседей и присваивает рассматриваемому вектору некоторую сводную статистику по возрастам ближайших соседей. Вы можете выбрать k на отрезке расстояния или более реалистично, итеративно назначая возрасты для удержания поезда и выбирая k, который минимизирует ошибку в этом назначении.
Если размерность является проблемой, вы можете легко выполнить сокращение в этой настройке путем разложения по одному значению, выбрав m векторов, которые улавливают наибольшую дисперсию в группе.
Во всех случаях, поскольку каждая особенность является двоичной, кажется, что косинусное сходство будет вашим показателем расстояния.
Мне нужно немного больше подумать о других подходах (регрессия, ВЧ и т. Д.), Учитывая узкую направленность вашего пространства функций (все варианты одного и того же действия, нравится). Я думаю, что подход пользователь / элемент может быть лучшим.
Одно замечание: если вы сами указали возраст, в котором вы тренируетесь, вам, возможно, придется исправить некоторые из них. Люди на Facebook, как правило, сообщают о возрасте за десятилетие, в котором они родились. Составьте гистограмму дат рождения (по возрастам) и посмотрите, есть ли у вас всплески в десятилетия, как 70-е, 80-е, 90-е
источник
sklearn.neighbors.KNeighborsRegressor
косинусную метрику в пространстве с уменьшенным SVD (после применения SVD средняя ошибка оценки снизилась с ~ 6 лет до ~ 4). Пользователи в моей базе данных имеют возраст 18-65 лет (пожилые пользователи были отфильтрованы), поэтому существует 48 возможных классов. Интересно, не слишком ли много классов для kNN, и следует ли мне рассматривать это как регрессию или проблему классификации (я думаю, что применимы оба).Недавно я сделал похожий проект в Python (предсказание мнений с использованием данных, подобных FB), и получил хорошие результаты в следующем базовом процессе:
В вашем случае вам нужно поменять местами классификатор для регрессора (так что смотрите здесь: http://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestRegressor.html ), но в остальном тот же процесс должно работать без особых проблем.
Кроме того, вы должны знать о самой удивительной особенности случайных лесов в Python: мгновенное распараллеливание! Те из нас, кто начал делать это в R, а затем перешел, всегда удивляются, особенно когда вы работаете на машине с несколькими десятками ядер (см. Здесь: http://blog.yhathq.com/posts/comparing- random-forest-in-python-and-r.html ).
Наконец, обратите внимание, что это было бы идеальным приложением для анализа сети, если у вас есть данные о друзьях, а также о самих людях. Если вы можете проанализировать возраст друзей пользователя, возраст пользователя почти наверняка будет в пределах года или двух от медианы среди его или ее друзей, особенно если пользователи достаточно молоды, чтобы построить свои сети друзей, пока они находятся в школа (так как большинство будет одноклассниками). Этот прогноз, вероятно, превзойдет все, что вы получите от моделирования - это пример из учебника, где правильные данные> правильная модель каждый раз.
Удачи!
источник
Еще одно предложение - проверить логистическую регрессию . В качестве дополнительного бонуса, веса (коэффициенты) модели дадут вам представление о том, какие сайты являются возрастными.
Sklearn предлагает пакет sklearn.linear_model.LogisticRegression , который также предназначен для обработки разреженных данных.
Как упоминалось в комментариях, в данном случае с большим количеством входных переменных, чем сэмплов, вам необходимо упорядочить модель (с помощью аргумента sklearn.linear_model.LogisticRegression
penalty='l1'
).источник
Некоторые исследования D. Nguyen et al. попытаться предсказать возраст пользователя Твиттера на основе их твитов. Может быть, вы найдете их полезными. Они используют логистическую и линейную регрессию.
источник
Помимо более изощренных методов, вы можете попробовать формулу Байеса
P (I | p1 ... pn) = P (p1 ... pn | I) P (I) / sum_i (P (p1 ... pn | i) P (i))
P (I | p1 ... pn) - вероятность того, что пользователь относится к возрастной группе I, если ему понравились p1, .., pn
P (i) - вероятность того, что пользователь относится к возрастной группе i
P (p1 .. pn | i) - вероятность того, что пользователю понравились p1, .., pn, если он принадлежит к возрастной группе i.
Чтобы оценить P (p1 ... pn | i), для каждой возрастной группы я оцениваю вероятность (частоту) p_ij как страницу j. Чтобы p_ij было ненулевым для всех j, вы можете смешать частоту для всего населения с небольшим весом.
Тогда log P (p1 ... pn | i) = sum (log p_ij, i = p1, .., pn), сумма по всем страницам, которые нравятся новому пользователю. Эта формула была бы приблизительно верной, предполагая, что пользователь любит страницы в своей возрастной группе независимо.
Если вы или кто-то еще пытался это сделать, пожалуйста, прокомментируйте результат.
источник
Это очень интересная проблема.
Я столкнулся с подобным, проанализировав фотографии, загружаемые пользователями в социальную сеть. Я сделал следующий подход:
Этот подход - обучение под наблюдением, и я рекомендую его, если у вас есть только некоторые данные, помеченные.
Пожалуйста, обратите внимание, что в социальной сети люди обычно лгут о возрасте (просто для удовольствия или иногда потому, что они хотят замаскировать себя в социальной сети).
источник