[PYTHON] J'ai essayé SIGNATE "[Question pratique] Prédire le nombre d'utilisateurs de vélos de location"

introduction

Cette fois, nous avons travaillé sur la "[Question pratique] Prédiction des utilisateurs de vélos de location" de SIGNATE. En ce qui concerne l'apprentissage automatique, je n'ai pas encore pu faire grand-chose, mais j'espère grandir petit à petit grâce aux compétitions.

Contenu du concours

J'ai travaillé sur les exercices suivants.

** [Question pratique] Prédiction du nombre d'utilisateurs de vélos de location **

Créez ce modèle qui prédit le nombre d'utilisateurs de vélos de location par heure et par jour à partir des informations saisonnières et météo pendant 2 ans

Code réel

1. Lire les données

#Importer la bibliothèque
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
#Lecture / affichage de fichiers
train = pd.read_csv('train.tsv',sep='\t')
test  = pd.read_csv('test.tsv',sep='\t')
train.head()

data1.png

2. Comprendre le contenu des données

#Essayez de tracer l'utilisation
plt.figure(figsize=(12,5))
plt.plot(train['id'],train['cnt'])

graph1.png

#Tracez l'état d'utilisation pendant une semaine donnée à titre d'essai
# 1.Stocké dans une variable pour chaque date
_day0703 = train.query('dteday == "2011-07-03"')#journée
_day0704 = train.query('dteday == "2011-07-04"')#Mois
_day0705 = train.query('dteday == "2011-07-05"')#Feu
_day0706 = train.query('dteday == "2011-07-06"')#eau
_day0707 = train.query('dteday == "2011-07-07"')#bois
_day0708 = train.query('dteday == "2011-07-08"')#Argent
_day0709 = train.query('dteday == "2011-07-09"')#sol
# 2.Affichage graphique de chaque date
plt.figure(figsize=(12,5))
plt.plot(_day0703['hr'],_day0703['cnt'],label='Sun')
plt.plot(_day0704['hr'],_day0704['cnt'],label='Mon')
plt.plot(_day0705['hr'],_day0705['cnt'],label='Tue')
plt.plot(_day0706['hr'],_day0706['cnt'],label='Wed')
plt.plot(_day0707['hr'],_day0707['cnt'],label='Thu')
plt.plot(_day0708['hr'],_day0708['cnt'],label='Fri')
plt.plot(_day0709['hr'],_day0709['cnt'],label='Sat')
plt.legend()
plt.grid()

graph2.png

・ Il semble que l'état d'utilisation diffère entre les jours fériés et les jours de la semaine. ・ En semaine, il est souvent utilisé de 6 h à 10 h et de 16 h à 21 h, il semble donc être utilisé pour se rendre au travail ou à l'école.

Étant donné que l'état d'utilisation change en fonction du jour férié et de l'heure de la journée, j'ai pensé que la régression linéaire n'était pas appropriée et j'ai choisi XGBoost.

3. Apprendre avec XGBoost

#Importation de bibliothèques XGBoost
import xgboost as xgb
from sklearn.model_selection import GridSearchCV
from sklearn.metrics import mean_squared_error
#Créer un modèle xgboost
reg = xgb.XGBRegressor()
#Avant id2500, la tendance est différente, donc coupez(Début de l'opération, etc.?)
train = train[train['id'] > 2500]
#Stocker les variables explicatives et les variables objectives
X_train = train.drop(['id','dteday','cnt'], axis=1)
y_train = train['cnt']
X_test = test.drop(['id','dteday'], axis=1)
#Recherche d'hyper paramètres
reg_cv = GridSearchCV(reg, {'max_depth': [2,4,6], 'n_estimators': [50,100,200]}, verbose=1)
reg_cv.fit(X_train, y_train)
print(reg_cv.best_params_, reg_cv.best_score_)
#Apprenez à nouveau avec des paramètres optimaux
reg = xgb.XGBRegressor(**reg_cv.best_params_)
reg.fit(X_train, y_train)

4. Vérifiez le modèle

#Prédire à l'aide des données d'entraînement
pred_train = reg.predict(X_train)
#Vérifiez si la valeur prédite est valide
train_value = y_train.values
_df = pd.DataFrame({'actual':train_value,'pred':pred_train})
_df.plot(figsize=(12,5))

graph3.png

En général, il semble que vous puissiez prédire correctement.

5. Confirmez l'importance du montant de la fonction d'évaluation

#Tracé de l'importance des caractéristiques
importances = pd.Series(reg.feature_importances_, index = X_train.columns)
importances = importances.sort_values()
importances.plot(kind = "barh")
plt.title("imporance in the xgboost Model")
plt.show()

graph4.png

6. Créer un fichier de soumission

#Calcul de la valeur prévue pour les données de test
pred_test = reg.predict(X_test)
#Collez le résultat et sortez le fichier
sample = pd.read_csv("sample_submit.csv",header=None)
sample[1] = pred_test
sample.to_csv("submit01.csv",index=None,header=None)

