3

십자가 유효성 검사를 사용하여 혼란스러워하는 scikitlearn을 사용하여 회귀 모델을 평가하려면 cross_val_scorecross_val_predict 두 가지 기능 중 어느 것을 사용해야합니까? 하나의 옵션은 다음과 같습니다cross_val_score와 cross_val_predict의 차이

cvs = DecisionTreeRegressor(max_depth = depth) 
scores = cross_val_score(cvs, predictors, target, cv=cvfolds, scoring='r2') 
print("R2-Score: %0.2f (+/- %0.2f)" % (scores.mean(), scores.std() * 2)) 

다른 하나는, 표준 r2_score과 CV-예측을 사용하는 : 나는 두 가지 방법이 유효하다고 가정 및 비슷한 결과를 줄 것이다

cvp = DecisionTreeRegressor(max_depth = depth) 
predictions = cross_val_predict(cvp, predictors, target, cv=cvfolds) 
print ("CV R^2-Score: {}".format(r2_score(df[target], predictions_cv))) 

. 그러나 이것은 작은 k- 주름이있는 경우에만 해당됩니다. r^2는 10 배 - cv에 대해 대략 동일하지만 "cross_vall_score"를 사용하는 첫 번째 버전의 경우 더 높은 k 값에 대해 점점 더 낮아집니다. 두 번째 버전은 주름 수의 변화에 ​​거의 영향을받지 않습니다.

이 동작이 예상 되나 SKLearn의 이력서에 대한 이해가 부족합니까?

답변

4

cross_val_scorecross_val_predict이 테스트 폴드에 대한 예측 된 y 값을 반환하는 테스트 폴드의 점수를 반환합니다.

cross_val_score()의 경우 출력의 평균을 사용합니다. 출력의 평균은 폴드의 수에 영향을받습니다. 폴드가 높기 때문에 오류가 발생할 수 있습니다 (올바르게 맞지 않음).

반면에 cross_val_predict()은 입력의 각 요소에 대해 해당 요소가 테스트 세트에있을 때 얻은 예측을 반환합니다. [모든 요소를 ​​테스트 집합에 정확히 한 번 할당 할 수있는 교차 유효성 검사 전략 만 사용할 수 있습니다]. 따라서 폴드 수를 늘리면 테스트 요소에 대한 교육 데이터 만 증가하므로 결과에 많은 영향을 미치지 않을 수 있습니다.

희망이 도움이됩니다. 의심의 여지없이 자유롭게 질문하십시오.

편집 :

내가 cross_val_predict이 때문에 overfit 될 것이라고 생각 : 주석의 질문에 대답하는 것은

은 어떻게 cross_val_predict 작품에 다음과 같은 답을 찾아 보게하세요 폴드가 증가함에 따라 열차에 대한 데이터가 늘어나고 테스트에 대한 의욕이 떨어집니다. 결과 레이블은 교육 데이터에 더 의존합니다. 이미 위에서 언급했듯이 한 샘플에 대한 예측은 한 번만 수행되므로 데이터를 더 많이 분할 할 수 있습니다. 대부분의 장소 또는 자습서에서 분석을 위해 cross_val_score을 사용하는 것이 좋습니다.

+0

대단히 감사합니다. 하지만 아직 어떤 기능을 사용해야하는지 궁금합니다. 첫 번째는 자습서에서 가장 자주 찾는 예제로 보이지만 두 번째는 더 안정적이며 따라서 유용한 접근 방법 인 것으로 보입니다. 또는 cross_val_predict를 사용하여 평가 한 결과가 지나치게 적합하지 않습니까? – Bobipuegi

+0

@Bobipuegi 귀하의 질문에 대한 답변을 편집했습니다. –

+0

다시 한번 감사드립니다! – Bobipuegi