[PYTHON] Versuchen Sie, die Genauigkeit der Twitter-ähnlichen Zahlenschätzung zu verbessern

Fortsetzung ...

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.

Überprüfen Sie den Datensatz

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

ダウンロード (5).png

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()

ダウンロード (6).png

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.

Modellwechsel

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

① Es wird nur tweet_time übernommen

0.690093409305073
0.663908038217022

② Es wird nur target_enc_tweet_time übernommen

0.6966901697205284
0.667797061960107

③ Übernehmen Sie sowohl tweet_time als auch target_enc_tweet_time

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.

ダウンロード (7).png

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.

ダウンロード (8).png

Sie schließen im Grunde niedrig. Immerhin twittert Hanana Oba mehr als erwartet ... (Ihr Modell kann man nicht als KI bezeichnen) Fin

Recommended Posts

Versuchen Sie, die Genauigkeit der Twitter-ähnlichen Zahlenschätzung zu verbessern
Versuchen Sie, die Anzahl der Likes auf Twitter zu schätzen
10 Methoden zur Verbesserung der Genauigkeit von BERT
Ich habe versucht, die Genauigkeit meines eigenen neuronalen Netzwerks zu verbessern
Versuchen Sie, die Bewegung des Sonnensystems zu simulieren
Ermitteln Sie mithilfe der Twitter-API die Anzahl der Tweets, die sich auf ein bestimmtes Keyword beziehen
Wie man die Portnummer des xinetd-Dienstes kennt
So ermitteln Sie die Anzahl der Stellen in Python
Versuchen Sie, den Inhalt von Word mit Golang zu erhalten
So finden Sie die optimale Anzahl von Clustern für k-means
Versuchen Sie, die Funktionsliste des Python> os-Pakets abzurufen
10. Zählen der Anzahl der Zeilen
Versuchen Sie, die Leistung des Modells für maschinelles Lernen / Regression zu bewerten
Versuchen Sie, Twitter-Trends zu analysieren
Holen Sie sich die Anzahl der Ziffern
Versuchen Sie, die Leistung des Modells für maschinelles Lernen / Klassifizierung zu bewerten
Versuchen Sie, die Probleme / Probleme des "Matrix-Programmierers" zu lösen (Kapitel 0-Funktion)
Versuchen Sie es mit der Twitter-API
So erhöhen Sie die Anzahl der Datensatzbilder für maschinelles Lernen
[Python] Ich habe versucht, die folgende Beziehung von Twitter zu visualisieren
Versuchen Sie, den Betrieb von Netzwerkgeräten mit Python zu automatisieren
Berechnen Sie die Anzahl der Änderungen
Versuchen Sie, Merkmale von Sensordaten mit CNN zu extrahieren
[Anmerkung] Versuchen wir, den Stromverbrauch vorherzusagen! (Teil 1)
Erstellen Sie das Thema von Pythonista 3 wie Monokai (wie Sie Ihr eigenes Thema erstellen)
Erste Python ② Versuchen Sie, Code zu schreiben, während Sie die Funktionen von Python untersuchen
Versuchen Sie, das N Queen-Problem mit SA von PyQUBO zu lösen
Versuchen Sie, die kumulierte Rendite des Rollovers im Futures-Handel zu modellieren
Verbesserung der Wiederverwendbarkeit und Wartbarkeit von mit Luigi erstellten Workflows
Ich habe versucht, die Effizienz der täglichen Arbeit mit Python zu verbessern
Versuchen Sie, das Triplett des Bootsrennens vorherzusagen, indem Sie das Lernen bewerten
Holen Sie sich die Anzahl der Ansichten von Qiita
Versuchen Sie, das Thema Pelican vorzustellen
Holen Sie sich die Anzahl der Youtube-Abonnenten
Probieren Sie Cython in kürzester Zeit aus
Der schnellste Weg, EfficientNet auszuprobieren
Ergänzung zur Erklärung von vscode
Der einfachste Weg, PyQtGraph auszuprobieren
[Abgeschlossene Version] Versuchen Sie, die Anzahl der Einwohner der Stadt anhand der Adressliste mit Python herauszufinden
Überprüfen Sie die Anzahl der Primzahlen kleiner oder gleich n
Hat die Anzahl der Ladenschließungen aufgrund des Einflusses des neuen Koronavirus zugenommen?
Diagramm der Geschichte der Anzahl der Ebenen des tiefen Lernens und der Änderung der Genauigkeit
[Python] Ein Programm, das die Anzahl der gepaarten Socken berechnet
So ermitteln Sie die Anzahl der CPUs ohne den Befehl sar
Versuchen Sie, die Parameter der Gammaverteilung zu schätzen, während Sie einfach MCMC implementieren
Versuchen Sie, den Zustand der Straßenoberfläche mithilfe von Big Data des Straßenoberflächenmanagements zu ermitteln
So setzen Sie eine Zeilennummer am Anfang einer CSV-Datei
Mit ReportingAPI + Cloud-Funktionen können Sie die Anzahl der Besuche auf jeder Seite ermitteln
(Python) Ich habe versucht, 1 Million Hände zu analysieren ~ Ich habe versucht, die Anzahl der AA ~ zu schätzen
Versuchen Sie, mit n die von Ihnen installierte Version von Node.js herunterzustufen
Versuchen Sie, nur den Kohlenstoff am Ende der Kette mit SMARTS zu reagieren
So spielen Sie ein Video ab, während Sie die Anzahl der Bilder ansehen (Mac)
Versuchen Sie, den Hintergrund und das sich bewegende Objekt des Videos mit OpenCV zu trennen
Die Geschichte des Versuchs, den Client wieder zu verbinden
Zählen / überprüfen Sie die Anzahl der Methodenaufrufe.
Skript zum Ändern der Beschreibung von Fasta
Versuchen Sie, sich der Teilsumme zu stellen
Machen wir einen Jupyter-Kernel