인프런 커뮤니티 질문&답변

천승현님의 프로필 이미지

작성한 질문수

[개정판] 파이썬 머신러닝 완벽 가이드

분류 실습 1 : 캐글경연대회의 산탄데르 은행 고객 만족 예측 - 01

TypeError: Singleton array array(30) cannot be considered a valid collection.

작성

·

4K

0

from sklearn.model_selection import GridSearchCV

# 하이퍼 파라미터 테스트의 수행 속도를 향상시키기 위해 n_estimators를 100으로 감소

LGBM_clf = LGBMClassifier(n_estimators=200)

params = {'num_leaves': [32, 64 ],

          'max_depth':[128, 160],

          'min_child_samples':[60, 100],

          'subsample':[0.8, 1]}

# 하이퍼 파라미터 테스트의 수행속도를 향상 시키기 위해 cv 를 지정하지 않습니다. 

gridcv = GridSearchCV(lgbm_clf, param_grid=params)

gridcv.fit(X_train, y_train, early_stopping_rounds=30, eval_metric="auc",

           eval_set=[(X_train, y_train), (X_test, y_test)])

print('GridSearchCV 최적 파라미터:', gridcv.best_params_)

lgbm_roc_score = roc_auc_score(y_test, gridcv.predict_proba(X_test)[:,1], average='macro')

print('ROC AUC: {0:.4f}'.format(lgbm_roc_score))

===========================

위의 코드가 있는 cell에서 bold된 부분(eval_set)에 

아래와 같은 오류메시지가 등장합니다. 해결방법 좀 부탁드립니다..희한하게 다른 lgbm code들은 모두 작동합니다.

girdcv.fit( ) 안에 early_stopping_rounds가 들어가면서 생긴 문제 같습니다만 잘 모르겠네요 ㅠㅠ
TypeError: Singleton array array(30) cannot be considered a valid collection.

참고로 sklearn 버전은 0.22, lgbm은 2.3.1 입니다.

답변 6

0

안녕하세요. 좋은 책 감사 드립니다.

동일한 상황이었는데요, 말씀해주신 것과 같이 conda uninstall dask 수행하고,

호환성 때문인지 관련 library가 같이 삭제되어 다시 설치하니 잘 되었습니다. (pandas, matplotlib)

conda는 기존에 설치되어 있어서 별도의 설치 없이 기존 환경에서 관련 library 추가 설치하였었습니다. 참조 부탁드립니다.

0

권 철민님의 프로필 이미지
권 철민
지식공유자

해결이 되었다니 다행이군요.

연말 연시 잘 보내시길 바랍니다.

0

천승현님의 프로필 이미지
천승현
질문자

우선 dask 라는 것이 에러메시지엔 있지만 제 아나콘다 설치환경에선 발견할 수 없더라구요.

혹시나 해서 순정(최초) 환경에서 첫 코드(문제가 있다고 말씀드렸던 코드)를 실행시키니 정상 작동됩니다. 

다양한 해결책을 주신 덕분에 문제가 잘 해결됐습니다. 정말 감사합니다!!  

0

권 철민님의 프로필 이미지
권 철민
지식공유자

안녕하십니까,

보내주신 에러코드를 보니 아래와 같이 Dask dataframes 오류가 보이는 군요.


# Dask dataframes may not return numeric shape[0] value

Dask 는 Pandas의 DataFrame을 병렬 처리 할 수 있게 해주나, 아직 성숙한 패키지가 아니어서 오류가 많이 발생 할 수 있습니다. 만일 Dask를 설치하셨으면 다시 uninstall 후에 테스트 해보셨으면 합니다. 

아래 코드는 DataFrame을 사용하지 않고 Numpy ndarray를 이용하여 학습과 예측을 수행합니다. 아래 코드가 별 문제 없이 수행 된다면 Dask DataFrame의 문제로 추정됩니다. 아래 코드에서도 문제가 발생하면 다시 한번 에러 내용을 저에게 보내주시기 바랍니다. 

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib

cust_df = pd.read_csv("./train_santander.csv",encoding='latin-1')
# var3 피처 값 대체 및 ID 피처 드롭
cust_df['var3'].replace(-999999,2, inplace=True)
cust_df.drop('ID',axis=1 , inplace=True)

# 피처 세트와 레이블 세트분리. 레이블 컬럼은 DataFrame의 맨 마지막에 위치해 컬럼 위치 -1로 분리
X_features = cust_df.iloc[:, :-1]
y_labels = cust_df.iloc[:, -1]

### X_features와 y_labels를 numpy nadrray로 교체
X_features = X_features.values
y_labels = y_labels.values

print('X_features 타입:', type(X_features), ' y_labels 타입:', type(y_labels))

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X_features, y_labels,
                                                    test_size=0.2, random_state=0)

from lightgbm import LGBMClassifier
from sklearn.model_selection import GridSearchCV
from sklearn.metrics import roc_auc_score

# 하이퍼 파라미터 테스트의 수행 속도를 향상시키기 위해 n_estimators를 100으로 감소
lgbm_clf = LGBMClassifier(n_estimators=200)

params = {'num_leaves': [32, 64 ],
          'max_depth':[128, 160],
          'min_child_samples':[60, 100],
          'subsample':[0.8, 1]}


# 하이퍼 파라미터 테스트의 수행속도를 향상 시키기 위해 cv 를 지정하지 않습니다.
gridcv = GridSearchCV(lgbm_clf, param_grid=params)
gridcv.fit(X_train, y_train, early_stopping_rounds=30, eval_metric="auc",
           eval_set=[(X_train, y_train), (X_test, y_test)])

