본문 바로가기
KT AIVLE SCHOOL

[KT AIVLE] 미니프로젝트2 kaggle 참가

by 얀나대장 2023. 3. 29.

aivle 에서 3월 첫째주에 미니프로젝트2의 두번째 프로젝트는 kaggle 랭킹 경쟁이었다.

kaggle은 처음이었는데 모델 성능만으로 순위를 겨루는 것이고 20번정도 test할 수 있었다.

 

https://www.kaggle.com/

 

Kaggle: Your Machine Learning and Data Science Community

Kaggle is the world’s largest data science community with powerful tools and resources to help you achieve your data science goals.

www.kaggle.com

여러 대회가 있는데 데이터 셋도 주고 목표와 주제 설명을 해줘서 쉽게 이해하며 참여할 수 있었다.

이번에 에이블스쿨에서 참여하는 프로젝트는 다음과 같다.

 

 

 

<AIVLE 미니프로젝트 2차 과정>

ㅇ 과제명 : 머신러닝을 활용한 악성사이트 탐지 모델 만들기

ㅇ 목표 : 다른 누구보다 더 뛰어난 악성사이트 탐지 모델 생성

※ Test Dataset에 대한 악성사이트 탐지 예측 결과를 캐글에 제출 해주세요.

ㅇ 데이터 분석 및 모델링한 내용을 PPT로 만들어 에이블 홈페이지에 제출 해 주세요

ㅇ 평가 기준 : Micro F1 Score

 

전날 악성 사이트 탐지를 위함 html 데이터에서 파싱을 해 변수를 설정하는 법을 배웠다.

 

1. 데이터 단변량 분석하기

  1. 변수가 내포하고 있는 의미
  2. 변수가 수치형인지, 범주형인지
  3. 결측치 존재 여부 및 조치 방안
  4. 기초 통계량 확인
  5. 데이터 분포 확인
  6. 위 정보로부터 파악한 내용 정리
  7. 추가 분석사항 도출
train_data.describe()

를 통해 단변량 분석을 한 결과 값이 존재하지 않은 변수도 있었고, 편차가 매우 큰 변수, null값이 있는 변수들도 존재했다.

결측치가 존재하는 행을 최빈값으로 처리하고, 값이 없는 열은 제외시켰다.

 

1.1 null 열 삭제

train_data.drop(["html_num_tags('applet')",'url_chinese_present'], axis=1, inplace=True)
train_data.info()

 

2. 중복 데이터 제거

우리가 접속하는 대부분의 웹사이트는 정상 사이트입니다.

또한, 특정 몇 개 사이트(ex. google, instagram, facebook 등)에 접속 빈도가 높습니다.

편중된 데이터는 모델 학습에 안 좋은 영향을 주기 때문에 중복 데이터 제거를 통해 해결합니다.

이 과정은 데이터 전처리 시 반드시 해야 하는 과정은 아니며, 프로젝트/데이터 성격에 맞게 결정하시면 됩니다.

 

편향된 학습을 막기 위해 중복데이터를 제거하고 사용하면 좋다고 한다.

 

2.1 중복제거

data=test.drop_duplicates()
data.info()

3662 → 3231 로 데이터 수가 줄었다.

 

3. 텍스트와 범주형 특성 처리

기계가 데이터를 인식할 수 있도록 텍스트 데이터를 수치형 데이터로 변경합니다.

  • replace() 함수를 이용한 텍스트와 범주형 특성 처리

3.1 데이터 copy

label_binary = data['label'].copy()

3.2 라벨링

# replace() 함수를 사용 텍스트 데이터를 수치형 데이터로 변경합니다.
label_binary.replace(['benign','malicious'],[0,1], inplace=True)

4. train_test_split을 이용하여, train_x, test_x, train_y, test_y로 데이터 분리

모델을 학습하는 데에는 Train 데이터만 사용해야 합니다.

학습에 사용하지 않은 데이터를 통해 모델을 평가해야 합니다.

그러기 위해 Train / Test 데이터로 분리합니다.

