Przejdź do treści

Przewidywanie oceny filmu – wybór modelu

Jak będzie oceniony film, który dopiero powstaje? Czyli o wybieraniu i poprawianiu modeli predykcyjnych.

W poprzednim wpisie pokazałem dane zgromadzone z Filmwebu w różnych przekrojach, a na koniec zaproponowałem model, który na podstawie informacji o ocenach filmów twórców (reżyseria, scenariusz, autorzy muzyki oraz zdjęć) i aktorów próbuje przewidzieć ocenę nowego filmu (wyprodukowanego w tym samym składzie). Nurtował mnie ten pomysł, postanowiłem go więc nieco lepiej przeanalizować. A przy okazji – nauczyć się budować modele predykcyjne (chociaż o nich trochę już wiem – był wpis o klasyfikacji).

Jeśli nie znasz poprzedniego wpisu – zachęcam do lektury! klik, klik

Na początek przygotujemy środowisko, wczytamy zgromadzone dane i ustalimy jaka jest minimalna liczba głosów na film, żeby w ogóle się nim zajmować.

Model zakłada, że na ocenę filmu mają dotychczasowe dokonania jego twórców. Zrobimy zatem tak:

  • dla losowego filmu sprawdzimy kto jest jego twórcą (mamy 5 ról: reżysera, autorów scenariusza, zdjęć i muzyki oraz aktorów)
  • dla każdej z tych osób policzymy średnią ze wszystkich filmów, w których produkcji dana osoba brała udział w tej samej roli. To ma znaczenie i działa tak, że jeśli rozpatrujemy Woody’ego Allena jako reżysera liczymy średnią z filmów przez niego wyreżyserowanych, a jeśli patrzymy na niego jako aktora – liczymy średnią z filmów w których występował. Dla Allena możemy mieć trzy cztery różne średnie (i każda może być inna!): jako reżyser (7.081), scenarzysta (7.057), aktor (7.059) i twórca muzyki (7.129 – Allen najlepszy jako kompozytor, LOL)
  • mając wszystkie średnie dla osób w danej roli – liczymy zbiorczą średnią (średnią ze średnich). Tym sposobem mamy średnią reżyserii, średnią scenariusza, średnią zdjęć, muzyki i aktorów. Te pięć wartości to będą nasze zmienne niezależne (czyli parametry wejściowe)

Zmienną zależną (czyli przewidywaną przez model) będzie ocena filmu. Pod uwagę weźmiemy modele, które trzeba “wytrenować” – potrzebujemy dlatego znać prawdziwą ocenę filmu.

Na potrzeby przygotowania danych, na których będziemy budować modele przygotujemy dwie funkcje:

Co robią funkcje napisane jest w komentarzach zawartych w ich kodzie. Dla laików nie ma to znaczenia ;)

Próbka danych

Żeby było co trenować potrzebujemy danych. Im więcej tym lepiej. Ale rozsądnie. Na początek spróbujmy z pięcioma tysiącami losowo wybranych filmów. Losujemy sobie więc numery filmów, a później dla każdego z numerów szukamy średnich z dokonań twórców. To długi proces – można iść na obiad, do kina, wyjechać na weekend… U mnie zajęło to jakieś 12 godzin.

Mając wylosowane filmy podzielimy je sobie na część treningową danych oraz na część testową, na której będziemy weryfikować nasze kolejne modele:

Modele

Przygotujemy trzy modele regresyjne, rożnych kategorii. Wybierzemy najlepszy i będziemy ten najlepszy modyfikować.

Na początek najprostszy model – regresja liniowa

Powyższe informacje to podsumowanie tego co policzyła nam maszyna. Są to kolejne współczynniki (ich wartości to kolumna Estimate) z równania:

    \[ ocena = a_0 + a_1 \cdot dirRate + a_2 \cdot scrRate + a_3 \cdot musRate + a_4 \cdot photoRate + a_5 \cdot actRate \]

W kolumnie Pr(>|t|) jest wartość p-value, która określa istotność danej zmiennej w modelu. Wszystkie tutaj są na poziomie wręcz idealnym (zwykle przyjmuje się p-value = 0.05 jako bardzo dobrą wartość), nie byłoby czego zmieniać – od pierwszego strzału mamy super model! Czy aby na pewno? Przekonamy się za chwilę.

Zobaczmy jak przewidziane oceny filmów mają się do wartości rzeczywistych:

Idealnie byłoby, gdyby wszystkie punkty ułożyły się na niebieskiej prostej. A jak widać tak nie jest. Ale jest całkiem dobrze.