print('GridSearchCV 최적 파라미터:', gridcv.best_params_)
lgbm_roc_score = roc_auc_score(y_test, gridcv.predict_proba(X_test)[:,1], average='macro')
print('ROC AUC: {0:.4f}'.format(lgbm_roc_score))


0

천승현님의 프로필 이미지
천승현
질문자

안녕하세요,  크리스마스는 잘 보내셨나요? 답변 빠르게 주셔서 정말 감사드립니다. 

우선 말씀해주신대로 재부팅하고 새로 주신 코드만 독립적으로 실행시켜봤으나 여전히 동일한 에러가 발생합니다. 

아래는 에러 코드 전문입니다.

=============================================================

TypeError                                 Traceback (most recent call last)
<ipython-input-3-98f5aee670fc> in <module>
     34 # 하이퍼 파라미터 테스트의 수행속도를 향상 시키기 위해 cv 를 지정하지 않습니다.
     35 gridcv = GridSearchCV(lgbm_clf, param_grid=params)
---> 36 gridcv.fit(X_train, y_train, early_stopping_rounds=30, eval_metric="auc",eval_set=[(X_train, y_train), (X_test, y_test)])
     37 
     38 print('GridSearchCV 최적 파라미터:', gridcv.best_params_)

~\Anaconda3\envs\tf\lib\site-packages\sklearn\model_selection\_search.py in fit(self, X, y, groups, **fit_params)
    650         X, y, groups = indexable(X, y, groups)
    651         # make sure fit_params are sliceable
--> 652         fit_params_values = indexable(*fit_params.values())
    653         fit_params = dict(zip(fit_params.keys(), fit_params_values))
    654 

~\Anaconda3\envs\tf\lib\site-packages\sklearn\utils\validation.py in indexable(*iterables)
    235         else:
    236             result.append(np.array(X))
--> 237     check_consistent_length(*result)
    238     return result
    239 

~\Anaconda3\envs\tf\lib\site-packages\sklearn\utils\validation.py in check_consistent_length(*arrays)
    206     """
    207 
--> 208     lengths = [_num_samples(X) for X in arrays if X is not None]
    209     uniques = np.unique(lengths)
    210     if len(uniques) > 1:

~\Anaconda3\envs\tf\lib\site-packages\sklearn\utils\validation.py in <listcomp>(.0)
    206     """
    207 
--> 208     lengths = [_num_samples(X) for X in arrays if X is not None]
    209     uniques = np.unique(lengths)
    210     if len(uniques) > 1:

~\Anaconda3\envs\tf\lib\site-packages\sklearn\utils\validation.py in _num_samples(x)
    150         if len(x.shape) == 0:
    151             raise TypeError("Singleton array %r cannot be considered"
--> 152                             " a valid collection." % x)
    153         # Check that shape is returning an integer or default to len
    154         # Dask dataframes may not return numeric shape[0] value

TypeError: Singleton array array(30) cannot be considered a valid collection.

0

권 철민님의 프로필 이미지
권 철민
지식공유자

안녕하십니까,

먼저 LGBM_clf = LGBMClassifier(n_estimators=200)는 아래와 같이 변경 부탁드립니다. 오탈자 입니다.

lgbm_clf = LGBMClassifier(n_estimators=200)

그래도 오류가 계속 발생하면 커널 또는 주피터 노트북을 재 기동하고 다른 셀은 전혀 수행하지 않고 아래 코드만 복사하여 실행해 보십시요.  만약 오류가 발생하지 않는다면 4.8 분류실습 _ 산탄데르 고객 만족 예측.ipynb 을 수행하면서 뭔가 중복 수행되면서 메모리에 잘못된 값이 올라가서 오류가 발생한 것 같습니다. 아래 코드 역시 동일하게 오류가 발생한다면 그때 다시 상황 업데이트 부탁드립니다.  감사합니다. 그리고 메리 크리스 마스 입니다.

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib

cust_df = pd.read_csv("./train_santander.csv",encoding='latin-1')
# var3 피처 값 대체 및 ID 피처 드롭
cust_df['var3'].replace(-999999,2, inplace=True)
cust_df.drop('ID',axis=1 , inplace=True)

# 피처 세트와 레이블 세트분리. 레이블 컬럼은 DataFrame의 맨 마지막에 위치해 컬럼 위치 -1로 분리
X_features = cust_df.iloc[:, :-1]
y_labels = cust_df.iloc[:, -1]

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X_features, y_labels,
                                                                                                  test_size=0.2, random_state=0)

from lightgbm import LGBMClassifier
from sklearn.model_selection import GridSearchCV
from sklearn.metrics import roc_auc_score

# 하이퍼 파라미터 테스트의 수행 속도를 향상시키기 위해 n_estimators를 100으로 감소
lgbm_clf = LGBMClassifier(n_estimators=200)

params = {'num_leaves': [32, 64 ],
                     'max_depth':[128, 160],
                     'min_child_samples':[60, 100],
                     'subsample':[0.8, 1]}


# 하이퍼 파라미터 테스트의 수행속도를 향상 시키기 위해 cv 를 지정하지 않습니다.
gridcv = GridSearchCV(lgbm_clf, param_grid=params)
gridcv.fit(X_train, y_train, early_stopping_rounds=30, eval_metric="auc",
                   eval_set=[(X_train, y_train), (X_test, y_test)])

print('GridSearchCV 최적 파라미터:', gridcv.best_params_)
lgbm_roc_score = roc_auc_score(y_test, gridcv.predict_proba(X_test)[:,1], average='macro')
print('ROC AUC: {0:.4f}'.format(lgbm_roc_score))