인프런 커뮤니티 질문&답변
수치형 자료 선택
해결된 질문
작성
·
20
0
2유형 개념 강의 중 classification(분류) 문제 질문있습니다.
label 인코딩 할 때 범주형 자료를 선택하기 위해
cols = train.select_dtypes(include='object')를 사용한다고 했습니다.
그 후 Min-Max 스케일링을 진행할 때 강의에서는 리스트 형태로 cols 변수에 직접 수치형 컬럼을 입력했지만
cols = train.select_dtypes(exclude='object') 또는 include=['int','float'] 으로도 선택할 수 있을 것을 것이라 생각해서 실행했더니 에러가 발생합니다.
ValueError: Boolean array expected for the condition, not int64
제 방법대로 진행했을 때 cols에 선택된 데이터를 보면 강의에서 직접 리스트 형태로 입력한 컬럼에 추가로 'id' 컬럼이 더 선택된 것으로 보입니다. 이렇게 진행했을 때 왜 에러가 발생하는지, 에러가 발생하지 않아도 id 컬럼이 추가로 선택된 상태로 진행했을 때 문제가 있는지 질문 드립니다!
강의 내용
cols = ['age', 'fnlwgt', 'education.num', 'capital.gain', 'capital.loss', 'hours.per.week']
def get_data():
train_copy = train.copy()
test_copy = test.copy()
return train_copy, test_copy
train_copy, test_copy = get_data()
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
display(train_copy[cols].head(2))
train_copy[cols] = scaler.fit_transform(train_copy[cols])
test_copy[cols] = scaler.transform(test_copy[cols])
display(train_copy[cols].head(2))제 코딩 내용은 위 코드에서
cols = ['age', 'fnlwgt', 'education.num', 'capital.gain', 'capital.loss', 'hours.per.week']부분을
cols = train.select_dtypes(include=['int','float'])
또는
cols = train.select_dtypes(exclude='object')이렇게 바꿨습니다
답변 2
0
cols = train.select_dtypes(include=['int', 'float']).columns
과 같이 .columns를 붙여주세요 해당되는 컬럼명만 리스트 형태로 받을 수 있습니다.
train.select_dtypes(include=['int', 'float']) 의 결과는 해당 컬럼의 데이터까지 그러니깐
데이터 프레임으로 결과를 얻어요
0
안녕하세요, 인프런 AI 인턴입니다.
김하민님의 질문에 대해 답변드리겠습니다. Min-Max 스케일링을 수행할 때 수치형 컬럼을 선택하는 과정에서 발생한 문제에 대해 알아보겠습니다.
문제의 원인
컬럼 미스매치:
train.select_dtypes(include=['int', 'float'])나exclude='object'로 컬럼을 선택하는 경우id와 같은 불필요한 컬럼이 포함될 수 있습니다. 이는MinMaxScaler가 수치형 데이터를 처리할 때 불필요한 컬럼(ID와 같이 분류에 영향을 주지 않는 컬럼)이 포함되면 스케일의 불일치나 오작동을 초래할 수 있습니다.잘못된 데이터형:
scaler.fit_transform()및scaler.transform()함수가 기대하는 입력은 수치 데이터 타입이어야 하며,train.select_dtypes(...)가 반환하는 데이터프레임을 그대로 사용하는 경우 컬럼의 데이터 타입이 달라질 수 있습니다. 이는 특히id와 같은 불필요한 컬럼이 추가될 때 발생할 수 있는 문제입니다.
해결 방법
컬럼 명시: 강의에서 제공된 대로 스케일링이 필요한 수치형 컬럼을 리스트로 명시적으로 지정하는 것이 가장 견고한 방법입니다. 이는 불필요한 컬럼이 포함되지 않도록 보장하며, 의도한 대로 데이터를 변환할 수 있도록 합니다.
컬럼 필터링: 자동적인 방법을 사용하고 싶다면, 활용할 컬럼 리스트를 다시 한 번 필터링하는 과정을 추가해야 합니다. 예를 들어, 다음과 같이 원하는 컬럼만 대표 선택할 수 있습니다.
desired_columns = ['age', 'fnlwgt', 'education.num', 'capital.gain', 'capital.loss', 'hours.per.week']
selected_cols = train.select_dtypes(include=['int', 'float']).columns.intersection(desired_columns)
- 에러 메시지의 이해: “Boolean array expected for the condition, not int64” 라는 에러 메시지는 주로 Pandas의 조건부 인덱싱일 때 발생합니다. 스케일러 적용 전후로 데이터의 형태와 컬럼명을 다시 한 번 점검해야 합니다.
위의 해결 방법으로 시도해 보신다면, id 컬럼 등 불필요한 컬럼이 스케일링에 방해가 되지 않도록 주의하는 것이 좋습니다. 이러한 점을 감안하여 MinMaxScaler나 기타 전처리 작업을 수행하시면 도움이 될 것입니다.
관련하여 추가적인 내용은 아래 링크에서 더 살펴보실 수 있습니다:
- 수치형 - 민맥스 스케일링
이 링크는 유사한 문제에 대해 깊이 있는 논의와 해결책을 제시하고 있으며, 김하민님의 질문에 대한 해결 방법을 찾는 데 도움이 될 것입니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.





