본문 바로가기

코드읽기/auto-sklearn

[AutoML]구현을 향해, AutoML? 그거 별거 없는거 아닌가? 1편

 

서론

이미 검색창에 AutoML이라고 치면 잘 만들어진 AutoML들이 많다.

많은 좋은 프로그래밍들을 보고 코드의 의도와 구현 방식을 배우는 것이 목표이다.

 

AutoML? 그냥 단순히 알고리즘 여러 개 하나하나 학습 다 해보고 젤 좋은 거 알려주면 되는 거 아닌가?

맞다. 이게 AutoML의 궁극적인 목표다. 생각해봐야 할 건 어떻게 하나하나 학습을 해야 효율적이며 무엇을 기준으로 추천해야 하지?라는 생각이 계속 이어져야 한다. 

아래는 AutoML은 아니며 단순히 하나하나 학습 다 해보고 젤 좋아 보이는 거 보여주는 흉악한 코드가 있다.

% warning%
아래 코드는 처음 인공지능 교육을 들을떄 코린이가 작성한 코드이며, AutoML이라는 개념을 단순히 하나하나 다 해보고 알려주는 것으로만 알고 있던 글쓴이가 작성한 코드이다. 
그 당시 코드 작성 후, "이 정도면 AutoML인 거 아닌가"라는 흉악한 망상을 했는데 잘못된 예시를 보여주기 위해 부끄럽지만 코드를 첨부했다. 
# model
model_list = [model_xgb, model_lgb, model_gbr, et_model,model_rf]

'''
train 1 ~ 6까지는 모두다르게 전처리된 데이터이다
'''
# X_train
X_train_list = [X_train1, X_train2, X_train3, X_train4,X_train5,X_train6]

# y_train
y_train_list = [y_train1, y_train2, y_train3, y_train4,y_train5,y_train6]

# X_test
X_test_list = [X_test1, X_test2, X_test3, X_test4,X_test5,X_test6]

# y_test
y_test_list = [y_test1, y_test2, y_test3, y_test4,y_test5,y_test6]

df = pd.DataFrame(columns = ['data','mse' , 'mae', 'r2','rmse'])

str1 = ["컬럼V1" ,"컬럼V2"]
str2 = ["_상관 계수","_상관+다중"] 
score = ['mse' , 'mae', 'r2','rmse']
model_name = ["_xgb",'_lgbm','_gbr','_et','_rf']

cnt = 0
num = 0


for i in model_list:
  for j in range(len(X_train_list)):
    
    # i번쨰 모델 학습
    i.fit(X_train_list[j],y_train_list[j])

    # i번쨰 모델 예측
    pred = i.predict(X_test_list[j])

    # 성능 측정
    mse = mean_squared_error(pred, y_test_list[j])
    mae = mean_absolute_error(pred, y_test_list[j])
    r2 = r2_score(pred, y_test_list[j])
    rmse = np.sqrt(mean_squared_error(pred, y_test_list[j]))

    # train1, train2는 컬럼만 추가한 데이터 셋
    if j < 2: 
      df.loc[num + j] = [str1[j] + model_name[cnt], mse , mae, r2, rmse]

    # train3, train4는 컬럼추가 후 상관계수의 절댓값이 0.1보다 작은것을 제거한 데이터 셋
    # 따라서  str2(_상관 계수) 문자열을 추가해 줌
    elif j< 4:
      df.loc[num + j] = [str1[(j%2)] + str2[0] + model_name[cnt], mse , mae, r2, rmse]
    else:
      df.loc[num + j] = [str1[(j%2)] + str2[1] + model_name[cnt], mse , mae, r2, rmse]
  
  # 데이터프레임 덮어쓰기 방지
  cnt += 1
  num += 6
  print(df)

 

흉악한 코드임에도 불구하고 다 본 사람이 있다면, "어떻게 저걸 AutoML이라고 생각하냐 ㅋㅋ"라는 반응을 기대할 수 있다. 하지만 나는 그렇게 생각한 적이 있었다.

 

AutoML 구현을 향해 99? 그래서 뭐 할 건데?

리서쳐의 입장이 아닌, 엔지니어의 입장에서 AutoML오픈소스를 조금씩 분석 해갈 예정이다. 오픈 소스 코드의 의도와 좋은 구현 방식을 알아내는 것이 목적이다.