1

Skrixのバージョン0.18.1でTimeSeriesSplitのクロスバリデーション戦略をLogisticRegressionエスティメータで使用しようとしています。私はそれを示すエラーを取得:Sklearn TimeSeriesSplit cross_val_predictはパーティションにのみ有効

from sklearn import linear_model, neighbors 
from sklearn.model_selection import train_test_split, cross_val_predict, TimeSeriesSplit, KFold, cross_val_score 
import pandas as pd 
import numpy as np 
from datetime import date, datetime 

df = pd.DataFrame(data=np.random.randint(0,10,(100,5)), index=pd.date_range(start=date.today(), periods=100), columns='x1 x2 x3 x4 y'.split()) 


X, y = df['x1 x2 x3 x4'.split()], df['y'] 
score = cross_val_score(linear_model.LogisticRegression(fit_intercept=True), X, y, cv=TimeSeriesSplit(n_splits=2)) 
y_hat = cross_val_predict(linear_model.LogisticRegression(fit_intercept=True), X, y, cv=TimeSeriesSplit(n_splits=2), method='predict_proba') 

私が間違って何をやっている:

cross_val_predictだけで再現する方法を示していたパーティション

次のコードスニペットのために働きますか?

答えて

5

cv引数をcross_val_scoreに渡すにはいくつかの方法があります。ここでは、分割のためにジェネレータを渡す必要があります。例えば、

y = range(14) 
cv = TimeSeriesSplit(n_splits=2).split(y) 

はジェネレータを与える。これを使用してCVトレインとテストインデックス配列を生成することができます。最初は次のようになります。

print cv.next() 
    (array([0, 1, 2, 3, 4, 5, 6, 7]), array([ 8, 9, 10, 11, 12, 13])) 

splitの入力としてデータフレームを取り込むこともできます。

df = pd.DataFrame(data=np.random.randint(0,10,(100,5)), 
        index=pd.date_range(start=date.today(), 
        periods=100), columns='x1 x2 x3 x4 y'.split()) 

cv = TimeSeriesSplit(n_splits=2).split(df) 
print cv.next() 
    (array([ 0, 1, 2, ..., 31, 32, 33]), array([34, 35, 36, ..., 64, 65, 66])) 

あなたのケースでは、この作業をする必要があります:

score = cross_val_score(linear_model.LogisticRegression(fit_intercept=True), 
         X, y, cv=TimeSeriesSplit(n_splits=2).split(df)) 

は詳細については cross_val_scoreTimeSeriesSplitを見てください。

+0

ここでは、 'range(14)'に '14 'とは何ですか?それは任意の数字ですか?データフレーム値と同じです。あなたがこれらの価値観にどのようになったのか、私にはそれほど明確ではありません。 – keithhackbarth

+0

14は恣意的で - 例として - 例です。データフレームについて:質問を見て、私はそれをコピーしました。 – glao

関連する問題