2017-08-08 2 views
4

vous pouvez accéder à l'ensemble de données sur ce lien https://drive.google.com/file/d/0B9Hd-26lI95ZeVU5cDY0ZU5MTWs/view?usp=sharingClassification des séries chronologiques

Ma tâche est de prédire le mouvement des prix d'un fonds sectoriel. Combien ça monte ou descend n'a pas vraiment d'importance, je veux seulement savoir si ça monte ou descend. Donc, je le définis comme un problème de classification.

Étant donné que cet ensemble de données est une série chronologique de données, j'ai rencontré de nombreux problèmes. J'ai lu des articles sur ces problèmes, comme je ne peux pas utiliser la validation croisée k-fold car il s'agit de données de séries chronologiques. Vous ne pouvez pas ignorer l'ordre des données.

mon code est le suivant:

import pandas as pd 
import numpy as np 
import matplotlib.pyplot as plt 
import datetime 
from sklearn.linear_model import LinearRegression 
from math import sqrt 
from sklearn.svm import LinearSVC 
from sklearn.svm import SVCenter code here 

lag1 = pd.read_csv(#local file path, parse_dates=['Date']) 

#Trend : if price going up: ture, otherwise false 
lag1['Trend'] = lag1.XLF > lag1.XLF.shift() 
train_size = round(len(lag1)*0.50) 
train = lag1[0:train_size] 
test = lag1[train_size:] 

variable_to_use= ['rGDP','interest_rate','private_auto_insurance','M2_money_supply','VXX'] 
y_train = train['Trend'] 
X_train = train[variable_to_use] 
y_test = test['Trend'] 
X_test = test[variable_to_use] 

#SVM Lag1 

this_C = 1.0 
clf = SVC(kernel = 'linear', C=this_C).fit(X_train, y_train) 
print('XLF Lag1 dataset') 
print('Accuracy of Linear SVC classifier on training set: {:.2f}' 
.format(clf.score(X_train, y_train))) 
print('Accuracy of Linear SVC classifier on test set: {:.2f}' 
.format(clf.score(X_test, y_test))) 

#Check prediction results 
clf.predict(X_test) 

Tout d'abord, est ma méthode ici: d'abord générer une colonne de vrai et faux? J'ai peur que la machine ne puisse pas comprendre cette colonne si je lui donne simplement cette colonne. Dois-je d'abord effectuer une régression puis comparer le résultat numérique pour générer une liste de monter ou descendre?

La précision sur l'ensemble d'entraînement est très faible à: 0.58 Je reçois un tableau avec toutes les trues avec clf.predict (X_test) dont je ne sais pas pourquoi j'obtiendrais tous les indices.

Et je ne sais pas si la précision qui en résulte est calculée de quelle façon: par exemple, je pense que ma précision actuelle ne compte que le nombre de vrai et de faux, mais en ignorant l'ordre de ceux-ci? Comme il s'agit de données de séries temporelles, ignorer l'ordre n'est pas correct et ne me donne aucune information sur la prévision du mouvement des prix. Disons que j'ai 40 exemples dans l'ensemble de test, et j'ai 20 Tures que j'aurais 50% de précision. Mais je suppose que les indices ne sont pas dans la bonne position telle qu'elle apparaît dans l'ensemble de vérité du terrain. (Dites-moi si je me trompe)

Je pense aussi utiliser Gradient Boosted Tree pour faire le classement, serait-ce mieux?

Répondre

0

Un prétraitement de ces données serait probablement utile. La première étape pourrait aller quelque chose comme:

df = pd.read_csv('YOURLOCALFILEPATH',header=0) 
#more code than your method but labels rows as 0 or 1 and easy to output to new file for later reference 
df['Date'] = pd.to_datetime(df['date'], unit='d') 
df = df.set_index('Date') 
df['compare'] = df['XLF'].shift(-1) 
df['Label'] np.where(df['XLF']>df['compare'), 1, 0) 
df.drop('compare', axis=1, inplace=True) 

La deuxième étape peut utiliser l'un des built in scalers, such as the MinMax scaler de sklearn, pour prétraiter les données par mise à l'échelle de vos entrées de fonction avant de le nourrir dans votre modèle.

+0

Pouvez-vous ajouter un exemple de code? –