Z opisu metod klasyfikacji pamiętamy, że dobrym modelem jest random forest. Przekonajmy się czy tak jest też dla zagadnień regresji:

Wygląda podobnie, chociaż widać różnice dla niskich ocen: punkty są bardziej odległe od niebieskiej prostej dla regresji liniowej.

To na koniec sprawdźmy model klasy SVM:

Na pierwszy rzut oka niewiele różni się od random forest. Jak więc porównać modele ze sobą?

Porównanie modeli

Na początek zobaczmy jak wygląda rozkład przewidzianych ocen w zależności od modelu w zestawieniu z prawdziwymi ocenami (gruba czarna linia):

Już lepiej widać różnice – zarówno pomiędzy modelami jak i prawdziwymi wartościami. Cóż – idealnie nie jest… Ale też nie musi być idealnie. Ważne, żeby było wystarczająco dobrze :) A tutaj jest bardzo dobrze!

Różnice da się ocenić kilkoma współczynnikami liczbowymi. Zajmiemy się trzema najprostszymi: R2, jego nieco zmodyfikowaną wersją adj R2 oraz błędem średniokwadratowym.

Zaczniemy od R-squared, który po polsku nazywa się współczynnikiem determinacji i w postaci liczby pomiędzy zerem a jedynką określa jak bardzo dobrze dopasowany jest model. Im bliżej jedynki tym lepiej.

W polskiej Wikipedii są nieco inne definicje współczynnika niż w wersji angielskiej, idea jest ta sama (i zapewne po przekształceniach wychodzi na to samo) – skorzystamy z wersji angielskiej (taką widziałem też w jednym z kursów na Udemy):

    \[R^2 = 1 - \frac{SS_{res}}{SS_{tot}}\]

Jak widać potrzebujemy dwóch wartości – SS_{res} oraz SS_{tot}:

SS_{tot} to miara odchylenia wartości rzeczywistych x_i od średniej \bar{x} tych wartości:

    \[SS_{tot} = \sum_{i}^{n}{({x_i}-{\bar{x}})^2}\]

zaś SS_{res} to miara różnicy pomiędzy wartościami wyliczonymi \hat{x}_i a wartościami prawdziwymi x_i:

    \[SS_{res} = \sum_{i}^{n}{({x_i}-{\hat{x}_i})^2}\]

Zobaczmy otrzymane wartości R-kwadrat dla poszczególnych modeli:

Model Wartość R2
regresja liniowa 0.868098
random forest 0.8954855
SVM 0.8915317

Jak widać najbliżej jedynki jest random forest.

Miara Adjusted R-squared – to zmodyfikowany R2 (im bliżej jedynki tym lepiej – tak samo) w następujący sposób:

    \[adjR^2 = 1 - R^2\frac{n-1}{n-k-1}\]

gdzie:

  • n – liczność próby
  • k – liczba zmiennych niezależnych (k=5 w naszym przypadku)

Miara ta wprowadzona jest z powodu rosnącego R2 w przypadku dodawania nowych zmiennych niezależnych do modelu. Niekoniecznie dodanie nowych zmiennych poprawia model, ale zawsze przybliża R2 do jedynki. adjR2 jest swego rodzaju lekarstwem – uwzględnia liczbę zmiennych w modelu (k). Im więcej zmiennych tym większe k i tym samym większy mianownik, a to daje mniejsze wartości całego ułamka i jednocześnie oddala od jedynki. Ale z drugiej strony R2 rośnie… trwa zatem nieustanna walka. Policzmy adjR2 dla naszych modeli:

Model Wartość adj R2
regresja liniowa 0.8674345
random forest 0.8949598
SVM 0.8909861

Znowu wygrywa random forest.

Na koniec został błąd średniokwadratowy (mean squared error), czyli średnia miara różnicy pomiędzy wartościami prawdziwymi a przewidywanymi (to już mamy w SSres). Tutaj im mniej tym lepiej.

    \[MSE = \frac{SS_{res}}{n}\]

Sprawdźmy modele:

Model Wartość MSE
regresja liniowa 0.1307313
random forest 0.1035868
SVM 0.1075055

Niespodzianki nie ma.

Zajmijmy się zatem optymalizacją modelu opartego o metodę random forest.

Optymalizacja modelu

Wprost z modelu możemy uzyskać informacje o “ważności” poszczególnych zmiennych zależnych:

Według powyższych danych najmniej “ważną” w modelu zmienną niezależną jest photoRate. Spróbujmy zbudować model bez tej zmiennej i zobaczymy jakie mamy wartości R2, adj R2 i MSE.

