применимость метода ближайщих соседей.( Классификатор 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)

average


Ответы (2 шт):

Автор решения: CrazyElf

Ну, смотрите. В самом первом приближении напрашивается разбиение на 3 группы:

  1. Меньше часа
  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().

→ Ссылка
Автор решения: passant

Итак, читаем внимательно то, что вы написали.

Начнем с двух групп. Есть фильмы первой группы, каждый со своим рейтингом. И есть фильмы второй группы, каждый со своим рейтингом.

Вопрос - отличаются ли статистически значимо рейтинги в группах. Поскольку у нас Рейтинги измерены в ранговой шкале, применяем непараметрический критерий. Ну например, можно начать с критерия Манна-Уитни. В итоге получаем ответ на поставленный вопрос. ("Начать" - потому как есть и другие методы этой группы, которые могут оказаться более адекватными для ваших данных"). Если вы решите разбивать на большее количество групп, то нужно применять критерий Краскела-Уоллиса.

Если выявиться, что "да можно предположить статистически значимую зависимость рейтинга от времени просмотра", то можно пойти дальше - строить регрессионную модель зависимости рейтинга от времени.

Если быть более корректным, то можно вместо регрессионной модели строить модель классификации "время-рейтинг". И вот тут вот появляется место для вашего критерия kNN (ближайших соседей).

Повторю, все это корректно, если указанные критерии покажут наличие зависимости. Кстати, я не упомянул о таком этапе, как выявление корреляции между вашими переменными - только конечно не Пирсона, а Спирмана и/или Кэнделла. В противном случае - "отрицательный результат - тоже результат".

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

→ Ссылка