применимость метода ближайщих соседей.( Классификатор kNN)
Есть таск:
Дана таблица из 10M строк, и длительность каждого из фильмов
1)необходимо разделить фильмы на длинные\короткие или более групп.
2)Найти скользящее среднее для каждого из этих сегментов
3)Найти какой-либо другой показатель / или выполнить какой-либо другой тип быстрого анализа, чтобы связать время просмотра с рейтингами. Обоснуйте ответ.
Первый пункт хотела бы сделать методом ближайщих соседей. Но не уверена в точности((( Какой метод подсказали бы Вы?
movies['launch date'] = pd.to_datetime(movies['launch date'])
df = movies[['launch date', 'watch_time']]
df = df.sort_values(by='launch date')
df.head()
for i in range(0,df.shape[0]-2):
df.loc[df.index[i+2],'SMA_3'] = np.round(((df.iloc[i,1]+ df.iloc[i+1,1] +df.iloc[i+2,1])/3),1)
df['pandas_SMA_4'] = df.iloc[:,1].rolling(window=4).mean()
plt.figure(figsize=[15,10])
plt.grid(True)
plt.plot(df['watch_time'],label='data')
plt.plot(df['SMA_3'],label='SMA 3 Months')
plt.plot(df['pandas_SMA_4'],label='SMA 4 Months')
plt.legend(loc=2)
Ответы (2 шт):
Ну, смотрите. В самом первом приближении напрашивается разбиение на 3 группы:
- Меньше часа
- От часа до двух
- Больше часа
Разбивать на корзины можно с помощью функции Pandas cut. Код для иллюстрации:
import pandas as pd
import numpy as np
import matplotlib.pylab as plt
import seaborn as sns
%matplotlib inline
# https://datasets.imdbws.com/
titles_basic = pd.read_csv("title.basics.tsv.gz", sep='\t', na_values=r'\N')
movies = titles_basic[(titles_basic.titleType == 'movie') & (~titles_basic.runtimeMinutes.isna())].copy()
movies.runtimeMinutes = movies.runtimeMinutes.values.astype(np.float)
plt.figure(figsize=(10,5));
sns.distplot(movies.runtimeMinutes[movies.runtimeMinutes < 180], bins=3);
plt.figure(figsize=(8,5));
movies['timetype'] = pd.cut(movies.runtimeMinutes, [-np.Inf,60,120,np.Inf], labels=['короткий', 'стандартный','длинный'])
sns.countplot(movies.timetype);
Гистограмма длительностей фильмов, разбитая на 3 корзины. Явно видны провалы графика примерно на 60 и 120 минут, поэтому я потом и сделал разбиение по этим значениям. В принципе, можно выделить в отдельную категорию также значения <45, ориентируясь опять же на график. При этом если попробовать ставить в данной гистограмме другое количество корзин, ничего путного не нарисуется в результате. Кроме того, заметьте, что я убрал из данных фильмы длительностью >180, если их оставить, там получается длинный хвост на гистограмме, не несущий никакой информации, полагаю, что можно считать это выбросами.
Сколько фильмов попало в соответствующие категории после разбиения на корзины:
Алгоритм KNN в том случае, когда можно провести простое разбиение по неким линиям, в общем-то не нужен. Хотя вы могли бы попробовать какую-нибудь кластеризацию ради интереса.
Насчёт скользящих средних я как-то тут не понял, обычно они применяются при анализе Time Series. Вычисляются они с помощью конструкции rolling(<размер окна>).mean().
Итак, читаем внимательно то, что вы написали.
Начнем с двух групп. Есть фильмы первой группы, каждый со своим рейтингом. И есть фильмы второй группы, каждый со своим рейтингом.
Вопрос - отличаются ли статистически значимо рейтинги в группах. Поскольку у нас Рейтинги измерены в ранговой шкале, применяем непараметрический критерий. Ну например, можно начать с критерия Манна-Уитни. В итоге получаем ответ на поставленный вопрос. ("Начать" - потому как есть и другие методы этой группы, которые могут оказаться более адекватными для ваших данных"). Если вы решите разбивать на большее количество групп, то нужно применять критерий Краскела-Уоллиса.
Если выявиться, что "да можно предположить статистически значимую зависимость рейтинга от времени просмотра", то можно пойти дальше - строить регрессионную модель зависимости рейтинга от времени.
Если быть более корректным, то можно вместо регрессионной модели строить модель классификации "время-рейтинг". И вот тут вот появляется место для вашего критерия kNN (ближайших соседей).
Повторю, все это корректно, если указанные критерии покажут наличие зависимости. Кстати, я не упомянул о таком этапе, как выявление корреляции между вашими переменными - только конечно не Пирсона, а Спирмана и/или Кэнделла. В противном случае - "отрицательный результат - тоже результат".
В общем, на самом деле ваша задача не имеет однозначного решения. Поэтому нужно пробовать разные подходы, а потом сравнивать результаты и искать наиболее адекватные.


