본문 바로가기
‼ ERROR RECORD

빅데이터 분석기사 응시환경체험 작업형 1번 예제

by Queen2 2022. 6. 23.
728x90
반응형

Q. mtcars 데이터셋의 qsec컬럼을 최소최대 척도로 변환 후 0.5보다 큰 값을 가지는 레코드의 개수를 구하시오.

 

인터넷의 풀이를 보니 풀이방법은 크게 3가지인 것 같다.

1) MinMaxScaler의 개념을 이용해서 (X- X.min())/(X.max()-X.min()) 으로 qsec 컬럼을 변환하는 방법

2) MinMaxScaler을 전체 데이터에서 수치형 데이터가 아닌 항목을 [:,1:] 로 슬라이싱을 통해 제외한 뒤, data 전체에
   스케일링을 적용하는 방법

3) 마지막은 MinMaxScaler을 특정 qsec열에만 별도로 적용하는 것이다.

 

--> 3번째 방법을 계속 시도했으나, 에러가 나서 애를 먹다가 방법을 찾았다

 

제일 애를 먹었던 부분은 a['qsec'] = mms.fit_transform(a['qsec']) 를 시행했을 때 ValueError가 발생하는 것이었다....ㅜㅠ

 

해결방법의 힌트는 Expected 2D array, got 1D array instead 였다.

fit_transform안에는 2D array만 소화가능한데 왜 1D를 주냐?!라는 컴퓨터의 에러메시지,,,,

 

방법1. [[ ]] 표기를 통해 하나의 data로 qsec 컬럼을 처리

import pandas as pd
from sklearn.preprocessing import MinMaxScaler

mms = MinMaxScaler()
a = pd.read_csv('data/mtcars.csv', index_col=0)

a['qsec'] = mms.fit_transform(a[['qsec']])

print(len(a.loc[a['qsec']>0.5,'qsec']))

: [[ ]] 로 1D array를 2D Array로 변환

 

방법2.  qsec컬럼을 values.reshape(-1,1)을 이용해 qsec 컬럼의 값들을 2D array로 변환

import pandas as pd
from sklearn.preprocessing import MinMaxScaler

mms = MinMaxScaler()
a = pd.read_csv('data/mtcars.csv', index_col=0)

a['qsec'] = mms.fit_transform(a['qsec'].values.reshape(-1,1))

print(len(a.loc[a['qsec']>0.5,'qsec']))

: resahpe를 통한 2D array변환

**reshape(1,-1) 에서 -1의 의미가 무엇인지는 아래 링크에 잘 설명되어 있다.

 

간단하게 설명하면 -1의 의미는 '뭔지 모르겠지만, 원래의 shape에 맞게 잘 맞춰 넣어볼께' 라는 의미이다

(뭔지 모르는 ?의 값이 행 열 둘다 있으면 컴퓨터는 shape를 맞출 수 없기 때문에 reshape(-1,-1).이 안된다)

예를 들어 기존에 (3,4) 형태의 shape를 가진 array가 있다면 .reshape(2,-1)을 적용하며 2 x ? = 3 x 4를 numpy가 계산해서

shape(2,6)형태의 array를 반환한다.

 

따라서, 위의 values.resahpe(-1,1)은 1이라는 열을 고정해서 qsec이라는 칼럼을 2D array로 변환시키라는 의미이다.

a = np.array([[1,2],[3,4]])
              
a.reshape(-1,1)
array([[1],
   [2],
   [3],
   [4]])

https://stackoverflow.com/questions/18691084/what-does-1-mean-in-numpy-reshape

728x90
반응형

댓글