[PYTHON] Essayez d'améliorer la précision de l'estimation du nombre de Twitter

A continué ...

Ci-dessous l'article précédent Estimer le nombre de likes sur Twitter

Le nombre de likes est estimé à partir du contenu du tweet.

Cette fois, nous chercherons l'exactitude.

Examiner l'ensemble de données

Il y a trop peu de données, nous obtiendrons donc des éléments plus pertinents.

Cela dit, les deux choses suivantes semblaient utiles pour savoir si c'était un tweet qui avait tellement grandi.

Ajoutons ces deux.

get_twitter.py


    #Obtenir en spécifiant l'utilisateur (écran_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]

        #Spécifiez la colonne que vous souhaitez Eoncode dans la liste. Bien sûr, vous pouvez en spécifier plusieurs.
        list_cols = ['week_day']
        #Spécifiez la colonne que vous souhaitez utiliser OneHotEncode. Spécifiez également la méthode d'achèvement en cas de Null ou inconnu.
        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)

Je vais vous donner un score avec cela.

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'


#Modèle de déclaration
from sklearn.ensemble import RandomForestRegressor

#Suppression des valeurs aberrantes
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']

#Modèle de déclaration
model = RandomForestRegressor(n_estimators=2000, max_depth=10,
                                min_samples_leaf=4, max_features=0.2, random_state=0)

#Apprentissage de modèle
model.fit(x_train, t_train)
#Validation du modèle
print(model.score(x_train, t_train))
print(model.score(x_test, t_test))
0.7189988420451674
0.6471214647821018

ダウンロード (5).png

La précision s'est considérablement améliorée! Que ce soit une citation retweet ou non ne contribue pas autant, mais il semble que ce n'est pas aussi hors de propos que le jour.

Cependant, une autre chose qui m'intéressait était l'heure du tweet. Actuellement, il n'est considéré que comme une valeur numérique, il semble donc préférable de le diviser en plusieurs bandes.

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

