Zephyrnet-Logo

Lassen Sie uns herausfinden, wie man ansprechende Videos erstellt.

Datum:

Dieser Artikel wurde als Teil des veröffentlicht Data-Science-Blogathon.

Einleitung

Wir werden vorhersagen, wie ansprechend ein Video auf Benutzerebene sein kann. Uns wurde ein Datensatz zur Verfügung gestellt, der den Engagement-Score früherer Videos dieses Benutzers zusammen mit seinen persönlichen Informationen enthält.

Wir werden mehrere Regressionsmodelle erstellen und sehen, welches besser abschneidet.

Inhalte

  1. Daten verstehen
  2. Industrielle Anwendungen
  3. Explorative Datenanalyse
  4. Feature-Entwicklung
  5. Modellierung
  6. Modellleistung
  7. Code
  8. Zusammenfassung

Daten verstehen

Diese Daten wurden in einem „Job-a-thon“-Wettbewerb bereitgestellt, der im Februar 2022 bei Analytics Vidya organisiert wurde. Diese Daten standen den Mitgliedern zur Verfügung, die an dem Wettbewerb teilgenommen haben. Da ich am Wettbewerb teilgenommen habe, konnte ich den Datensatz herunterladen. Hier stelle ich meinen Ansatz zur Lösung des Problems vor.

Eigenschaften

Spannende Videos

Hier sind Alter, Geschlecht und Beruf die uns bereitgestellten Benutzerinformationen, und engagement_score gibt an, wie ansprechend ihr Video war, basierend auf einer Skala von 1 bis 5.

Wir dürfen die row_id nicht als Feature verwenden oder die neuen Features mit der row_id erstellen.

Industrielle Anwendungen

Dieses Problem ist ein alltägliches Problem in der heutigen digitalen Welt.

Explorative Datenanalyse

user_id, category_id und video_id sind die kategorialen Merkmale im Datensatz, obwohl sie in numerischer Form dargestellt werden.

Anzahl der Unique User in den Daten

df['user_id'].nunique()
Ausgabe: 27734

Es gibt 27734 Benutzer in den angegebenen Daten.

Form der Daten

df.Form
Ausgabe : (89197, 10)

Es gibt ungefähr 90,000 Zeilen in den Daten und 10 Spalten, einschließlich der Zielspalte.

Verteilung numerischer Merkmale

num_features=['age','followers','views'] cat_features=['user_id','category_id','video_id','gender','profession']
df[num_features].hist(figsize=(10,10));

Quelle: Autor

Wir können beobachten, dass sich im Datensatz hauptsächlich junge Benutzer befinden. Die Altersgruppe zwischen 15 und 25 Jahren ist am Höhepunkt.

Verteilung kategorialer Merkmale

Aus user_id, category_id und video_id können wir nicht viel herausholen. Sehen wir uns die Verteilung von „Geschlecht“ und „Beruf“ an.

sns.catplot(data=df[cat_features],kind='count',x='profession');

Quelle: Autor

sns.catplot(data=df[cat_features],kind='count',x='gender');

Quelle: Autor

Wir können beobachten, dass es mehr Videoeinträge gibt von 'Männlich' Benutzer und 'Die Kursteilnehmer“ ist der häufigste Beruf und „Berufstätige“ sind gemäß den angegebenen Daten am wenigsten aktiv.

Feature-Korrelation

plt.figure(figsize=(20,10)) sns.heatmap(df.corr(),fmt='g',annot=True)
Spannende Videos

Quelle: Autor

Wir können beobachten, dass es zwei Merkmalspaare gibt, die eine gewisse Korrelation aufweisen. video_id, category_id und Aufrufe, Follower.

Aber es gibt keine Funktion, die eine starke Korrelation mit engament_score zeigt.

Paar-Plot

sns.pairplot(df)
Paardiagramm | Ansprechende Videos

Quelle: Autor

Paardiagramme bestätigen auch, dass es keine starke Korrelation zwischen engagement_score und einem bestimmten Merkmal gibt.

