Unter dem vorherigen Artikel Schätzen Sie die Anzahl der Likes auf Twitter
Die Anzahl der Likes wird aus dem Inhalt des Tweets geschätzt.
Dieses Mal werden wir uns um Genauigkeit bemühen.
Es gibt zu wenig Daten, sodass wir relevantere Elemente erhalten.
Die folgenden beiden Dinge schienen jedoch nützlich zu sein, um festzustellen, ob es sich um einen Tweet handelte, der so stark gewachsen war oder nicht.
Fügen wir diese beiden hinzu.
get_twitter.py
#Holen Sie sich durch Angabe des Benutzers (Bildschirm_name)
getter = TweetsGetter.byUser('hana_oba')
df = pd.DataFrame(columns = ['week_day','have_photo','have_video','tweet_time','text_len','favorite_count','retweet_count','quoted_status','reply','year_2018','year_2019','year_2020'])
cnt = 0
for tweet in getter.collect(total = 10000):
cnt += 1
week_day = tweet['created_at'].split()[0]
tweet_time = tweet['created_at'].split()[3][:2]
year = tweet['created_at'].split()[5]
#Geben Sie in der Liste die Spalte an, die Sie als Eoncode verwenden möchten. Natürlich können Sie mehrere angeben.
list_cols = ['week_day']
#Geben Sie die Spalte an, die OneHotEncode enthalten soll. Geben Sie auch die Abschlussmethode für Null oder Unbekannt an.
ce_ohe = ce.OneHotEncoder(cols=list_cols,handle_unknown='impute')
photo = 0
video = 0
quoted_status = 0
reply = 0
yar_2018 = 0
yar_2019 = 0
yar_2020 = 0
if 'media' in tweet['entities']:
if 'photo' in tweet['entities']['media'][0]['expanded_url']:
photo = 1
else:
video = 1
if 'quoted_status_id' in tweet:
quoted_status = 1
else:
quoted_status = 0
if tweet['in_reply_to_user_id_str'] is None:
reply = 0
else:
reply = 1
if year == '2018':
yar_2018 = 1
yar_2019 = 0
yar_2020 = 0
if year == '2019':
yar_2018 = 0
yar_2019 = 1
yar_2020 = 0
if year == '2020':
yar_2018 = 0
yar_2019 = 0
yar_2020 = 1
df = df.append(pd.Series([week_day, photo, video, int(tweet_time), len(tweet['text']),tweet['favorite_count'],tweet['retweet_count'],quoted_status,reply,yar_2018,yar_2019,yar_2020], index=df.columns),ignore_index=True)
df_session_ce_onehot = ce_ohe.fit_transform(df)
df_session_ce_onehot.to_csv('oba_hana_data.csv',index=False)
Ich werde Ihnen damit eine Punktzahl geben.
IhaveOBAHANAfullyunderstood.ipynb
datapath = '/content/drive/My Drive/data_science/'
df = pd.read_csv(datapath + 'oba_hana_data.csv')
train_count = int(df.shape[0]*0.7)
df_train = df.sample(n=train_count)
df_test = df.drop(df_train.index)
have_photo = 'have_photo'
have_video = 'have_video'
tweet_time = 'tweet_time'
text_len = 'text_len'
favorite_count = 'favorite_count'
retweet_count = 'retweet_count'
quoted_status = 'quoted_status'
reply = 'reply'
year_2018 = 'year_2018'
year_2019 = 'year_2019'
year_2020 = 'year_2020'
#Modelldeklaration
from sklearn.ensemble import RandomForestRegressor
#Ausreißer entfernen
df_train = df_train[df_train['favorite_count'] < 4500]
df_train.shape
x_train = df_train.loc[:,[have_photo,have_video,tweet_time,text_len,quoted_status,reply,year_2018,year_2019,year_2020]]
t_train = df_train['favorite_count']
x_test = df_test.loc[:,[have_photo,have_video,tweet_time,text_len,quoted_status,reply,year_2018,year_2019,year_2020]]
t_test = df_test['favorite_count']
#Modelldeklaration
model = RandomForestRegressor(n_estimators=2000, max_depth=10,
min_samples_leaf=4, max_features=0.2, random_state=0)
#Modelllernen
model.fit(x_train, t_train)
#Modell Bestätigung
print(model.score(x_train, t_train))
print(model.score(x_test, t_test))
0.7189988420451674
0.6471214647821018
Die Genauigkeit hat sich dramatisch verbessert! Ob es sich um ein Zitat-Retweet handelt oder nicht, trägt nicht so viel dazu bei, aber es scheint, dass es nicht so irrelevant ist wie der Tag.
Eine andere Sache, die mich interessierte, war die Tweet-Zeit. Derzeit wird es nur als numerischer Wert angesehen, daher scheint es besser, ihn in mehrere Bänder zu unterteilen.
time_mean = pd.DataFrame(columns = ['time','favorite_mean'])
time_array = range(23)
for i in range(23):
time_mean = time_mean.append(pd.Series([i,df_train[df_train['tweet_time'] == time_array[i]].favorite_count.mean()], index=time_mean.columns),ignore_index=True)
time_mean['time'] = time_mean['time'].astype(int)
sns.set_style('darkgrid')
plt.figure(figsize=(12, 8))
sns.catplot(x="time", y="favorite_mean", data=time_mean,
height=6, kind="bar", palette="muted")
plt.show()
Eikolab-Mitglieder haben die Regel, dass SNS bis 24:00 Uhr ist (es ist sicher, auch wenn es ein wenig hervorsteht), daher gibt es einen Teil von 0, aber ansonsten liegt der Durchschnittswert in Japan um 24:00 Uhr (wahrscheinlich ein Happy Birthday-Tweet). Sie können sehen, dass es teuer ist. In ↑ habe ich gesagt, dass es besser ist, durch mehrere Bänder zu teilen, aber wahrscheinlich ist es besser, "TargetEncoding" zu verwenden, anstatt durch ein Band zu teilen (weil es schwierig zu sein scheint, grob nach Zeit zu teilen).
pip install category_encoders
from category_encoders.target_encoder import TargetEncoder
df_train["tweet_time"] = df_train["tweet_time"].astype(str)
TE = TargetEncoder(smoothing=0.1)
df_train["target_enc_tweet_time"] = TE.fit_transform(df_train["tweet_time"],df_train["favorite_count"])
df_test["target_enc_tweet_time"] = TE.transform(df_test["tweet_time"])
Lernen Sie die Verwendung von target_enc_tweet_time
anstelle von tweet_time
und sehen Sie sich die Punktzahl an
0.6999237089367164
0.6574824327192588
Die Trainingsdaten gingen zurück, aber die Verifizierungsdaten stiegen. Übrigens, wenn sowohl "tweet_time" als auch "target_enc_tweet_time" übernommen werden, wird es wie folgt.
0.7210047209796951
0.6457969793382683
Die Punktzahl in den Trainingsdaten ist die beste, jedoch nicht in den Validierungsdaten. Alle sind schwer zu befestigen, aber lassen wir alle Möglichkeiten und gehen zum nächsten über.
Im Moment bin ich in einem zufälligen Wald und habe keine Einstellungen vorgenommen. Daher möchte ich das Modell auf "XGBoost" setzen und "optuna" verwenden, um die optimalen Parameter zu finden.
Installieren Sie optuna
!pip install optuna
Als nächstes werden wir "XGboost" so funktionieren, dass es mit "optuna" gedreht werden kann. Hier werden für jeden Hyperparameterwert geeignete numerische Werte angegeben, die jedoch fein abgestimmt werden, da sie viele Male wiederholt werden.
#XGboost-Bibliothek importieren
import xgboost as xgb
#Modellinstanziierung
#mod = xgb.XGBRegressor()
import optuna
def objective(trial):
#Hyperparameter-Kandidateneinstellung
min_child_samples = trial.suggest_int('min_child_samples', 60, 75)
max_depth = trial.suggest_int('max_depth', -60, -40)
learning_rate = trial.suggest_uniform('suggest_uniform ', 0.075, 0.076)
min_child_weight = trial.suggest_uniform('min_child_weight', 0.1, 0.8)
num_leaves = trial.suggest_int('num_leaves', 2, 3)
n_estimators = trial.suggest_int('n_estimators', 100, 180)
subsample_for_bin = trial.suggest_int('subsample_for_bin', 450000, 600000)
model = xgb.XGBRegressor(min_child_samples = min_child_samples,min_child_weight = min_child_weight,
num_leaves = num_leaves,subsample_for_bin = subsample_for_bin,learning_rate = learning_rate,
n_estimators = n_estimators)
#Lernen
model.fit(x_train, t_train)
#Rückgabewert
return (1 - model.score(x_test, t_test))
Lassen Sie es uns zuerst 100 Mal drehen.
#Geben Sie die Anzahl der Versuche an
study = optuna.create_study()
study.optimize(objective, n_trials=100)
print('Hyperparameter:', study.best_params)
print('Richtigkeit:', 1 - study.best_value)
Lassen Sie uns die Punktzahl für jeden sehen
0.690093409305073
0.663908038217022
0.6966901697205284
0.667797061960107
0.6972461315076879
0.6669948080176482
Obwohl es geringfügig ist, scheint ② am genauesten zu sein.
Es wird beschlossen, dass Sie jede mögliche Möglichkeit ausprobieren sollten, aber welche ist am besten, wenn Sie sich von hier aus auf eine beschränken? ② und ③ sind fast gleich, aber ② sind die Verifizierungsdaten und die Punktzahl ist gut, und ③ ist das Training und die Punktzahl ist gut. Von hier aus, wenn Sie Feineinstellungen mit "optuna" vornehmen, um die Genauigkeit zu verbessern ――Denken Sie, dass die Wachstumsmarge umso höher ist, je höher der Trainingswert ist?
Dieses Mal werden wir mit der Person fortfahren, die ② beherrscht.
Wenn Sie eine Vielzahl von Hyperparametern haben, erhöhen Sie die Anzahl der Versuche auf 1000. Grenzen Sie den Bereich in der Nähe der Hyperparameter ein, um die besten Ergebnisse zu erzielen, und versuchen Sie es 1000 Mal erneut. Das dadurch erhaltene Ergebnis ist wie folgt.
0.6962221939011508
0.6685252235753019
Wir haben bisher die besten Verifizierungsergebnisse erzielt. Ich habe alle mir bekannten Methoden ausprobiert, um die Genauigkeit zu verbessern, daher werde ich diesmal hier aufhören.
Schauen wir uns zum Schluss das Inferenzergebnis und das Istwerthistogramm an.
Es wäre schön gewesen zu wissen, woraus die Berge um 1600 tatsächlich gezogen wurden. Ich weiß nicht, was sich seit der ersten geringen Genauigkeit geändert hat, daher frage ich mich, ob ich bei der Art des zu zeichnenden Diagramms einen Fehler gemacht habe ...
Schwer zu sehen, orange: echte Likes, grün: abgeleitete Likes, blau: Fehler Ich habe versucht, mit zu planen.
Sie schließen im Grunde niedrig. Immerhin twittert Hanana Oba mehr als erwartet ... (Ihr Modell kann man nicht als KI bezeichnen) Fin
Recommended Posts