Dlaczego tak? Bo jedna z metod ulepszania modelu to dodawanie lub odejmowanie zmiennych niezależnych. My zaczęliśmy od wszystkich, więc będziemy usuwać kolejne zmienne. Za każdym razem tą najmniej znaczącą (najmniejsza wartość p-value w regresji liniowej, a w naszym przypadku %IncMSE). I robimy to tak długo, dopóki miary modelu będą się poprawiać. Jak przestaną to znaczy że mamy najlepszy model (ten, który miał najlepsze miary oczywiście).

Współczynnik Wartość
R2 0.8948707
adj R2 0.8950654
MSE 0.1041962

Sprawdźmy czy jeszcze jakąś zmienną można usunąć z modelu?

Czas na dirRate – ponownie budujemy model i sprawdzamy otrzymane wyniki:

Współczynnik Wartość
R2 0.891335
adj R2 0.8951707
MSE 0.1077005

Może jeszcze coś można usunąć?

Usuwamy musRate:

Otrzymujemy nowe współczynniki, wstawmy je od razu do tabeli, w której porównamy wszystkie przygotowane wersje modelu random forest:

Współczynnik Model 1: Model 2: Model 3: Model 4:
Użyte zmienne: dirRate + scrRate + musRate + photoRate + actRate dirRate + scrRate + musRate + actRate scrRate + musRate + actRate scrRate + actRate
R2 0.8954855 0.8948707 0.891335 0.8818369
adj R2 0.8949598 0.8950654 0.8951707 0.8952759
MSE 0.1035868 0.1041962 0.1077005 0.1171143

Można by było przygotować jeszcze jeden model, tym razem z jedną zmienną. Ale jaki to ma sens?

Co widzimy w tabeli? Która wersja modelu jest najlepsza?

Dla R2 i adjR2 szukamy wartości najbliższych jedynki, zaś dla MSE najmniejszych. Różnice są niewielkie i trzeba wytężyć wzrok. Ułatwiłem Wam to wyróżniając stosowne wartości powyżej.

Zobaczmy jeszcze na wykresie (analogicznym do tego porównującego różne metody) zestawienie kolejnych wersji modelu opartego na random forest. Kolory dla poszczególnych modeli to kolejno:

  • Model 1 = pomarańczowy
  • Model 2 = zielony
  • Model 3 = niebieski
  • Model 4 = czerwony
  • gruba linia – wartości prawdziwe

Prawda jest taka, że różnice są niezauważalne i niewiele tutaj widać. Trzeba zdać się na intuicję i doświadczenie (albo tak zwane potrzeby biznesowe). Model można jeszcze uzupełnić (ne etapie zbierania danych – funkcje PersonMean() oraz MovieMakersMean() trzeba odpowiednio zmodyfikować) o rok produkcji filmu oraz o odcięcie późniejszych filmów przy liczeniu średnich dla poszczególnych twórców.

Ze wskaźników wychodzi, że nalepsze są modele 1 i 4. Pierwszy bierze pod uwagę wszystkich twórców filmu, drugi (numer 4) – tylko scenariusz i aktorów. I trochę ten drugi model ma racji, o ile można tak powiedzieć. Laik ocenia to co widzi na ekranie – historię i jak bardzo wiarygodni są aktorzy w swoich rolach. Zdjęcia są dla smakoszy, reżyseria to delikatna sprawa – jak jest spieprzona to coś w odbiorze filmu nie gra (ale jak gra w nim boski Leo czy inny ulubieniec to nie ma to znaczenia), ale jeśli jest wszystko dobrze to jest niezauważalna.

Osobiście postawiłbym na model 1. Sam kiedyś chciałem reżyserować, a poza tym 2/3 lepszych wskaźników niż w modelu 4.

Podobało się? Zostaw komcia, daj lajka i poślij linka w świat (“odsłony, misiu, odsłony!”).

7 komentarzy do “Przewidywanie oceny filmu – wybór modelu”

  1. Wrzuciłem dane, które były wykorzystane w obliczeniach. Niestety pochodzą z innego komputera, na którym powstał wpis więc mogą być jakieś braki lub błędy, a kolumny mogą być błędnie nazwane… na początek lepsze to niż ściąganie wszystkiego raz jeszcze :)
    Plik *.Rdata ma około 42 MB, znajduje się w archiwum

  2. Chyba wykorzystam ten model, ale dla liczenia rekomendacji dla mnie. Wiem, że napisałeś też wpis o rekomendacjach, ale oparłeś je na ocenach podobnych użytkowników.

  3. Super, super. Więcej się dowiedziałem z tego artykułu, aniżeli z kilku „mądrych” książek. Wielkie dzięki.

Skomentuj Łukasz Anuluj pisanie odpowiedzi

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *