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.
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
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()
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.
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
0.690093409305073
0.663908038217022
0.6966901697205284
0.667797061960107
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.
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.
Vous inférez fondamentalement bas. Après tout, Hanana Oba tweete plus que ce que l'IA attendait ... Fin
Recommended Posts