Sehen wir uns an, ob wir Funktionen erstellen können, die eine bessere Korrelation mit dem Ziel (engagemnet_score) haben und dabei helfen, ein besseres Vorhersagemodell zu erstellen.

Feature-Entwicklung

Wir werden versuchen, Features zu erstellen, die Follower, View und Engagement_score verwenden. Wir werden herausfinden, wie viele minimale, mittlere und maximale Aufrufe und Follower ein Benutzer hat. Wir werden auch die minimalen, mittleren und maximalen Aufrufe und Follower pro Kategorie ermitteln.

Wir werden die Funktionen auch ähnlich mit engagement_score erstellen. Dadurch erhalten wir den minimalen, maximalen und mittleren Engagement_score von Benutzer und Benutzer pro Kategorie.

Lassen Sie uns zunächst die Daten in Trainings- und Testdatensätze aufteilen.

Aufteilen des Datensatzes in Zug- und Testdaten

Wir teilen die Daten in eine 80-20-Aufteilung auf. 80 % der Daten werden für das Training und 20 % der Daten für Tests verwendet.

features=['user_id', 'category_id', 'video_id', 'age', 'gender', 'profession', 'followers', 'views'] target=['engagement_score'] x_train,x_test,y_train,y_test= train_test_split(df[features],df[target],test_size=0.2,random_state=42) df_train=pd.concat([x_train,y_train],axis=1) df_test=pd.concat([x_test,y_test],axis= 1)

Erstellen von Funktionen mit „Followern“ und „Ansichten“

grp_by=['user_id']
user_id_features=df_train.groupby(grp_by)['followers'].min().reset_index()
user_id_features.rename(columns={'followers':'min_followers'},inplace=True)
user_id_features['avg_followers']=df_train.groupby(grp_by)['followers'].mean().reset_index()['followers']
user_id_features['max_followers']=df_train.groupby(grp_by)['followers'].max().reset_index()['followers']
user_id_features['sum_followers']=df_train.groupby(grp_by)['followers'].sum().reset_index()['followers']
user_id_features['min_views']=df_train.groupby(grp_by)['views'].min().reset_index()['views']
user_id_features['mean_views']=df_train.groupby(grp_by)['views'].mean().reset_index()['views']
user_id_features['max_views']=df_train.groupby(grp_by)['views'].max().reset_index()['views']
user_id_features['sum_views']=df_train.groupby(grp_by)['views'].sum().reset_index()['views']
grp_by1=['user_id','category_id']
user_id_features1=df_train.groupby(grp_by1)['followers'].min().reset_index()
user_id_features1.rename(columns={'followers':'min_followers_category'},inplace=True)
user_id_features1['avg_followers_category']=df_train.groupby(grp_by1)['followers'].mean().reset_index()['followers']
user_id_features1['max_followers_category']=df_train.groupby(grp_by1)['followers'].max().reset_index()['followers']
user_id_features1['sum_followers_category']=df_train.groupby(grp_by1)['followers'].sum().reset_index()['followers']
user_id_features1['min_views_category']=df_train.groupby(grp_by1)['views'].min().reset_index()['views']
user_id_features1['mean_views_category']=df_train.groupby(grp_by1)['views'].mean().reset_index()['views']
user_id_features1['max_views_category']=df_train.groupby(grp_by1)['views'].max().reset_index()['views']
user_id_features1['sum_views_category']=df_train.groupby(grp_by1)['views'].sum().reset_index()['views']
df_train=pd.merge(df_train,user_id_features,how='left',on=grp_by)
df_test=pd.merge(df_test,user_id_features,how='left',on=grp_by)
df_train=pd.merge(df_train,user_id_features1,how='left',on=grp_by1)
df_test=pd.merge(df_test,user_id_features1,how='left',on=grp_by1)

Erstellen von Funktionen mit „engagement_score“

