2017-08-08 24 views
4

このリンクのデータセットにアクセスできますhttps://drive.google.com/file/d/0B9Hd-26lI95ZeVU5cDY0ZU5MTWs/view?usp=sharing時系列分類

私の仕事はセクターファンドの価格の動きを予測することです。それがどれほど上がるか下がるかは本当に問題ではありません。私はそれが上がっているのか下っているのかを知りたいだけです。だから私はそれを分類問題として定義します。

このデータセットは時系列データなので、多くの問題を抱えていました。これは時系列データなので、私はk倍のクロスバリデーションを使用できないような問題について記事を読んでいます。データの順序は無視できません。次のように

私のコードは次のとおりです。すべての

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) 

まず、右ここに私の方法であって、最初の真の列を生成し、偽?私は単にこの列をそれに供給すれば、機械がこの列を理解できないのではないかと思います。最初に回帰を実行して、数値結果を比較して上または下のリストを生成する必要がありますか?

トレーニングセットの精度は非常に低いです:0.58私はclf.predict(X_test)ですべてのtruesを持つ配列を取得していますが、なぜ私はすべてのtruesを取得するのかわかりません。

結果の精度がどのように計算されるかわからない:たとえば、私の現在の正確さは、真と偽の数を数えるだけで、それらの順序は無視していると思う?これは時系列データなので、注文を無視することは正しくなく、価格の動きを予測する情報はありません。テストセットに40の例があり、20のTuresが得られた場合、50%の精度が得られるとしましょう。しかし、私は、真実は、地位の真実に現れているように正しい位置にないと思う。 (私が間違っているかどうか教えてください)

また、Gradient Boosted Treeを使って分類するのもいいでしょうか?

答えて

0

このデータのいくつかの前処理がおそらく役に立ちます。お使いのモデルにそれを供給する前に、あなたの機能の入力をスケーリングすることで前処理し、データをsklearnのbuilt in scalers, such as the MinMax scalerのいずれかを使用することができます

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) 

ステップ2:1のような何かを行くかもしれないステップ。

+0

サンプルコードを追加できますか? –