Der Ursprung davon war der Versuch, das Schaben für die Produktion von Pferderennen-KI zu lernen, und ich suchte nach der Lernaufgabe. Wie auch immer, ich denke, es wäre schön, eine Abfolge von Datenerfassung → Vorverarbeitung → Lernen → Inferenz zu haben. ** Schätzen Sie die Anzahl der Likes aus dem Tweet-Inhalt meiner Lieblingsmänner Hana Oba ** Ich beschloss, es zu einer Lernaufgabe zu machen. Dieses Mal ist es das Ziel, sich mit einem einfachen Fluss zu bewegen, und ich werde in Zukunft an der Genauigkeit arbeiten.
Die Datenerfassung erfolgt über die Twitter-API. Für die Registrierungsmethode habe ich auf den folgenden Artikel verwiesen. Tipps zum Bestehen der Twitter-API-Registrierung in 30 Minuten (mit japanischer Übersetzung) Nun, es ist ein Schmerz zu schreiben, wenn man den Grund bedenkt, also sei bitte vorbereitet. Ich war hier für einen Tag niedergeschlagen. (Japanisch ist unpraktisch ...)
Nach der Registrierung können Sie Tweet erhalten, also werde ich das Akquisitionsprogramm schreiben. Normalerweise scheint die Twitter-API nur bis zu 200 Tweets abrufen zu können. Dies kann auch anhand des folgenden Artikels "Abrufen aller Tweets von @hana_oba" realisiert werden. Ich werde den Code schreiben. Die meisten davon sind Kopien des Referenzartikelprogramms, daher werde ich nur die Teile auflisten, die ich hier geschrieben habe. Holen Sie sich viele Tweets mit TwitterAPI. Berücksichtigen Sie serverseitige Fehler (in Python)
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'])
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]
#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
if 'media' in tweet['entities']:
if 'photo' in tweet['entities']['media'][0]['expanded_url']:
photo = 1
else:
video = 1
df = df.append(pd.Series([week_day, photo, video, int(tweet_time), len(tweet['text']),tweet['favorite_count'],tweet['retweet_count']], 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 habe nichts Besonderes entwickelt, aber es ist schwierig, mit Daten gut umzugehen, ohne die Spezifikationen der Twitter-API zu verstehen. Lassen Sie uns also die gewünschten Daten per Google oder durch Ausprobieren abrufen. Dieser Datensatz ist --Tag
Bis zu diesem Zeitpunkt habe ich das Programm auf meinem eigenen PC ausgeführt, aber obwohl es keine große Sache ist, reichen die Maschinenspezifikationen aufgrund zukünftiger Entwicklungen nicht aus. Von hier aus werde ich es auf Google Colaboratory ausführen.
Lesen Sie zuerst die vom vorherigen Programm ausgegebenen Daten.
import pandas as pd
datapath = '/content/drive/My Drive/data_science/'
df = pd.read_csv(datapath + 'oba_hana_data.csv')
Die Gesamtzahl der Daten beträgt
df.shape
Es gab 2992 Fälle.
(2992, 13)
Ich werde 70% der Gesamtzahl als Trainingsdaten und die restlichen 30% als Verifizierungsdaten verwenden. Die Daten sind in chronologischer Reihenfolge angeordnet, und wenn sie nur 70% von vorne entfernt sind, sind die Bedingungen wie die Anzahl der Follower zu diesem Zeitpunkt unterschiedlich, sodass ich zufällig 70% erwerben möchte. Obwohl es einige analoge Elemente enthält, werden wir dieses Mal 2400 Fälle, was etwa 70% der Gesamtzahl entspricht, als Trainingsdaten und den Rest als Verifizierungsdaten verwenden.
df_train = df.sample(n=2400)
df_test = df.drop(df_train.index)
x_train = df_train.iloc[:,:11]
t_train = df_train['favorite_count']
x_test = df_test.iloc[:,:11]
t_test = df_test['favorite_count']
Lassen Sie uns mit diesen Daten einmal in einer zufälligen Gesamtstruktur lernen.
#Modelldeklaration
from sklearn.ensemble import RandomForestRegressor
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)
Mal sehen, die Partitur
#Modell Bestätigung
print(model.score(x_train, t_train))
print(model.score(x_test, t_test))
0.5032870524389081
0.3102920436689621
Was die Punktzahl darstellt, ist der Entscheidungsfaktor, da dies ein Regressionsproblem ist. Wenn Sie einen Wert von 0 bis 1 annehmen, ist die Genauigkeit umso höher, je näher er an 1 liegt.
Wenn man sich diesmal die Punktzahl ansieht, ist die Genauigkeit nicht gut. Lassen Sie uns nun eine Vorverarbeitung durchführen, um die Genauigkeit zu verbessern. Schauen wir uns zunächst den Beitrag der einzelnen Parameter an.
#Variable Speicherung in absteigender Reihenfolge des Beitrags der Merkmalsmenge
feat_names = x_train.columns.values
importances = model.feature_importances_
indices = np.argsort(importances)[::-1]
plt.figure(figsize=(10, 10))
plt.title('Feature importances')
plt.barh(range(len(indices)), importances[indices])
plt.yticks(range(len(indices)), feat_names[indices], rotation='horizontal')
plt.show();
Ich möchte, dass Sie darüber nachdenken, was für eine Schätzung wichtig ist. Es scheint, dass have_photo den höchsten Beitrag leistet, dh das Vorhandensein oder Fehlen von Fotos ist groß. Die Videos scheinen nicht so wichtig zu sein, aber die Videos machen wahrscheinlich nicht einmal 3% der Gesamtzahl aus. Es scheint, dass die Tage fast irrelevant sind. Dies kann aus den Daten entfernt werden.
Wir werden auch Ausreißer betrachten.
#Visualisiere mit Grafik
plt.figure(figsize=(8, 6))
plt.scatter(range(x_train.shape[0]), np.sort(t_train.values))
plt.xlabel('index', fontsize=12)
plt.ylabel('y', fontsize=12)
plt.show()
Sie können sehen, dass einige der Trainingsdaten eindeutig nicht synchron sind. Ich werde diese Daten entfernen, da ich von diesen gezogen werden und lernen kann.
#Es ist die Umkehrung der Erklärungsreihenfolge, aber wenn Sie dies nicht in dieser Reihenfolge tun, können Sie nicht mit entfernten Ausreißern teilen
#Ausreißer entfernen
df_train = df_train[df_train['favorite_count'] < 4500]
df_train.shape
#Tag löschen
x_train = df_train.iloc[:,7:11]
t_train = df_train['favorite_count']
x_test = df_test.iloc[:,7:11]
t_test = df_test['favorite_count']
Jetzt lernen wir noch einmal und sehen die Partitur.
#Modell Bestätigung
print(model.score(x_train, t_train))
print(model.score(x_test, t_test))
0.5175871090277164
0.34112337762190204
Es ist besser als zuvor. Lassen Sie uns abschließend die Verteilung der tatsächlichen Anzahl von Likes und der geschätzten Anzahl von Likes in einem Histogramm betrachten.
Blau ist die geschätzte Anzahl und Orange ist die tatsächliche Anzahl von Likes. Es gibt sicherlich eine Lücke, aber ich kann nichts sagen, weil ich nicht jeden von ihnen gesehen habe.
Die Verbesserung der Genauigkeit wird auch als nächstes kommen.
Tipps zum Bestehen der Twitter-API-Registrierung in 30 Minuten (mit japanischer Übersetzung)
Holen Sie sich viele Tweets mit TwitterAPI. Berücksichtigen Sie serverseitige Fehler (in Python)
Recommended Posts