grp_by=['user_id']
user_id_features2=df_train.groupby(grp_by)['engagement_score'].min().reset_index()
user_id_features2.rename(columns={'engagement_score':'min_eng_score'},inplace=True)
user_id_features2['avg_eng_score']=df_train.groupby(grp_by)['engagement_score'].mean().reset_index()['engagement_score']
user_id_features2['max_eng_score']=df_train.groupby(grp_by)['engagement_score'].max().reset_index()['engagement_score']
user_id_features2['sum_eng_score']=df_train.groupby(grp_by)['engagement_score'].sum().reset_index()['engagement_score']
grp_by1=['user_id','category_id']
user_id_features3=df_train.groupby(grp_by1)['engagement_score'].min().reset_index()
user_id_features3.rename(columns={'engagement_score':'min_eng_score_category'},inplace=True)
user_id_features3['avg_eng_score_category']=df_train.groupby(grp_by1)['engagement_score'].mean().reset_index()['engagement_score']
user_id_features3['max_eng_score_category']=df_train.groupby(grp_by1)['engagement_score'].max().reset_index()['engagement_score']
user_id_features3['sum_eng_score_category']=df_train.groupby(grp_by1)['engagement_score'].sum().reset_index()['engagement_score']
df_train=pd.merge(df_train,user_id_features2,how='left',on=grp_by)
df_test=pd.merge(df_test,user_id_features2,how='left',on=grp_by)
df_train=pd.merge(df_train,user_id_features3,how='left',on=grp_by1)
df_test=pd.merge(df_test,user_id_features3,how='left',on=grp_by1)

Betrachten wir nun die Korrelation neuer Funktionen. Wir werden die alten Funktionen nicht einbeziehen, da wir bereits gesehen haben, dass es keine starke Korrelation mit der Zielspalte „engagement_score“ gibt.

