2017-07-21 9 views
0

私はsklearnのKNearestNeighborsを使って学習を行っています。 データセットを30,000回の観測データセット( )からトレーニング(70%)とテスト(30%)に分割しました。しかし、私は を理解することができませんなぜ同じモデルを評価する2つの方法は、そのような異なる結果をもたらすでしょう。sklearnからのcross_validationの予期しない結果

より具体的には、テストセットのr^2値を一度に取得すると、 テストセットでkFoldクロス検証 を実行した場合よりもかなり高いスコア(〜0.70)が得られます。正確な 同じモデルがまったく同じデータでテストされている場合、これらのスコアは大きく異なるのはなぜですか?私は 何か間違っていると確信していますが、私は何の手掛かりがありません。助けてください!

r2_scorer = make_scorer(r2_score) 

clf = neighbors.KNeighborsRegressor() 
clf = clf.fit(X_train,y_train) 
score1 = r2_score(y_test,clf.predict(X_test)) 

> 0.68777300248206585 

kfold = model_selection.KFold(n_splits=10, random_state=42) 
scores2 = cross_val_score(clf,X_test,y_test,cv = kfold, scoring = r2_scorer) 

scores2 
>array([ 0.05111285, 0.65697228, 0.57468009, 0.6706573 , 0.46720042, 
     0.3763054 , 0.56881947, 0.32569462, -0.16607888, -0.6862521 ]) 

scores2.mean() 
> 0.28391114469744039 

scores2.std() 
> 0.4118551721575503 
+0

クロスバリデーションは同じモデルを使用しないため、検証のために新しいモデルを作成しています。 – jacoblaw

+0

ああ、私は最終的に私のエラーを参照してください。ありがとうございました – ata

+0

@ata私はツアー結果を説明し、あなたの主要な質問に答える答えを掲示しました – sera

答えて

0

あなたは相互検証機能を使用する場合:

scores2 = cross_val_score(clf,X_test,y_test,cv = kfold, scoring = r2_scorer) 

をあなたは10倍を生成し、それぞれについて、あなたはR2のスコアを取得折ります。

ので結果:あなたは10個の値を含める

scores2 
>array([ 0.05111285, 0.65697228, 0.57468009, 0.6706573 , 0.46720042, 
     0.3763054 , 0.56881947, 0.32569462, -0.16607888, -0.6862521 ]) 

を見ることができるように。各値は各折り目に対応します。

ボトムライン:

データの分割はまったく同じ各折り目のためではないので、それぞれ倍に異なるR2のスコアを取得するために、通常です。