[RUBY] Prédire le sexe des utilisateurs de Twitter grâce à l'apprentissage automatique

J'avais des données pour 20 000 utilisateurs de Twitter étiquetés avec le sexe, j'ai donc utilisé ces données pour prédire le sexe des utilisateurs de Twitter. Ruby est utilisé pour le traitement de texte et Python est utilisé pour l'apprentissage automatique.

Conclusion d'abord

La prédiction du sexe par simple apprentissage automatique utilisant le profil de Twitter n'était précise qu'à environ 60%.

Les données utilisées cette fois sont dans une langue étrangère, et le résultat sera différent du profil en japonais, mais la précision ne semble pas aussi bien. La raison pour laquelle je pense que c'est parce qu'il est difficile pour les gens de déterminer le sexe des données des utilisateurs de Twitter en premier lieu.

Procédure de détermination du sexe des utilisateurs Twitter

Ruby est utilisé pour les étapes 1 à 5 et Python pour les étapes 6.

  1. Listez les mots de votre profil
  2. Enregistrez le nombre d'occurrences de chaque mot
  3. Éliminez les mots qui apparaissent extrêmement rarement ou trop souvent
  4. Représenter le profil de l'utilisateur sous forme de vecteur en considérant le nombre de mots comme le nombre de dimensions
  5. Créez une étiquette pour les données de réponse correctes
  6. Appliquer l'apprentissage automatique

Pré-traiter du texte dans Ruby

Le code Ruby qui exécute les étapes 1 à 5 ci-dessus est le suivant. Avec une méthode comme celle-ci, les performances dépendent grandement de cette partie de traitement de texte. Il existe d'innombrables façons de le faire, et ce code fait un traitement de texte vraiment minimal.

# https://www.kaggle.com/crowdflower/twitter-user-gender-classification
def parse_kaggle_data
  str = File.read('gender-classifier-DFE-791531.csv', encoding: 'ISO-8859-1:UTF-8')
  lines = str.split("\r").map { |l| l.split(',') }
  header = lines[0]
  users = lines.drop(1).map { |l| header.map.with_index { |h, i| [h, l[i]] }.to_h }
  users = users.select { |u| %w(female male).include?(u['gender']) && u['gender:confidence'] == '1' }
  [users.map { |u| u['description'] }, users.map { |u| u['gender'] }]
end

