2016-06-10 9 views
3

가 재현 예는 토론을 해결하기 :cv_values_는 sklearn.linear :: RidgeCV에서 어떻게 계산됩니까?

from sklearn.linear_model import RidgeCV 
from sklearn.datasets import load_boston 
from sklearn.preprocessing import scale 

boston = scale(load_boston().data) 
target = load_boston().target 

import numpy as np 
alphas = np.linspace(1.0,200.0, 5) 
fit0 = RidgeCV(alphas=alphas, store_cv_values = True, gcv_mode='eigen').fit(boston, target) 
fit0.alpha_ 
fit0.cv_values_[:,0] 

질문 : fit0.cv_values_을 계산하는 데 사용됩니다 어떤 공식을?

편집 :

@Abhinav 아 로라 아래 답변에 보인다는 fit0.cv_values_[:,0][0]fit0.cv_values_[:,0]의 첫 번째 항목이 데이터에 장착 fit1 알파 = 1.0 능선 회귀이다

(fit1.predict(boston[0,].reshape(1, -1)) - target[0])**2 

될 것이라고 제안 - 관측치 0이 삭제 된 세트.

보자 :

1)를 제거한 원래 데이터 세트의 첫 번째 행의 새로운 집합을 생성 :

from sklearn.linear_model import Ridge 
boston1 = np.delete(boston, (0), axis=0) 
target1 = np.delete(target, (0), axis=0) 

2)이 절단 된 데이터 세트에 알파 = 1.0 릿지 모형을 적합 :

fit1 = Ridge(alpha=1.0).fit(boston1, target1) 

3) 첫 번째 데이터 지점에서 해당 모델의 MSE를 확인하십시오.

(fit1.predict(boston[0,].reshape(1, -1)) - target[0])**2 

이 무엇을 fit0.cv_values_[:,0], ERGO에 의해 생산되는 것과 동일하지 않습니다 array([ 37.64650853])입니다 : 무엇 제공 37.495629960571137

fit0.cv_values_[:,0][0] 

입니다

하는? Sklearn 문서에서 인용

+1

일반적인 교차 유효성 검사와 약간 다른 일반 유효성 검사와 관련이 있다고 생각합니다. 비용 함수는 여전히 동일하지만 서로 다른 점을 다르게 계산합니다. 나를 더 자세히 살펴보고 내 대답을 업데이트 해주세요. –

답변

3

: 각 알파에 대한

교차 검증 값 (store_cv_values ​​= TRUE 및 이력서 = 없음 경우). fit()이 호출 된 후이 속성에는 평균 제곱 오류 (기본값) 또는 {loss, score} _func 함수의 값 (생성자에서 제공되는 경우)이 포함됩니다. 생성자의 모든 득점 기능을 제공하지 또한 생성자에서 cv 인수에 대해 아무것도 제공하지 않았으므로

는 평균을 저장해야이 속성은 교차 검증을 생략-하나를 사용하여 각 샘플에 대한 오류 제곱. 평균 제곱 오차는 화학식 (캡 포함) Y가 회귀 다른 Y의 예측이 실제 값이다

Mean Squared Error

이다.

귀하의 경우, 상호 유효성 검사에서 나가기를 수행하고 있습니다. 따라서 모든 폴드에서 1 개의 테스트 포인트가 있으므로 n = 1이됩니다. 따라서 fit0.cv_values_[:,0]을 수행하면 테스트 데이터의 일부인 제트 오차가 제트 오차 범위에 포함됩니다. 알파 값이 1.0 일 때

희망이 있습니다.맞게

+0

댓글이 너무 길어서 여기에 적합하지 않습니다. 편집 된 답변 – user189035

2

Let's look - it's open source after all

제 호는 부모 _BaseRidgeCV (즉 구현 라인 997)에 위쪽으로 호출한다. 상호 유효성 확인 생성 프로그램을 제공하지 않았으므로 _RidgeGCV.fit을 위로 호출합니다. 이 함수의 문서에는 많은 수학 함수가 있지만 소스에 너무 가깝기 때문에 여러분이 가서 읽을 수있게 해줄 것입니다.

여기에 실제 소스

v, Q, QT_y = _pre_compute(X, y) 
    n_y = 1 if len(y.shape) == 1 else y.shape[1] 
    cv_values = np.zeros((n_samples * n_y, len(self.alphas))) 
    C = [] 

    scorer = check_scoring(self, scoring=self.scoring, allow_none=True) 
    error = scorer is None 

    for i, alpha in enumerate(self.alphas): 
     weighted_alpha = (sample_weight * alpha 
          if sample_weight is not None 
          else alpha) 
     if error: 
      out, c = _errors(weighted_alpha, y, v, Q, QT_y) 
     else: 
      out, c = _values(weighted_alpha, y, v, Q, QT_y) 
     cv_values[:, i] = out.ravel() 
     C.append(c) 

참고 않은 흥미로운 pre_compute 기능

def _pre_compute(self, X, y): 
    # even if X is very sparse, K is usually very dense 
    K = safe_sparse_dot(X, X.T, dense_output=True) 
    v, Q = linalg.eigh(K) 
    QT_y = np.dot(Q.T, y) 
    return v, Q, QT_y 

Abinav는 - 그것은 단순히 가중 평균 에러 제곱 축적 것 수학적 수준에서 무슨 일이 일어나고 있는지 설명했다입니다. 구현의 세부 사항 및 구현과 다른 점은 코드에서 단계별로 평가할 수 있습니다.

+0

을 참조하십시오. 나는 http://stats.stackexchange.com에 아무런 도움이되지 않도록이 질문을 modo에 알리려고했다. 기본적으로, 나는 이것이 어떻게 계산되는지를 볼 수있다. (소스 코드에 수학적 설명조차도있다.) 문제는 GCV에서 생성 한 숫자가 왜 주 문항에 편집에서 수행 한 계산의 순진한 버전을 의미하는지에 해당하지 않는 이유입니다. 예를 들어,'R'의 lm.ridge는 (GCV를 빨리 계산하기 위해) 또 다른 수학 공식을 사용하며 결과는 그들이 무엇이어야하는지에 따라 결정됩니다. – user189035

관련 문제