ValueError : 희소 행렬이있는 scikit 선형 회귀 CV 모델에서는 음의 차원이 허용되지 않습니다.

Srepho

나는 최근에 kaggle 대회에서 경쟁했고 scikit learn에서 선형 CV 모델을 실행하는 데 문제가 발생했습니다. 스택 오버플로에 대한 비슷한 질문을 알고 있지만 수락 된 답변이 내 문제와 어떤 관련이 있는지 알 수 없습니다. 도움을 주시면 대단히 감사하겠습니다. 내 코드는 다음과 같습니다.

train=pd.read_csv(".../train.csv")
test=pd.read_csv(".../test.csv")
data=pd.read_csv(".../sampleSubmission.csv")

from sklearn.feature_extraction.text import TfidfVectorizer
transformer = TfidfVectorizer(max_features=None)
Y=transformer.fit_transform(train.tweet)
Z=transformer.transform(test.tweet)

from sklearn import linear_model

clf = linear_model.RidgeCV()

a=4
b=1
while (a<28):
    clf.fit(Y, train.ix[:,a])
    pred=clf.predict(Z)
    linpred=pd.DataFrame(pred)
    data[data.columns[b]]=linpred
    b=b+1
    a=a+1
print b

내가받은 오류는 아래에 전체적으로 붙여 넣어집니다.

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-17-41c31233c15c> in <module>()
      1 blah=train.ix[:,a]
----> 2 clf.fit(Y, blah)

D:\Users\soates\AppData\Local\Enthought\Canopy\User\lib\site-        packages\sklearn\linear_model\ridge.pyc in fit(self, X, y, sample_weight)
    815                                   gcv_mode=self.gcv_mode,
    816                                   store_cv_values=self.store_cv_values)
--> 817             estimator.fit(X, y, sample_weight=sample_weight)
    818             self.alpha_ = estimator.alpha_
    819             if self.store_cv_values:

D:\Users\soates\AppData\Local\Enthought\Canopy\User\lib\site-    packages\sklearn\linear_model\ridge.pyc in fit(self, X, y, sample_weight)
    722             raise ValueError('bad gcv_mode "%s"' % gcv_mode)
    723 
--> 724         v, Q, QT_y = _pre_compute(X, y)
    725         n_y = 1 if len(y.shape) == 1 else y.shape[1]
    726         cv_values = np.zeros((n_samples * n_y, len(self.alphas)))

D:\Users\soates\AppData\Local\Enthought\Canopy\User\lib\site-  packages\sklearn\linear_model\ridge.pyc in _pre_compute(self, X, y)
    607     def _pre_compute(self, X, y):
    608         # even if X is very sparse, K is usually very dense
--> 609         K = safe_sparse_dot(X, X.T, dense_output=True)
    610         v, Q = linalg.eigh(K)
    611         QT_y = np.dot(Q.T, y)

D:\Users\soates\AppData\Local\Enthought\Canopy\User\lib\site- packages\sklearn\utils\extmath.pyc in safe_sparse_dot(a, b, dense_output)
     76     from scipy import sparse
     77     if sparse.issparse(a) or sparse.issparse(b):
---> 78         ret = a * b
     79         if dense_output and hasattr(ret, "toarray"):
     80             ret = ret.toarray()

D:\Users\soates\AppData\Local\Enthought\Canopy\User\lib\site-packages\scipy\sparse\base.pyc in __mul__(self, other)
    301             if self.shape[1] != other.shape[0]:
    302                 raise ValueError('dimension mismatch')
--> 303             return self._mul_sparse_matrix(other)
    304 
    305         try:

D:\Users\soates\AppData\Local\Enthought\Canopy\User\lib\site-  packages\scipy\sparse\compressed.pyc in _mul_sparse_matrix(self, other)
    518 
    519         nnz = indptr[-1]
--> 520         indices = np.empty(nnz, dtype=np.intc)
    521         data = np.empty(nnz, dtype=upcast(self.dtype,other.dtype))
    522 

ValueError: negative dimensions are not allowed
Dthal

이 문제는 sklearn을 사용하지 않고 발생하는 것 같습니다. 그것의 scipy.sparse 행렬 곱셈. scipy-users 게시판에는 희소 행렬 곱셈 문제가 있습니다. 문제의 핵심은 scipy가 희소 행렬 곱셈 중에 0이 아닌 인덱스에 32 비트 int를 사용한다는 것입니다. 위의 트레이스 백 하단에 표시된 선입니다. 0이 아닌 요소가 너무 많으면 오버플로 될 수 있습니다. 이 오버플로로 인해 nnz 변수가 음수가됩니다. 그런 다음 마지막 화살표의 코드는 nnz 크기의 빈 배열을 생성하여 음수 차원으로 인해 ValueError가 발생합니다.

다음과 같이 sklearn없이 위의 트레이스 백의 꼬리 끝을 생성 할 수 있습니다.

import scipy.sparse as ss
X = ss.rand(75000, 42000, format='csr', density=0.01)
X * X.T

이 문제의 경우 입력은 아마도 매우 드물지만 RidgeCV는 sklearn 내의 트레이스 백의 마지막 부분에서 X와 XT를 곱하는 것처럼 보입니다. 해당 제품은 부족할 수 있습니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관