def split_to_words(text_array)
  text_array.map { |d| d.split(/([\s"]|__REP__)/) }.flatten.
      map { |w| w.gsub(/^#/, '') }.
      map { |w| w.gsub(/[^.]\.+$/, '') }.
      map { |w| w.gsub(/[^!]!+$/, '') }.
      map { |w| w.gsub(/^\(/, '') }.
      map { |w| w.gsub(/^\)/, '') }.
      delete_if { |w| w.length < 2 }.
      map(&:downcase).sort.uniq
end

def count_words(text_array, word_array)
  words_count = Hash.new(0)
  text_array.each do |d|
    word_array.each do |w|
      if d.include?(w)
        words_count[w] += 1
      end
    end
  end
  words_count
end

descriptions, genders = parse_kaggle_data

desc_words = split_to_words(descriptions)
desc_words_count = count_words(descriptions, desc_words)
filtered_desc_words = desc_words.select { |w| desc_words_count[w] > 2 && desc_words_count[w] < 500 }
desc_vectors = descriptions.map { |d| filtered_desc_words.map { |w| d.include?(w) ? 1 : 0 } }
File.write('data/description_vectors.txt', desc_vectors.map { |v| v.join(' ') }.join("\n"))

labels = genders.map do |g|
  case g
  when '';        0
  when 'brand';   1
  when 'female';  2
  when 'male';    3
  when 'unknown'; 4
  end
end
File.write('data/labels.txt', labels.join("\n"))

Apprentissage automatique avec Python

J'ai essayé Naive Bayes, la régression logistique, la forêt aléatoire et les machines vectorielles de support, tous avec des résultats similaires.

Méthode précision
Naive Bayes (distribution normale) 0.5493
Baies naïves (Bernouy) 0.6367
Retour logistique 0.6151
Forêt aléatoire 0.6339
Machine de vecteur de soutien 0.6303

Il est à noter que chaque méthode a une hypothèse implicite sur les données d'origine, mais cette fois elle n'est pas prise en considération et les résultats sont simplement comparés.

# sudo yum install -y python3
# sudo pip3 install -U pip numpy sklearn ipython

import numpy as np
from sklearn.naive_bayes import GaussianNB
from sklearn.naive_bayes import BernoulliNB
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
from sklearn.svm import SVC
from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report, accuracy_score
from sklearn.metrics import confusion_matrix
import pickle

description_vectors = np.loadtxt('data/description_vectors.txt')
labels = np.loadtxt('data/labels.txt')

(x_train, x_test, y_train, y_test) = train_test_split(description_vectors, labels)

clf = GaussianNB().fit(x_train, y_train)
clf = BernoulliNB().fit(x_train, y_train)
clf = LogisticRegression().fit(x_train, y_train)
clf = RandomForestClassifier().fit(x_train, y_train)
clf = SVC(C = 1.0).fit(x_train, y_train)

y_pred = clf.predict(x_test)
np.mean(y_test == y_pred)

# Grid search

# best params: {'C': 1.0, 'gamma': 'scale', 'kernel': 'rbf'}
parameters = [{'kernel': ['linear', 'rbf', 'poly', 'sigmoid'], 'C': np.logspace(-2, 2, 5), 'gamma': ['scale']}]
clf = GridSearchCV(SVC(), parameters, verbose = True, n_jobs = -1)
clf.fit(x_train, y_train)

# best params: {'max_depth': 100, 'n_estimators': 300}
parameters = [{'n_estimators': [30, 50, 100, 300], 'max_depth': [25, 30, 40, 50, 100]}]
clf = GridSearchCV(RandomForestClassifier(), parameters, verbose = True, n_jobs = -1)
clf.fit(x_train, y_train)

print(clf.best_params_)
print(clf.best_score_)
print(clf.best_estimator_)

print(classification_report(y_test, y_pred))
print(accuracy_score(y_test, y_pred))
print(confusion_matrix(y_test, y_pred))

# Model persistence

pickle.dump(clf, open('model.sav', 'wb'))
clf = pickle.load(open('model.sav', 'rb'))

Liens connexes

Twitter User Gender Classification | Kaggle Using machine learning to predict gender

Recommended Posts

Prédire le sexe des utilisateurs de Twitter grâce à l'apprentissage automatique
Résumé du flux de base de l'apprentissage automatique avec Python
Bilan du premier défi du machine learning avec Keras
Prédire la présence ou l'absence d'infidélité par l'apprentissage automatique
Une histoire coincée avec l'installation de la bibliothèque de machine learning JAX
[Apprentissage automatique] Vérifiez les performances du classificateur à l'aide de données de caractères manuscrites
L'histoire de l'apprentissage profond avec TPU
À propos du contenu de développement de l'apprentissage automatique (exemple)
Prédisez le deuxième tour de l'été 2016 avec scikit-learn
J'ai essayé de prédire la présence ou l'absence de neige par apprentissage automatique.
Alignez le nombre d'échantillons entre les classes de données pour l'apprentissage automatique avec Python
L'histoire du partage de l'environnement pyenv avec plusieurs utilisateurs
Impressions d'avoir obtenu le nano-diplôme Udacity Machine Learning Engineer
Essayez de prédire le taux de change (FX) avec un apprentissage automatique non approfondi
À propos des tests dans la mise en œuvre de modèles d'apprentissage automatique
Prédire le nombre de personnes infectées par COVID-19 avec Prophet
Prédire le temps objectif d'un marathon complet avec l'apprentissage automatique-③: j'ai essayé de visualiser les données avec Python-
La première étape de l'apprentissage automatique ~ Pour ceux qui veulent essayer l'implémentation avec python ~
L'apprentissage automatique appris avec Pokemon
Bases de l'apprentissage automatique (mémoire)
Apprentissage automatique avec Python! Préparation
Démineur d'apprentissage automatique avec PyTorch
Importance des ensembles de données d'apprentissage automatique
Commencer avec l'apprentissage automatique Python
Essayez le machine learning à la légère avec Kaggle
Essayez d'évaluer les performances du modèle d'apprentissage automatique / de régression
Le résultat de l'apprentissage automatique des ingénieurs Java avec Python www
Enquête sur l'utilisation du machine learning dans les services réels
Essayez d'évaluer les performances du modèle d'apprentissage automatique / de classification
Comment augmenter le nombre d'images de jeux de données d'apprentissage automatique
[Apprentissage automatique] J'ai essayé de résumer la théorie d'Adaboost
J'ai créé une API avec Docker qui renvoie la valeur prédite du modèle d'apprentissage automatique
Importance de l'apprentissage automatique et de l'apprentissage par mini-lots
J'ai essayé de créer Othello AI avec tensorflow sans comprendre la théorie de l'apprentissage automatique ~ Introduction ~
J'ai essayé l'apprentissage automatique avec liblinear
Apprentissage automatique par python (1) Classification générale
Apprentissage automatique ③ Résumé de l'arbre de décision
Explorez le labyrinthe avec l'apprentissage augmenté
SVM essayant l'apprentissage automatique avec scikit-learn
Comment utiliser l'apprentissage automatique pour le travail? 01_ Comprendre l'objectif de l'apprentissage automatique
[Introduction au style GAN] Apprentissage unique de l'animation avec votre propre machine ♬
J'ai vérifié l'image de l'Université des sciences sur Twitter avec Word2Vec.
Gestion des modèles d'apprentissage automatique pour éviter de se quereller avec le côté commercial
Machine learning d'inspiration quantique avec des réseaux de tenseurs
Validez le modèle d'entraînement avec Pylearn2
Démarrez avec l'apprentissage automatique avec SageMaker
Essayez de prédire le triplet de la course de bateaux en classant l'apprentissage
Mémo d'apprentissage "Scraping & Machine Learning avec Python"
Pour vous qui regardez soudainement le journal tout en apprenant avec l'apprentissage automatique ~ Entraînement musculaire avec LightGBM ~
J'ai essayé de créer Othello AI avec tensorflow sans comprendre la théorie de l'apprentissage automatique ~ Implémentation ~
Ingénierie des fonctionnalités pour l'apprentissage automatique à partir de la partie 1 Google Colaboratory - Validation et discrimination des données de comptage
J'ai essayé de créer Othello AI avec tensorflow sans comprendre la théorie de l'apprentissage automatique ~ Battle Edition ~
Essayez de prédire la valeur de la jauge de niveau d'eau par apprentissage automatique en utilisant les données ouvertes de Data City Sabae
J'ai essayé d'appeler l'API de prédiction du modèle d'apprentissage automatique de WordPress
API REST du modèle réalisé avec Python avec Watson Machine Learning (édition CP4D)
[Introduction à l'apprentissage automatique] Jusqu'à ce que vous exécutiez l'exemple de code avec chainer
Code source pour la séparation des sources sonores (série de pratiques d'apprentissage automatique) appris avec Python
J'ai fait GAN avec Keras, donc j'ai fait une vidéo du processus d'apprentissage.