Sommaire des résultats

Il était 29e sur 209 personnes. Cette fois, je l'ai simplement mis dans XGBoost, il semble donc y avoir de la place pour d'autres idées telles que la création de fonctionnalités, un autre modèle d'apprentissage et l'apprentissage d'ensemble. J'aimerais réessayer, donc j'aimerais à nouveau écrire un article à ce moment-là.

Recommended Posts

J'ai essayé SIGNATE "[Question pratique] Prédire le nombre d'utilisateurs de vélos de location"
J'ai essayé le serveur asynchrone de Django 3.0
J'ai essayé d'estimer la similitude de l'intention de la question en utilisant Doc2Vec de gensim
(Python) J'ai essayé d'analyser 1 million de mains ~ J'ai essayé d'estimer le nombre d'AA ~
J'ai essayé l'histoire courante de prédire la moyenne Nikkei à l'aide du Deep Learning (backtest)
J'ai essayé la fonction de tableau croisé dynamique des pandas
J'ai essayé de corriger la forme trapézoïdale de l'image
J'ai essayé d'utiliser le filtre d'image d'OpenCV
J'ai essayé de vectoriser les paroles de Hinatazaka 46!
Python pratique 100 coups J'ai essayé de visualiser l'arbre de décision du chapitre 5 en utilisant graphviz
J'ai essayé de résumer la forme de base de GPLVM
J'ai essayé le tutoriel MNIST de tensorflow pour les débutants.
J'ai essayé d'utiliser l'API de Sakenowa Data Project
J'ai essayé de visualiser les informations spacha de VTuber
J'ai essayé d'effacer la partie négative de Meros
J'ai essayé de gratter la publicité du site de dessin animé piraté
J'ai essayé d'augmenter ou de diminuer le nombre en programmant
J'ai essayé la méthode la plus simple de classification de documents multi-étiquettes
J'ai essayé de classer les voix des acteurs de la voix
J'ai essayé d'exécuter l'exemple de code du module Ansible
J'ai essayé de résumer les opérations de chaîne de Python
J'ai essayé de classer le nombre de décès par habitant de COVID-19 (nouveau virus corona) par pays
J'ai essayé de trouver la tendance du nombre de navires dans la baie de Tokyo à partir d'images satellites.
J'ai essayé de trouver l'entropie de l'image avec python
[Courses de chevaux] J'ai essayé de quantifier la force du cheval de course
J'ai essayé d'obtenir les informations de localisation du bus Odakyu
J'ai essayé de trouver la moyenne de plusieurs colonnes avec TensorFlow
J'ai essayé de refactoriser le modèle CNN de TensorFlow en utilisant TF-Slim
J'ai essayé la reconnaissance faciale du problème du rire en utilisant Keras.
J'ai essayé l'analyse morphologique du commentaire général du putain de jeu de l'année
[Python] J'ai essayé de visualiser la relation de suivi de Twitter
J'ai essayé un peu le comportement de la fonction zip
[Apprentissage automatique] J'ai essayé de résumer la théorie d'Adaboost
[Python] J'ai essayé de collecter des données en utilisant l'API de wikipedia
J'ai essayé de combattre le minimum local de la fonction Goldstein-Price
J'ai affiché le chat de YouTube Live et essayé de jouer
J'ai essayé de prédire le nombre de personnes infectées au niveau national de la nouvelle corona avec un modèle mathématique
J'ai essayé de résoudre la première question de l'examen d'entrée en mathématiques 2019 de l'Université de Tokyo avec python sympy
J'ai essayé de trier les objets de l'image du plat de steak-② Tri des numéros de chevauchement
J'ai essayé d'adapter la fonction exponentielle et la fonction logistique au nombre de patients positifs au COVID-19 à Tokyo
10. Compter le nombre de lignes
Obtenez le nombre de chiffres
J'ai essayé la bibliothèque changefinder!
Calculez le nombre de changements
J'ai essayé de gratter le classement du calendrier de l'avent Qiita avec Python
[Linux] J'ai essayé de résumer les commandes de confirmation des ressources
J'ai essayé d'obtenir l'index de la liste en utilisant la fonction énumérer
J'ai essayé d'automatiser l'arrosage du pot avec Raspberry Pi
J'ai essayé de créer l'image de démarrage SD de LicheePi Nano
J'ai regardé les méta-informations de BigQuery et essayé de les utiliser
J'ai étudié la méthode X-means qui estime automatiquement le nombre de clusters
J'ai essayé d'agrandir la taille du volume logique avec LVM
J'ai essayé d'exécuter la partie DNN d'OpenPose avec le processeur Chainer
J'ai essayé de résumer la méthode de mise en œuvre fréquemment utilisée de pytest-mock
J'ai essayé d'améliorer l'efficacité du travail quotidien avec Python