La régression avec variable de Date à l'aide de Scikit-learn
J'ai une Pandas DataFrame avec un date
colonne (par exemple: 2013-04-01
) de dtype datetime.date
. Quand j'ai inclure cette colonne dans X_train
et essayer d'adapter le modèle de régression, j'obtiens l'erreur float() argument must be a string or a number
. Retrait de la date
colonne d'éviter cette erreur.
Quelle est la bonne façon de prendre la date
en compte dans le modèle de régression?
Code
data = sql.read_frame(...)
X_train = data.drop('y', axis=1)
y_train = data.y
rf = RandomForestRegressor().fit(X_train, y_train)
Erreur
TypeError Traceback (most recent call last)
<ipython-input-35-8bf6fc450402> in <module>()
----> 2 rf = RandomForestRegressor().fit(X_train, y_train)
C:\Python27\lib\site-packages\sklearn\ensemble\forest.pyc in fit(self, X, y, sample_weight)
292 X.ndim != 2 or
293 not X.flags.fortran):
--> 294 X = array2d(X, dtype=DTYPE, order="F")
295
296 n_samples, self.n_features_ = X.shape
C:\Python27\lib\site-packages\sklearn\utils\validation.pyc in array2d(X, dtype, order, copy)
78 raise TypeError('A sparse matrix was passed, but dense data '
79 'is required. Use X.toarray() to convert to dense.')
---> 80 X_2d = np.asarray(np.atleast_2d(X), dtype=dtype, order=order)
81 _assert_all_finite(X_2d)
82 if X is X_2d and copy:
C:\Python27\lib\site-packages\numpy\core\numeric.pyc in asarray(a, dtype, order)
318
319 """
--> 320 return array(a, dtype, copy=False, order=order)
321
322 def asanyarray(a, dtype=None, order=None):
TypeError: float() argument must be a string or a number
OriginalL'auteur Nyxynyx | 2013-05-09
Vous devez vous connecter pour publier un commentaire.
Le meilleur moyen est de faire exploser la date dans un ensemble de catégories caractéristiques codées dans boolean formulaire à l'aide de la 1-de-K encodage (par exemple, comme le fait par DictVectorizer). Voici quelques caractéristiques qui peuvent être extraites à partir d'une date:
...
Qui devrait permettre d'identifier les dépendances linéaires sur des événements périodiques sur typique de l'homme des cycles de vie.
En outre, vous pouvez également extraire de la date d'un seul flotteur: convertir chaque jour que le nombre de jours depuis le min date de votre formation et de diviser par la différence du nombre de jours entre la max la date et le nombre de jours de la min date. Que le numérique doit permettre d'identifier les tendances à long terme entre la sortie de la date de l'événement: par exemple, une pente linéaire dans un problème de régression afin de mieux prédire l'évolution vient prochaines années, qui ne peut pas être codé avec le booléen variable catégorique pour l'année de fonctionnalité.
Votre réponse est très bonne. Mais, je pense que dans certains cas, il est important de maintenir l'ordre, par exemple: l'ordre des jours, ou des jours de la semaine. Je pense que cela dépend du problème et d'essayer différentes façons.
OriginalL'auteur ogrisel
Vous avez deux options. Vous pouvez convertir la date en un nombre c'est à dire un entier représentant le nombre de jours depuis l'an 1 jour 1. Vous pouvez le faire par un
datetime.date
'stoordinal
fonction.Vous pouvez également mettre les dates dans les variables catégorielles à l'aide de sklearn de OneHotEncoder. Ce qu'il fait est de créer une nouvelle variable pour chaque date. Ainsi, au lieu de quelque chose comme de la colonne
date
avec des valeurs['2013-04-01', '2013-05-01']
, vous avez deux colonnes,date_2013_04_01
avec des valeurs[1, 0]
etdate_2013_05_01
avec des valeurs[0, 1]
.Je vous conseille d'utiliser le
toordinal
approche si vous avez plusieurs dates différentes, et l'un codeur à chaud si le nombre de différentes dates est petit (disons jusqu'à 10 - 100, selon la taille de vos données et ce genre de relation, la date a avec la variable de sortie).OriginalL'auteur Ando Saabas
Avant de faire boolean d'encodage en utilisant le 1-de-K encodage suggéré par @ogrisel, vous pouvez essayer de l'enrichir de vos données et de jouer avec le nombre de fonctions que vous pouvez extraire à partir de la date-type, c'est à dire le jour de la semaine, jour du mois, jour de l'année, de la semaine de l'année, le trimestre, etc.
Voir, par exemple, https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DatetimeIndex.weekofyear.html et des liens vers d'autres fonctions.
OriginalL'auteur Danylo Zherebetskyy