일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- dp
- outer join
- SQL
- 인접리스트
- Depthwise Separable Convolution
- 인접행렬
- dfs
- resnet
- 백준
- numpy
- 정규화
- Two Pointer
- mobilenet
- CROSS JOIN
- 연산량 감소
- BFS
- pytorch
- 그래프
- 데이터모델링
- 식별자
- depthwise convolution
- SQLD
- feature map
- get_dummies()
- bottleneck
- SQLD 후기
- 1x1 Convolution
- 엔터티
- skip connection
- Inductive Bias
- Today
- Total
SJ_Koding
03.[Dacon Basic] 영화 리뷰 감정분석 경진대회 (최종39위 / 605명) 본문
https://dacon.io/competitions/official/235864/overview/description
#아래의 코드는 '박이삭'회원님의 코드공유를 참고하여 만들었습니다. 전반적인 코드흐름은 동일하며 보다 정확한 결과값을 위해 성능이 좋은 3개의 분류모델을 찾고, 3개의 결과를 토대로 최종 결과를 도출해내었습니다.
기본 모듈 및 측정 모델 셋팅
import pandas as pd
import numpy as np
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.neighbors import KNeighborsClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import GradientBoostingClassifier
from sklearn import svm
from xgboost import XGBClassifier
from lightgbm import LGBMClassifier
from sklearn.model_selection import train_test_split
데이터 로드
train = pd.read_csv('/content/drive/MyDrive/dacon/movie_review_analysis/train.csv')
test = pd.read_csv('/content/drive/MyDrive/dacon/movie_review_analysis/test.csv')
sample_submission = pd.read_csv('/content/drive/MyDrive/dacon/movie_review_analysis/sample_submission.csv')
max_features = 15800 Accuracy 0.875
Vectorizer를 사용하였고 max_features는 1부터 20000까지 100단위로 찾아본 결과 15800에서 정확도 0.875의 가장 높은 정확도를 가졌습니다.
vectorizer = TfidfVectorizer(min_df = 0.0, analyzer="char", sublinear_tf=True, ngram_range=(1,3), max_features=15800)
X = train['document']
y = np.array(train.label)
X_train, X_eval, y_train, y_eval = train_test_split(X, y, test_size=0.2, random_state=2)
X_train = vectorizer.fit_transform(X_train)
X_eval = vectorizer.transform(X_eval)
SVM = svm.SVC().fit(X_train, y_train)
KNN = KNeighborsClassifier(n_neighbors = 47).fit(X_train, y_train)
LR = LogisticRegression(class_weight='balanced', max_iter=1000).fit(X_train, y_train)
RFC = RandomForestClassifier(class_weight='balanced', n_estimators=1000).fit(X_train, y_train)
GBC = GradientBoostingClassifier(n_estimators=1000).fit(X_train, y_train)
XGB = XGBClassifier(class_weight='balanced', n_estimators=1000).fit(X_train, y_train)
LGBM = LGBMClassifier(class_weight='balanced', n_estimators=1000).fit(X_train, y_train)
print(f"max_features: {15800}, SVM: {SVM.score(X_eval, y_eval)}, KNN: {KNN.score(X_eval, y_eval)} LR: {LR.score(X_eval, y_eval)}, RFC: {RFC.score(X_eval, y_eval)}, GBC: {GBC.score(X_eval, y_eval)}, XGB: {XGB.score(X_eval, y_eval)}, LGBM: {LGBM.score(X_eval, y_eval)}" )
max_features: 15800, SVM: 0.877, KNN: 0.846 LR: 0.875, RFC: 0.826, GBC: 0.857, XGB: 0.846, LGBM: 0.846
위의 여러 모델 결과를 보면 SupportVectorMachine이 가장 성능이 좋았고 그다음 Linear regressor, GradientBoostClassifier모델이 순위를 이었습니다. 여기서 핵심 개념은 3개의 예측값 중 1이 2개이상 나오면 1, 0이 2개이상 나오면 0으로 결과값을 도출합니다.
위의 여러 모델 결과를 보면 SupportVectorMachine이 가장 성능이 좋았고 그다음 Linear regressor, GradientBoostClassifier모델이 순위를 이었습니다.
여기서 핵심 개념은 3개의 예측값 중 1이 2개이상 나오면 1, 0이 2개이상 나오면 0으로 결과값을 도출합니다. 모델 하나가 잘못 예측했을 때 나머지 2개가 제대로 예측했다면 그 2개의 의견을 따르는 것입니다. 물론, 모델 하나가 제대로 예측했지만 나머지 2개가 잘못 예측할 수 있습니다. 하지만 제대로 예측할 확률이 그렇지 않을 확률보다 훨씬 높기때문에 충분히 효과적이다라고 생각이 들었습니다.
++ 이를 Hard voting 앙상블 기법이라고 합니다.
X = train['document']
y = np.array(train.label)
X_train = vectorizer.fit_transform(X)
X_test = vectorizer.transform(test['document'])
SVM = svm.SVC().fit(X_train, y)
LR = LogisticRegression(class_weight='balanced', max_iter=1000).fit(X_train, y)
# RFC = RandomForestClassifier(n_estimators=1000).fit(X_train, y)
GBC = GradientBoostingClassifier(n_estimators=1000).fit(X_train, y)
# XGB = XGBClassifier(n_estimators=1000).fit(X_train, y)
# LGBM = LGBMClassifier(n_estimators=1000).fit(X_train, y)
SVM_pred = SVM.predict(X_test)
LR_pred = LR.predict(X_test)
# RFC_pred = RFC.predict(X_test)
GBC_pred = GBC.predict(X_test)
# XGB_pred = XGB.predict(X_test)
# LGBM_pred = LGBM.predict(X_test)
pred_list = [SVM_pred,
LR_pred,
GBC_pred]
result = []
for i in range(5000):
count = 0
for pred in pred_list:
count += pred[i]
if count >= 2: # 1이 더 많으면
result.append(1)
else:
result.append(0)
sample_submission = pd.read_csv('/content/drive/MyDrive/dacon/movie_review_analysis/submission.csv')
sample_submission.loc[:, 'label'] = result
sample_submission.to_csv('/content/drive/MyDrive/dacon/movie_review_analysis/submission.csv', index=False)
기존 public score 0.8575에서 3개의 모델을 사용한 결과 0.8615까지 성능이 향상되었습니다.
아직 부족한 실력으로 여기까지가 한계인 것 같습니다. 추후 순위권 분들의 코드공유를 보고 공부하도록 하겠습니다.
감사합니다!
-sjkoding-
'AI Competition' 카테고리의 다른 글
05. [Dacon Basic] 항공사 고객 만족도 예측 경진대회 (최종 2등!!) (1) | 2022.02.08 |
---|---|
04. [Dacon Basic] 집값 예측 경진대회 (0) | 2022.02.08 |
02. [Dacon 교육] Fashion MNIST : 의류 클래스 예측 (csv파일)아주 쉽게 따라하기. (Pytorch 이용) (0) | 2022.01.14 |
01. [Dacon basic], 펭귄 몸무게 예측 경진대회 참가 코드[최종 26위 / 725명, private score : 308.10401(RMSE)] (2) | 2022.01.06 |