개발일지

대회일지_피쳐엔지니어링

rainsky 2022. 10. 11. 11:27

대회에서 내가 맡은 피쳐엔지니어링 부분을 정리해봤다!

 

피쳐엔지니어링

 

 

1. 결측치 처리

결측치에서 시간이 많이 소요됐다. 결측치를 처리해주면서도 힘들었던 게 설명이 뭔가 명확하지 않아서 스플라인 보간법으로 채워줄지 0으로 해줘야 할지 고민을 많이 했다. 결국은 기존 데이터들의 예측에 피해가 안 가게 결측값들을 윗 값과 아랫 값을 가져와서 채워줬다.

train.fillna(method='bfill',inplace=True)
train.fillna(method='ffill',inplace=True)

inplace=True는 변수를 지정하지 않아도 바로 train에 적용이 된다는 의미이다.

 

0으로 채워주면 예측에 방해가 됐고, drop을 해줄 수도 없는 상황이었다.

스플라인보간법을 쓰려고 했지만 무한 값이 나오기도 하고 데이터를 살펴봤을 때 보통 결측값이 있는 값 위 아래의 값들이 같아서 결측값 역시 같게 해 주기 위해 위와 같이 코드를 적었다.

 

사용하지는 못했지만 스플라인 보간법은 이 코드를 이용했다.

from scipy import interpolate

train = train.interpolate(method='values',kind='quadratic')

 

 

그리고 Nan값이 아닌 텅 비어있는 열도 있었는데 이 열들은 어떻게 해줘야 할지 몰랐다. 계속 오류가 나는데 처음 보는 유형이라 난감했다. 그런 열들은 삭제를 해줬지만, 많은 데이터 파일들에 한 번에 적용시키는 법을 찾기가 힘들었다.

 

 

2. 열 개수 맞춰주기

베이스라인을 참고했다. 처음에 열 개수를 어떻게 맞춰줘야 할지 감이 안 왔다. 왜냐하면 많은 데이터 파일들이 있는데 하나하나 없는 열을 찾아서 맞춰주기에는 시간이 비효율적으로 들었다. 그래서 베이스라인을 보며 어떤 식으로 열 개수를 맞춰줬는지 코드를 이해했다. 덕분에 test와 train의 열 개수를 맞춰줄 수 있었다.

add_col = [i for i in check_col if i not in test.columns]
for a in add_col:
  test[a] = 0

check_col에 맞춰주고 싶은 열들을 적어 열 개수를 맞췄다.

for문을 사용해 해결할 수 있었다.

 

 

3.원핫인코딩

저번 글에서 요일 변수를 추가해줬었는데, 그 요일 변수를 원핫인코딩해주어 독립적으로 만들어줬다.

요일 변수인 월~일을 수치형(1~7)으로 바꿔줬는데 이 요일 변수의 값을 1+2=3 같다는 결론을 내릴 수도 있기 때문에 독립적으로 바꿔줬다. (원래 요일은 수치가 아니니까!)

train=pd.get_dummies(train,columns=['week_day'])

 

 

4. 스케일링

스케일링은 minmax스케일링을 이용해줬다.

from sklearn.preprocessing import MinMaxScaler

scaler = MinMaxScaler()

scaled = scaler.fit_transform(train[scale_cols])

스케일링을 해주면서 로그를 사용하면 더 정규화가 잘되지 않을까 하는 의문이 들었다.

그래서 독립변수별 이상치를 확인하고 로그를 해주었을 때의 그래프를 원래 그래프와 비교했다.

로그를 했을 때 정규화가 잘된 피쳐들만 따로 선별하여 그 피쳐들에만 스케일링이 아닌 로그를 씌어주고 싶었다.

하지만 팀원들과 이야기해본 결과 스케일링만 해주는 게 더 낫지 않을까 하여 로그는 사용하지 않았다.

 

5. 로그

사용은 못했지만 만들어 놓은 로그 코드가 아쉬워서 이곳에라도 적어본다.

독립변수별 이상치 그래프와 로그를 사용한 코드

plt.style.use("ggplot")

feature = col

plt.figure(figsize=(30,15))
plt.suptitle("독립변수별 이상치 확인", fontsize = 30)

for i in range(len(col)):
  plt.subplot(5,8,i+1)
  plt.title(feature[i])
  plt.hist(train[feature[i]])
plt.show()
np.log1p(train['피쳐'])

 

 

6. 이상치 제거

그래프를 그렸을 때 이상치가 20000이 넘는 값이 몇 개 보였다.

그래서 이를 제거해줌으로써 예측 분석에 방해될 수 있는 이상치를 없애 예측력을 높였다.

train[train['타겟'] <= 20000]

 

 

대회는 한 달의 여정을 통해 마무리가 되었고, 아쉽게도 좋은 결과를 얻지 못했다.

그래도 밤을 새우며 노력한 일들이 내 실력을 높이는데 도움을 주었고 대회로 점차 성장할 수 있어서 좋은 경험이었다.

인턴을 하며 대회 준비를 하는 것은 힘들었지만 뜻깊은 시간이었다.

또 대회에 도전해봐야겠다!