from sklearn.model_selection import train_test_split

x_data = data.drop('label_malicious', axis=1)
y_data = data['label_malicious']

x_train, x_test, y_train, y_test = train_test_split(x_data, y_data, test_size=0.15, random_state=1)

 

5. 평가 데이터 전처리

모델을 평가할 데이터를 확인해보니 내가 포함하지 않은 변수들이 있고, null값 또한 있어서 전처리가 필요했다.

나는 앞서 진행한 것처럼 null값은 삭제하고 변수들도 삭제하여 진행했다. ▶나중에 학습성능을 저하시킨 원인,,

결측치가 너무 많은건 linear interpolation을 사용해 보간해서 사용했다.

코드는 구글링해서 기존 데이터와 편차가 유사하도록 보간하는 방법을 찾았다.

random_data = pd.DataFrame(columns = ["Ran" + name for name in missing_columns])

for feature in missing_columns:
        
    random_data["Ran" + feature] = test[feature + '_imp']
    parameters = list(set(test.columns) - set(missing_columns) - {feature + '_imp'})
    
    model = linear_model.LinearRegression()
    model.fit(X = test[parameters], y = test[feature + '_imp'])
    
    #Standard Error of the regression estimates is equal to std() of the errors of each estimates
    predict = model.predict(test[parameters])
    std_error = (predict[test[feature].notnull()] - test.loc[test[feature].notnull(), feature + '_imp']).std()
    
    #observe that I preserve the index of the missing data from the original dataframe
    random_predict = np.random.normal(size = test[feature].shape[0], 
                                      loc = predict, 
                                      scale = std_error)
    random_data.loc[(test[feature].isnull()) & (random_predict > 0), "Ran" + feature] = random_predict[(test[feature].isnull()) & (random_predict > 0)]

 

6. 모델 학습

# 선언하기
model=RandomForestClassifier(max_depth=5, random_state=1)
# 학습하기
model.fit(x_train, y_train)
# 예측하기
y_pred=model.predict(x_test)

 

7. kaggle에 결과 확인

y_pred를 데이터 형식에 맞춰 바꾸어 넣으면 결과가 kaggle에 반영된다.

결과가 90%근처까지는 갔지만 1등 성능은 94% 정도로 훨씬 차이가 났다.

 

8. 팀원과 해결책 의논

모델 학습을 XGB를 써보기도 하고, RandomForest를 쓰기도 했는데 크게 향상되지는 않았다.

최대 92%까지 향상시켰고, 최종적으로 에이블 프로젝트에서 중간 정도 순위를 차지했다. ㅜ

 

 


순위권 팀들의 해결법

  • null값 random forest로 타게팅해서 처리
  • 또는 KNN으로 결측치 선택
  • 머신러닝 기법으로 catBoost사용

우리 팀은 조금 있는 결측치는 삭제하고 test 결측치만 보간을 했는데 학습 데이터 결측치도 보간을 했어야 했다.

특히 knn이나 random forest로 보간했을 때 성능이 바로 향상되는 걸 볼 수 있었다.

 

피드백

  • 결측치 처리를 최빈값이 아닌 다른 알고리즘으로 처리했어야함
  • 머신러닝 기법을 다른것으로 사용
  • 관련 변수 추가 고려

IterativeImputer 사용시 91%에서 93%까지 올라감.

knn이 제일 잘되는 듯? n_neighbor=2일때 94.6%까지 향상

 

느낀점

전처리의 중요성을 느꼈고 같은 데이터로 한명씩 모델링 돌려보는것도 시간 단축에 도움이 됐을 것 같다.

처음 하는 kaggle대회에서 경쟁을 하니 더 잘하고 싶은 욕구가 생겨서 열심히 했다.

순위가 높아질때 마다 내 심장 박동 수도 높아졌다..ㅎㅎ 너무 짜릿하게 느껴졌다.

하지만 그만큼 아쉬움이 크게 남았다. 

팀 사람들과 대회나가서 더 좋은 결과로 마무리하고 싶어졌다.

 

댓글