Les membres d'Eikolab ont une règle selon laquelle SNS est jusqu'à 24h00 (c'est sûr même si cela dépasse un peu), donc il y a une partie de 0, mais sinon la valeur moyenne est dans la plage de 24h00 de l'heure du Japon (probablement un tweet de joyeux anniversaire) Vous pouvez voir que cela coûte cher. Dans ↑, j'ai dit qu'il vaut mieux diviser par plusieurs bandes, mais c'est probablement mieux d'utiliser TargetEncoding au lieu de diviser par bande (car il semble difficile de diviser grossièrement par le temps)

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"])

Apprenez à utiliser target_enc_tweet_time au lieu de tweet_time et voyez le score

0.6999237089367164
0.6574824327192588

Les données d'entraînement ont diminué, mais les données de vérification ont augmenté. Au fait, lorsque "tweet_time" et "target_enc_tweet_time" sont adoptés, le résultat est le suivant.

0.7210047209796951
0.6457969793382683

Le score dans les données d'entraînement est le meilleur, mais pas dans les données de validation. Tous sont difficiles à attacher, mais laissons toutes les possibilités et passons à la suivante.

Changement de modèle

En ce moment, je suis dans une forêt aléatoire et je n'ai modifié aucun paramètre. Je voudrais donc définir le modèle sur «XGBoost» et utiliser «optuna» pour trouver les paramètres optimaux.

Installez ʻoptuna`

!pip install optuna

Ensuite, nous allons fonctionnaliser XGboost afin qu'il puisse être tourné avec optuna. Ici, les valeurs numériques appropriées sont alignées pour chaque valeur d'hyper paramètre, mais elles seront affinées car elles sont répétées plusieurs fois.

#Importer la bibliothèque XGboost
import xgboost as xgb
#Instanciation du modèle
#mod = xgb.XGBRegressor()
import optuna

def objective(trial):
    #Réglage du candidat hyper paramètre
    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)


    #Apprentissage
    model.fit(x_train, t_train)

    #Note de retour
    return (1 - model.score(x_test, t_test))

Tout d'abord, tournons-le 100 fois.

#Spécifiez le nombre d'essais
study = optuna.create_study()
study.optimize(objective, n_trials=100)

print('Hyper paramètres:', study.best_params)
print('précision:', 1 - study.best_value)

Voyons le score de chacun

① Seul tweet_time est adopté

0.690093409305073
0.663908038217022

② Seul target_enc_tweet_time est adopté

0.6966901697205284
0.667797061960107

③ Adoptez à la fois tweet_time et target_enc_tweet_time

0.6972461315076879
0.6669948080176482

Bien qu'il soit léger, ② semble être le plus précis.

Il est décidé que vous devriez essayer toutes les possibilités possibles, mais laquelle est la meilleure si vous vous limitez à une à partir d'ici? (2) et (3) sont presque les mêmes, mais (2) sont les données de vérification et le score est bon, et (3) est la formation et le score est bon. À partir de là, lors de réglages fins avec ʻoptuna` pour améliorer la précision ―― Pensez-vous que plus le score de formation est élevé, plus la marge de croissance est élevée? ―― Plus le score de vérification est élevé, moins le surapprentissage est sévère, nous améliorerons donc la précision. À laquelle devrais-je penser? Ce n'est peut-être pas un problème à dire non plus, mais si quelqu'un sait quelle est la bonne voie en général, je vous serais reconnaissant de bien vouloir me le faire savoir.

Cette fois, nous allons procéder avec la personne qui maîtrise ②.

Une fois que vous disposez d'un large éventail d'hyper paramètres, augmentez le nombre d'essais à 1000. Réduisez la plage près des hyperparamètres pour obtenir les meilleurs résultats obtenus et réessayez 1000 fois. Le résultat obtenu par ceci est le suivant.

0.6962221939011508
0.6685252235753019

Nous avons obtenu les meilleurs résultats de vérification à ce jour. J'ai essayé toutes les méthodes que je connais pour améliorer la précision, je vais donc m'arrêter ici cette fois.

Enfin, examinons le résultat de l'inférence et l'histogramme des valeurs réelles.

ダウンロード (7).png

Il aurait été agréable de savoir d'où proviennent les montagnes vers 1600. Je ne sais pas ce qui a changé depuis la première précision faible, alors je me demande si j'ai fait une erreur dans le type de graphique à tracer ...

Difficile à voir, orange: vrais goûts, vert: goûts déduits, bleu: erreur J'ai essayé de comploter avec.

ダウンロード (8).png

Vous inférez fondamentalement bas. Après tout, Hanana Oba tweete plus que ce que l'IA attendait ... Fin

Recommended Posts

Essayez d'améliorer la précision de l'estimation du nombre de Twitter
Essayez d'estimer le nombre de likes sur Twitter
10 méthodes pour améliorer la précision de BERT
J'ai essayé d'améliorer la précision de mon propre réseau neuronal
Essayez de simuler le mouvement du système solaire
Obtenez le nombre de tweets liés à un certain mot-clé à l'aide de l'API Twitter
Comment connaître le numéro de port du service xinetd
Comment obtenir le nombre de chiffres en Python
Essayez d'obtenir le contenu de Word avec Golang
Comment trouver le nombre optimal de clusters pour les k-moyennes
Essayez d'obtenir la liste des fonctions du paquet Python> os
10. Compter le nombre de lignes
Essayez d'évaluer les performances du modèle d'apprentissage automatique / de régression
Essayez d'analyser les tendances Twitter
Obtenez le nombre de chiffres
Essayez d'évaluer les performances du modèle d'apprentissage automatique / de classification
Essayez de résoudre les problèmes / problèmes du "programmeur matriciel" (fonction du chapitre 0)
Essayez d'utiliser l'API Twitter
Comment augmenter le nombre d'images de jeux de données d'apprentissage automatique
[Python] J'ai essayé de visualiser la relation de suivi de Twitter
Essayez d'automatiser le fonctionnement des périphériques réseau avec Python
Calculez le nombre de changements
Essayez d'extraire les caractéristiques des données de capteur avec CNN
[Note] Essayons de prédire la quantité d'électricité utilisée! (Partie 1)
Créez le thème de Pythonista 3 comme Monokai (comment créer votre propre thème)
Premier python ② Essayez d'écrire du code tout en examinant les fonctionnalités de python
Essayez de résoudre le problème N Queen avec SA de PyQUBO
Essayez de modéliser le rendement cumulatif du roulement dans le trading à terme
Pour améliorer la réutilisabilité et la maintenabilité des flux de travail créés avec Luigi
J'ai essayé d'améliorer l'efficacité du travail quotidien avec Python
Essayez de prédire le triplet de la course de bateaux en classant l'apprentissage
Obtenez le nombre de vues de Qiita
Essayez d'introduire le thème sur Pelican
Obtenez le nombre d'abonnés Youtube
Essayez Cython dans les plus brefs délais
Le moyen le plus rapide d'essayer EfficientNet
Supplément à l'explication de vscode
La façon la plus simple d'essayer PyQtGraph
[Version terminée] Essayez de connaître le nombre d'habitants de la ville à partir de la liste d'adresses avec Python
Vérifiez le nombre de nombres premiers inférieur ou égal à n
Le nombre de fermetures de magasins a-t-il augmenté en raison de l'influence du nouveau virus corona?
Graphique de l'historique du nombre de couches de deep learning et du changement de précision
[Python] Un programme qui calcule le nombre de chaussettes jumelées
Comment connaître le nombre de processeurs sans utiliser la commande sar
Essayez d'estimer les paramètres de la distribution gamma tout en implémentant simplement MCMC
Essayez d'obtenir l'état de la surface de la route en utilisant de grandes données de gestion de la surface de la route
Comment mettre un numéro de ligne au début d'un fichier CSV
Obtenez le nombre de visites sur chaque page avec ReportingAPI + Cloud Functions
(Python) J'ai essayé d'analyser 1 million de mains ~ J'ai essayé d'estimer le nombre d'AA ~
Essayez d'utiliser n pour rétrograder la version de Node.js que vous avez installée
Essayez de ne faire réagir que le carbone en bout de chaîne avec SMARTS
Comment lire une vidéo tout en regardant le nombre d'images (Mac)
Essayez de séparer l'arrière-plan et l'objet en mouvement de la vidéo avec OpenCV
L'histoire d'essayer de reconnecter le client
Compter / vérifier le nombre d'appels de méthode.
Script pour changer la description de fasta
Essayez de faire face à la somme partielle
Faisons un noyau jupyter