import pandas as pd
import numpy as np
import sys
from sklearn import svm
from sklearn.model_selection import train_test_split
file = pd.read_csv("./netflix_titles.csv")
df = pd.DataFrame(file)
df
On charge le dataset dans un DataFrame afin de pouvoir observer les différentes données présentent.
df.shape
df.columns ,df.dtypes
df['director'] = df['director'].fillna(1)
df['cast'] = df['cast'].fillna("unknown")
df['listed_in'] = df['listed_in'].fillna("unknown")
On remplace les valeurs nulles par des valeurs par défaut sur les colonnes qui nous intéresse.
Nous allons chercher à prédire la liste des types de show en fonction du directeur et d'un acteur du casting. On va donc utiliser un classifier(svc: Support Vector Clustering).
directors = df['director']
casting = df['cast']
show_types =df['listed_in']
Chaque colonnes qui nous intéresse est mise dans une Series afin d'effectuer une conversion vers une valeur numérique. Tout d'abord nous allons convertir
ponderationType= []
pound = 100
for typeShow in show_types.unique():
ponderationType.append((typeShow,pound))
pound +=100
On va donc pondérer les types de show avec un ecart entre les valeurs afin de créer un écart entre les classes
ponderationDirector= []
pound = 2
for director in directors.unique():
if(director!=1):
ponderationDirector.append((director,pound))
pound +=1
On fait de meme avec les directeur sans prendre d'écart considéré. Les valeurs nulles sont mise à 1 pour que la pondération des acteurs ne soit pas influencé par le directeur associé surtout quand la valeurs n'est pas renseigné.
duo_list = []
nbActor = []
ponderationActor = []
for x in range(casting.size):
actors = []
actors = casting[x].split(',')
nbActor.append(len(actors))
for act in actors:
if(duo_list.count([act,directors[x],show_types[x]])==0):
if(ponderationActor.count([act,0])==0):
ponderationActor.append([act,0])
duo_list.append([act,directors[x],show_types[x]])
Il faut mettre en place une valeur du type ==> typeDuShow = directeur*(somme(acteur))
distribution des directeurs par valeur se fait à partir de 2 jusqu'a len(directors.unique()) (numéro 1 pour la valeur nulle)
acc = 1
it = 0
for triplet in duo_list:
for val in ponderationType:
if(triplet[2] == val[0]):
triplet[2] = val[1]
for direc in ponderationDirector:
if(triplet[1] == direc[0]):
triplet[1] = direc[1]
if(acc == nbActor[it]):
it += 1
acc = 1
#for act in ponderationActor:
#if(act[0]==triplet[0]):
# if(act[1]==0):
act= triplet[2]/(triplet[1] *nbActor[it])
# elif(act[1]!=triplet[2]/(triplet[1] *nbActor[it])):
# act[1]= (act[1]+(triplet[2]/(triplet[1] *nbActor[it])))/2
triplet[0]= act
acc += 1
distribution des types de show: 492 valeurs repartie avec un intervalle de 100
distribution des directeurs: de 1 à taille de la liste des directeurs
distribution des acteurs: selon le calcul suivant :valeur du type de show/(valeur du directeur *'nombre d'Acteur dans le casting)
X, y =[],[]
for x in range(len(duo_list)):
X.append([duo_list[x][0],duo_list[x][1]])
y.append(duo_list[x][2])
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
X_train , y_train
clf = svm.SVC()
clf.fit(X_train, y_train)
predict = clf.predict(X_test)
real=0
fake = 0
for i in range(len(predict)):
if(predict[i] != y_test[i]):
real +=1
else:
fake+=1
real,fake,len(y_test)
real/len(y_test) ,fake/len(y_test)
On remarque ici un pourcentage de bonne prediction a 79%. On a donc un plutot bon prédicteur si on estime le traitement effectué précédement est correcte. Or on a :
+Des valeurs pour les acteurs estimé à partir d'une formule algébrique qui ne prend pas en compte le fait qu'un acteur
doit etre lié au directeur. Il faut donc ponderer le couple acteur directeur.
+Un manque de valeurs non connu: c'est-à-dire des valeurs que l'algorithme ne connait pas(liste de types inconnu
des couples acteur/directeur inconnu)