new_features=['min_followers', 'avg_followers', 'max_followers', 'sum_followers', 'min_views', 'mean_views', 'max_views', 'sum_views', 'min_followers_category', 'avg_followers_category', 'max_followers_category', 'sum_followers_category' , 'min_views_category', 'mean_views_category', 'max_views_category', 'sum_views_category', 'min_eng_score', 'avg_eng_score', 'max_eng_score', 'sum_eng_score', 'min_eng_score_category', 'avg_eng_score_category', 'max_eng_score_category', 'sum_eng_score_category',‘ engagement_score'] plt.figure(figsize=(20,10)) sns.heatmap(df_train[new_features].corr(),fmt='.2f',annot=True);
Heatmap | Ansprechende Videos

Quelle: Autor

Wir haben eine Korrelationstabelle für eine große Anzahl von Merkmalen, die nicht deutlich sichtbar ist, aber wir können immer noch die Farbe sehen, und anhand der Farbe können wir sehen, dass die neu entwickelten Merkmale stark mit dem Ziel „Engagement_score“ korrelieren.

Konzentrieren wir uns nur auf die Korrelation mit engagement_score.

df_corr=(df_train[new_features].corr()['engagement_score']).reset_index() df_corr.columns=['features','engagement_score'] df_corr.sort_values('engagement_score',ascending=False)

Quelle: Autor

Ich habe die Punktzahl in absteigender Reihenfolge aufgetragen und wir können sehen, dass neue Funktionen, die wir mit engagement_score erstellt haben, stark damit korrelieren. Funktionen, die wir mit „Aufrufen“ und „Followern“ erstellt haben, weisen keine große Korrelation zum „Engagement_score“ auf.

Lassen Sie uns jetzt die kategorialen Merkmale handhaben.

Label-Kodierung 'Geschlecht'
gender_dict={'Male':0,'Female':1} df_train['gender']=df_train['gender'].map(gender_dict) df_test['gender']=df_test['gender'].map(gender_dict )

Label-Kodierung 'Beruf'

profession_dict={'Student':0,'Working Professional':1,'Other':2} df_train['profession']=df_train['profession'].map(profession_dict) df_test['profession']=df_test[' Beruf'].map(beruf_dict)

Lassen Sie uns jetzt versuchen, die Modelle zu erstellen.

Modellierung

Wir werden die Modelle „LinearRegression“, „XGBoostRegressor“, „RandomForestRegressor“ und „CatBoostRegressor“ erstellen, um dieses Problem zu lösen.

Lassen Sie uns zunächst die Funktionen auswählen, die wir verwenden werden.

features_to_use=['user_id', 'category_id', 'video_id', 'age', 'gender', 'profession', 'followers', 'views', 'min_followers', 'avg_followers', 'max_followers', 'sum_followers' , 'min_views', 'mean_views', 'max_views', 'sum_views', 'min_followers_category', 'avg_followers_category', 'max_followers_category', 'sum_followers_category', 'min_views_category', 'mean_views_category', 'max_views_category', _category min_eng_score', 'avg_eng_score', 'max_eng_score', 'sum_eng_score', 'min_eng_score_category', 'avg_eng_score_category', 'max_eng_score_category', 'sum_eng_score_category'] target=['engagement_score']

Bei der Aufteilung des Datensatzes in Train und Test ist es möglich, dass wenige Benutzer nicht im Test-Set landen. Aus diesem Grund kann es beim Feature-Engineering und beim Erstellen der neuen Features mit 'user_id' möglich sein, dass test_set 'NULL'-Werte enthält. Also lassen wir diese Zeilen fallen.

df_test.dropna(inplace=True)

Definieren von X_train, y_train, X_test und y_test.

X_train,y_train=df_train[features_to_use],df_train[target] X_test,y_test=df_test[features_to_use],df_test[target]

Wir werden verwenden R2_Score und quadratischer Mittelwert (RMSE) als Leistungsmetriken, um die Leistung der Modelle zu messen.

def model_performance(y_test,y_pred): r2=round(r2_score(y_test,y_pred),3) rmse=round(np.sqrt(mean_squared_error(y_test,y_pred)),3) return r2,rmse

Modelle bauen

model_name=['LinearRegression','XGBRegressor','RandomForestRegressor','CatBoostRegressor'] model_object=[LinearRegression(),XGBRegressor(),RandomForestRegressor(),CatBoostRegressor()] model_r2_result=[] model_rmse_result=[] für i,model in enumerate(model_object): print('Running ',model_name[i]) if model_name[i]=='CatBoostRegressor': model.fit(X_train,y_train,cat_features=['user_id', 'category_id', 'gender' , 'profession'],verbose=0) else: model.fit(X_train,y_train) y_pred=model.predict(X_test) y_pred=np.array(y_pred).reshape(-1,1) #engagement score liegt between 0 und 5. Während der Vorhersage ist es möglich, dass die vorhergesagten Ergebnisse außerhalb dieser #Limits liegen, also behalte ich dies im Hinterkopf und begrenze die Vorhersagen im Bereich von 0 bis 5. genau_y_pred=limit_predictions(y_pred,0,5) model_r2,model_rmse=model_performance(y_test,accurate_y_pred) model_r2_result.append(model_r2) model_rmse_result.append(model_rmse)

Sehen wir uns nun an, wie sich die Modelle entwickelt haben.

Modellleistung

results=PrettyTable(['Performance_Metric']+model_name)

results.add_row(['R2_Score']+model_r2_result)

results.add_row(['RMSE_Score']+model_rmse_result)

Drucken (Ergebnisse)

Modellleistung | Ansprechende Videos

Quelle: Autor

Wir können sehen, dass fast alle Modelle bei den Daten gut abgeschnitten haben. CatboostRegressor erhielt den höchsten R2-Score und XGBRegressor erhielt den höchsten RMSE_Score.

Code

Hier präsentiere ich den vollständigen Code zur Lösung des Problems.

#importing Libraries import pandas as pd from catboost import CatBoostRegressor from sklearn.linear_model import LinearRegression from xgboost import XGBRegressor from sklearn.ensemble import RandomForestRegressor from sklearn.model_selection import train_test_split import matplotlib.pyplot as plt import seaborn as sns from sklearn.metrics import r2_score, mean_squared_error import numpy as np from prettytable import PrettyTable
#Loading Data df=pd.read_csv('train_0OECtn8.csv') df.drop('row_id',axis=1,inplace=True) #EDA num_features=['age','followers','views'] cat_features=['user_id','category_id','video_id','gender','profession'] df[num_features].hist(figsize=(10,10)); sns.catplot(data=df[cat_features],kind='count',x='profession'); sns.catplot(data=df[cat_features],kind='count',x='gender'); ##correlation plt.figure(figsize=(20,10)) sns.heatmap(df.corr(),fmt='g',annot=True) ##pair plots sns.pairplot(df) #Feature Engineering features=['user_id', 'category_id', 'video_id', 'age', 'gender', 'profession', 'followers', 'views'] target=['engagement_score'] x_train,x_test,y_train,y_test=train_test_split(df[features],df[target],test_size=0.2,random_state=42) df_train=pd.concat([x_train,y_train],axis=1) df_test=pd.concat([x_test,y_test],axis=1) ##feautures using views and followers grp_by=['user_id'] user_id_features=df_train.groupby(grp_by)['followers'].min().reset_index() user_id_features.rename(columns={'followers':'min_followers'},inplace=True) user_id_features['avg_followers']=df_train.groupby(grp_by)['followers'].mean().reset_index()['followers'] user_id_features['max_followers']=df_train.groupby(grp_by)['followers'].max().reset_index()['followers'] user_id_features['sum_followers']=df_train.groupby(grp_by)['followers'].sum().reset_index()['followers'] user_id_features['min_views']=df_train.groupby(grp_by)['views'].min().reset_index()['views'] user_id_features['mean_views']=df_train.groupby(grp_by)['views'].mean().reset_index()['views'] user_id_features['max_views']=df_train.groupby(grp_by)['views'].max().reset_index()['views'] user_id_features['sum_views']=df_train.groupby(grp_by)['views'].sum().reset_index()['views'] grp_by1=['user_id','category_id'] user_id_features1=df_train.groupby(grp_by1)['followers'].min().reset_index() user_id_features1.rename(columns={'followers':'min_followers_category'},inplace=True) user_id_features1['avg_followers_category']=df_train.groupby(grp_by1)['followers'].mean().reset_index()['followers'] user_id_features1['max_followers_category']=df_train.groupby(grp_by1)['followers'].max().reset_index()['followers'] user_id_features1['sum_followers_category']=df_train.groupby(grp_by1)['followers'].sum().reset_index()['followers'] user_id_features1['min_views_category']=df_train.groupby(grp_by1)['views'].min().reset_index()['views'] user_id_features1['mean_views_category']=df_train.groupby(grp_by1)['views'].mean().reset_index()['views'] user_id_features1['max_views_category']=df_train.groupby(grp_by1)['views'].max().reset_index()['views'] user_id_features1['sum_views_category']=df_train.groupby(grp_by1)['views'].sum().reset_index()['views'] df_train=pd.merge(df_train,user_id_features,how='left',on=grp_by) df_test=pd.merge(df_test,user_id_features,how='left',on=grp_by) df_train=pd.merge(df_train,user_id_features1,how='left',on=grp_by1) df_test=pd.merge(df_test,user_id_features1,how='left',on=grp_by1) ##features using engagement_score grp_by=['user_id'] user_id_features2=df_train.groupby(grp_by)['engagement_score'].min().reset_index() user_id_features2.rename(columns={'engagement_score':'min_eng_score'},inplace=True) user_id_features2['avg_eng_score']=df_train.groupby(grp_by)['engagement_score'].mean().reset_index()['engagement_score'] user_id_features2['max_eng_score']=df_train.groupby(grp_by)['engagement_score'].max().reset_index()['engagement_score'] user_id_features2['sum_eng_score']=df_train.groupby(grp_by)['engagement_score'].sum().reset_index()['engagement_score'] grp_by1=['user_id','category_id'] user_id_features3=df_train.groupby(grp_by1)['engagement_score'].min().reset_index() user_id_features3.rename(columns={'engagement_score':'min_eng_score_category'},inplace=True) user_id_features3['avg_eng_score_category']=df_train.groupby(grp_by1)['engagement_score'].mean().reset_index()['engagement_score'] user_id_features3['max_eng_score_category']=df_train.groupby(grp_by1)['engagement_score'].max().reset_index()['engagement_score'] user_id_features3['sum_eng_score_category']=df_train.groupby(grp_by1)['engagement_score'].sum().reset_index()['engagement_score'] df_train=pd.merge(df_train,user_id_features2,how='left',on=grp_by) df_test=pd.merge(df_test,user_id_features2,how='left',on=grp_by) df_train=pd.merge(df_train,user_id_features3,how='left',on=grp_by1) df_test=pd.merge(df_test,user_id_features3,how='left',on=grp_by1) ##correlation using new features new_features=['min_followers', 'avg_followers', 'max_followers', 'sum_followers', 'min_views', 'mean_views', 'max_views', 'sum_views', 'min_followers_category', 'avg_followers_category', 'max_followers_category', 'sum_followers_category', 'min_views_category', 'mean_views_category', 'max_views_category', 'sum_views_category', 'min_eng_score', 'avg_eng_score', 'max_eng_score', 'sum_eng_score', 'min_eng_score_category', 'avg_eng_score_category', 'max_eng_score_category', 'sum_eng_score_category','engagement_score'] plt.figure(figsize=(20,10)) sns.heatmap(df_train[new_features].corr(),fmt='.2f',annot=True,); ##correlation only with 'engagement_score' df_corr=(df_train[new_features].corr()['engagement_score']).reset_index() df_corr.columns=['features','engagement_score'] df_corr.sort_values('engagement_score',ascending=False) ##Handling Categorical Data gender_dict={'Male':0,'Female':1} df_train['gender']=df_train['gender'].map(gender_dict) df_test['gender']=df_test['gender'].map(gender_dict) profession_dict={'Student':0,'Working Professional':1,'Other':2} df_train['profession']=df_train['profession'].map(profession_dict) df_test['profession']=df_test['profession'].map(profession_dict) #Model Building features_to_use=['user_id', 'category_id', 'video_id', 'age', 'gender', 'profession', 'followers', 'views', 'min_followers', 'avg_followers', 'max_followers', 'sum_followers', 'min_views', 'mean_views', 'max_views', 'sum_views', 'min_followers_category', 'avg_followers_category', 'max_followers_category', 'sum_followers_category', 'min_views_category', 'mean_views_category', 'max_views_category', 'sum_views_category', 'min_eng_score', 'avg_eng_score', 'max_eng_score', 'sum_eng_score', 'min_eng_score_category', 'avg_eng_score_category', 'max_eng_score_category', 'sum_eng_score_category'] target=['engagement_score'] #since we have a user in the data.  Es ist möglich, dass nach dem Aufteilen des Datensatzes wenige Benutzer nach dem Feature-Engineering nicht #in den Testdaten landen.  Der Einfachheit halber lassen wir also Nullwerte aus Testdaten fallen.  

Zusammenfassung

In diesem Artikel haben wir das Problem gelöst, vorherzusagen, wie ansprechend ein Video auf Benutzerebene sein kann.

Der verwendete Datensatz stammte aus einem „Job-a-thon“-Wettbewerb, der in Analytics vidya organisiert wurde, und war nur für Mitglieder verfügbar, die an dem Wettbewerb teilgenommen haben.

Wir haben gesehen, dass CatboostRegressor den höchsten R2_Score und XGBoost den höchsten RMSE_score für die Daten erhalten hat.

Lesen Sie weiter Blogs auf unserer Website besuchen.

Die in diesem Artikel gezeigten Medien sind nicht Eigentum von Analytics Vidhya und werden nach Ermessen des Autors verwendet. 

spot_img

Neueste Intelligenz

spot_img