과제 개요

 인간의 내면을 음악으로 듣기 위한 시도는 오래전부터 이루어져 왔다. 1930년대 초기에는 뇌파 알파파의 진폭이나 뇌파 신호의 단순하고 직접적인 특징을 통해 ‘소리’를 만들어 왔고, 1990년대에 이 르러서는 디지털 필터링 및 뇌파 데이터의 분석을 통해 다양하고 새로운 ‘음악’ 생성 규칙을 만들어 왔다.

 본 연구에서는 기존의 ‘뇌파를 통해 음악을 생성한다’는 목적에서 더 나아가, 뇌파를 통해 사용자 친화적인 음악을 생성하는 것, 즉 ‘사용자의 감정을 잘 표현해주는 음악’을 만드는 것을 목표로 한다.  사용자는 이로써 나를 잘 표현해주는, 진정한 ‘나만의 음악’을 갖게 될 수 있다. 또, 긍정적인 감정을 보여주는 뇌파를 알고리즘에 넣어 만들어진 음악과, 부정적인 감정을 보여주는 뇌파를 이용해 만들어 진 음악의 비교를 통해 우리는 인간의 내면을 한층 더 알아볼 수 있을 것이다.

개발 목표

  1. EEG 데이터를 통해 감정에 맞는 음악을 작곡하는 알고리즘 모델 개발
  2. 1에서 구현된 알고리즘을 통해 사용자가 원하는 악기를 사용하여 음악 작곡

 

개발 과정

0. 뇌파란? 

  • 뇌의 전기적인 활동을 머리 표면에 부착한 전극에서 측정한 전기 신호
  • 주파수 범위에 따라서 델타(0.2Hz ~ 4Hz), 세타(4Hz ~ 8Hz), 알파(8Hz ~ 13Hz), 베타(13Hz ~ 30Hz), 감마(30Hz ~ 45Hz)파로 구분

EEG Data Sample

 

1. EEG DEAP Dataset

  • 32명의 참가자 → 총 40개의 1분 길이의 영상을 3초 정도의 준비시간을 가지고 시청
  • Sampling rate를 128Hz로 하여 32개 Channel에서 나오는 뇌파 측정

32 Channel

  • 영상 시청 후, 자신이 느낀 감정에 대해 각각의 Label 별로 수치를 결정
  • Label: 1~9 사이의 실수값으로 정해짐
    • Arousal: 감정의 격함의 정도 → 높을 수록 감정이 격해짐
    • Valence: 감정의 긍/부정 정도 → 높을 수록 감정의 긍정의 정도가 커짐

 

Arousal and Valence Label

 

 

2. Preprocessing (전처리)

  • 첫 3초는 감정 분석에 중요하지 않을 것이라 판단하여 제거
  • 비교적 감정이 뚜렷한 데이터만을 사용하여 정확도를 높이고자 3과 7을 기준으로 Arousal Low /High, Valence Low/High의 네가지 카테고리로 Grouping.

4가지 Category로 Grouping

  • 기존 선행 연구 결과를 참고해 감정 분석에 주로 사용되는 12개의 채널 선정. 
    • 긍정적인 감정은 주로 좌측 전두엽, 부정적인 감정은 주로 우측 전두엽과 연관되어 있다는 연구 결과에 따라 pair로 선택
    • F3-F4 / F7-F8 / FC1-FC2 / FC5-FC6 / FP1-FP2 / AF3-AF4

 

3. Feature Extraction 

뇌파 데이터를 각각 Time doamin, Frequency domain, Time-Frequency domain의 영역에서 14개의 Feature 추출.

  1. Time domain
    • Statistical feature: Mean, Standard deviation, Kurtosis, Skewness
    • Hjorth parameters (Mobility, Complexity)
    • Fractal Dimension (Higuchi, Petrosian)
    • Detrended Fluctuation Analysis
    • Hurst Exponent
  2. Frequency domain
    • Power Spectral Density
    • Maximum Power Spectral Frequency
    • Root Mean Square
  3. Time-Frequency Domain
    • STFT (Short-Time Fourier Transform)

Time domain과 Frequency domain에서 추출한 총 13개의 Feature는 모델 학습 시에 사용하였고, 
Time-Frequency domain 영역에서의 Feature는 음악 작곡 알고리즘의 주요 데이터로 사용.

데이터 전처리 및 Feature Extraction 과정

 

 

4. Modeling 

앞서 추출한 Time domain과 Frequency domain의 Feature를 이용해, Arousal/Valence 마다 High/Low를 분류하는 이진 분류 모델 생성

  • 전체 데이터를 shuffling 한 뒤 train과 test를 8:2로 분리
  • Data가 biased되어 있어 oversampling을 통해 train data의 레이블 값(High: 1, Low: 0)의 비율을 맞춰줌

모델링 과정

 

  • 13개의 기계학습 모델에 대해 Train data를 이용하여 10-fold 교차 검증 시행해 정확도 비교
  • 가장 높은 성능을 보인 3개의 모델(ExtraTreeClassifier, RandomForestClassifier, LGBMClassifier)을 ensemble
  • 최종 결과 Test data에 대해 각 모델 모두 80%의 정확도를 보임.

 

5. Music Composition Algorithm

1. 훈련된 모델을 통해 예측한 Valence를 통해 Major/Minor 결정

  • 12개의 Channel에서 예측된 Label 중 많이 선택된 Label을 선택
    • High: Positive → Major
    • Low: Negative → Minor

Major/Minor 결정

 

2. 훈련된 모델을 통해 예측한 Arousal를 통해 Tempo 결정.

  • 12개의 Channel에서 예측된 Label의 비율을 통해 Tempo 결정
    • High: Excited → Fast Tempo
    • Low: Relax → Slow Tempo

Temop 결정

 

3.  frequency domain의 Maximum Power Spectral Frequency (MPSF)로 Key Chord 결정

  • 감정을 더 잘 나타낼 수 있도록 beta-gamma 대역대에서 MPSF 추출
  • 기본 오른손 주파수 대역대로 Scaling
  • 가장 가까운 Chord를 통해 Key chord와 scale 결정

Valence model로 예측한 결과가 High, MPSF Scaling 결과 C chord에 가장 가깝다면, "C Major Scale"을 이용해 작곡

 

4. Time-frequency domain의 STFT로 Melody 결정

  • 1초 단위로 분할
  • 각 구간 별 최댓값을 가지는 주파수를 3번의 방법으로 Scaling하여 Key Chord의 Scale에 가장 가까운 음을 결정
  • Melody 간격이 너무 넓은 경우, 기존의 박자보다 더 작은 박자로 Interpolation하여 자연스러운 Melody 구성
  • 좀 더 풍부한 음악을 위해, 왼손은 오른손에서 Octave를 2단계 내린 1도 화음을 치게 해 반주 구성

 

GUI (Graphic User Interface)

  1. 박스 안에 EEG Signal Drag and drop
  2. "1. Extract Feature" 버튼을 눌러 12개의 Channel에 대해 총 14개의 Feature를 추출
  3. "2. Emotion Analysis" 버튼을 눌러 Arousal과 Valence 예측
  4. 사용자가 원하는 악기를 선택하고, "3. Convert Signal to Music"버튼을 눌러 2와 3에서 추출한 feature와 예측된 결과를 이용해 음악 작곡
  5. 작곡된 음악은 어플리케이션이 저장된 경로의 music 폴더에 저장됨
  6. "4. Reset" 버튼을 눌러 초기화 한 뒤, 다른 EEG Signal에 대해 1~5번 순서를 반복하여 또 다른 음악을 작곡할 수 있음.

 

기대 효과 및 활용 방안

뇌파 데이터를 통해 ‘나만의 음악’을 만드는 접근 방식은 마음의 세계를 음악으로 표현하려는 시도이다. 본 연구는 특히 사용자의 ‘감정 상태와 유사한’ 음악을 만드는 것이 목적이기에 기존의 연구보다도 내면을 음악으로 표현하는데 더 큰 의의를 가질 것으로 보인다. 사용자는 자신의 내면과 감정이 담긴 음악을 통해 자신의 상태를 피드백 할 수 있게 되며, 나아가 본인이 선호하는 악기 뿐만 아니라 음악의 장르를 선택하여 내면의 감정을 해당 장르의 음악으로 표현함으로써 사용자 내면의 익숙하지 않은 감정에 더 쉽게 다가갈 수 있다.  

 

발표 및 데모 프로그램 시연

 

 

 

오늘은 Fundamentals of C++ Programming/ by. Richard L. Halterman 책의 542-544 Page 코드리뷰를 해보겠습니다.

해당 내용은 C++ 언어의 Class protection level 및 inheritance 와 관련한 내용입니다.

오늘의 코드 리뷰는 다음과 같은 순서로 이루어지겠습니다.

코드에 Class Protection level 관련한 내용이 있으므로, 먼저 Class 3가지 Protection level 살펴본 ,  Comparer(살펴볼 Class 이름입니다) 헤더파일 cpp 파일을 살펴보도록 하겠습니다.

 

클래스는 멤버함수에 대해 세가지 수준의 보호를 지원합니다.

첫번째로, Private level 있습니다. Private Class 보호수준의 기본값으로,  Class 안의 모든 코드는 Private member 엑세스할 있으나, Class 외부의 코드는 엑세스가 불가합니다.

번째로, Protected level 있습니다. Protected Private 같이 Class 안의 모든 코드가 엑세스 있으며, Class 외부의 코드는 엑세스가 불가합니다. 다만 Derived Class, 상속된 Class 엑세스가 가능합니다

세번째로, Public level 있습니다. Public 멤버는 어드 코드에서나 엑세스가 가능합니다.

 

정리하면, Private Class 외부에서 엑세스 없음을 의미하며, Public 엑세스가 가능함을 의미합니다.  Protected 하위 Class 대해 공개 다른 모든 클래스에 대해 비공개를 의미합니다.

 

오늘 리뷰할 Comparer.h 파일 .cpp 파일은 이후에 소개될 selection sort, 선택 정렬 구현에 필요한 class 만드는 내용입니다. Selection sort 관련한 내용은 다음번에 리뷰하도록 하겠습니다.

Comparer 파일은 다음의 기능을 포함합니다.

1)     선택 정렬 기능에 의해 부과된 순서는, Comparison 함수를 custom하여 변경할 있습니다.

2)     정렬 순서를 결정하는데 사용되는 object 정렬시 수행되는 비교 교환 횟수에 대한 데이터를 수집합니다.

또한 코드를 여러 소스파일로 분할하여 사용하며, 미래에 사용할 있는 두가지 Virtual 메소드를 사용합니다.

그러면 이제 Comparer 클래스의 선언이 포함되어있는 17.33 Comparer.h 파일을 간략히 살펴보도록 하겠습니다.

Comparer Class의 Private 영역에는 int 의 compare_count 와 swap_count가 있습니다.
Private 영역에 있으므로 외부에서 엑세스 할 수 없으며, compare 횟수 및 swap 횟수를 추적합니다.

마찬가지로 Private 영역에 int 2개를 input, bool type을 output으로 하는 비교를 위한 함수 포인터가 있습니다.

Protected 영역에는 실제로 비교를 수행하는 메소드인 virtual Compare_impl 함수, 실제로swap 을 수행하는 메소드인 virtual swap_impl 함수가 있습니다. Derived class는 이 두개의 함수를 custom하여 사용할 수 있습니다.

Public 영역에는 적절한 비교함수로 Comparer 객체를 초기화하게끔 하는 생성자가 있고, 새로운 정렬을 준비하기위해 그동안의 compare 및 swap counter를 0으로 만드는 reset 함수, 비교를 위해 int 2개를 받아 bool 로 반환하는 compare 함수,

Inference로 값을 받아와 해당 값을 교환시키는 swap 함수, 객체의 비교 횟수 및 swap 횟수를 반환하는 함수가 있습니다.

다음으로 cpp 파일에 대해 설명드리겠습니다.

먼저 헤더파일을 include 합니다.
#include "comparer.h"

Comparer class의 compare_impl 함수는 int 2개를 받아 판단후 bool로 반환합니다. 

Swap_impl 함수는 int 2개를 reference로 받아 m을 temp에 저장해두고, m을 n값으로 바꿔주고, n을 미리 저장해둔 m 값, 즉 temp와 바꿔줍니다.

다음은 생성자 초기화입니다. Compare_count를 0, swap_count를 0, 그리고 비교연산자 함수를 사용자가 원하는 함수로 초기화하여줍니다. 

Reset 함수는 compare_count와 swap_count를 0으로 만듭니다.

Compare 함수를 사용하면 compare_count 를 하나 올리고, compare_impl 함수를 실행하여 비교를 수행합니다. 

마찬가지로 Swap 함수를 사용하면 int 2개를 reference로 받아 swap_impl 함수를 실행하여 swap을 수행합니다. 함수가 호출되면 swap_count를 하나 올립니다. 
Compare 및 swap 메소드는 virtual 함수로 선언되지 않으므로 derived class는 재정의할 수 없고, compare_impl 및 swap_impl 만 재정의가 가능합니다.
Comparisins 함수를 호출하면 compare_count를 반환하고,  Swaps 함수를 호출하면 swap_count를 반환합니다. 

둘 모두 swap_count 와 compare_count 는 private영역에 존재하기 때문에, 이렇게 Comparer 클라스 내부에 값을 반환해주는 함수를 만들어둔것입니다.


책의 16.3절, Comparer Class 와 거의 동일한 내용이었는데요,

해당 파일과 클래스의 디자인이 달라진점은,

Private, Protected, Public 의 세가지 보호수준을 적극 이용하여 보호할 내용을 보호하고, 엑세스 할 수 있는 메소드를 지정해주었다는 점,

가상 메소드인 compare_impl 및 swap_impl을 정의하고 custom할 수 있게끔 해주었다는 점,

public의 compare 및 swap 함수가 compare_impl및 swap_impl 함수에 작업을 위임한다는 점, 등이 있습니다.

이는 count 횟수를 엄격하게 보고하기 위함이라고 볼 수 있겠습니다. (log 를 확실하게 저장)


이번 코드 리뷰에서는, Protected 및 private 지정자를 적절하게 사용하면 Class 는 drived class 가 수행할 수 있는 직업을 확실히 제어할 수 있다는 점이 배워갈 부분이라고 생각합니다.

과 제 명 국문 파이썬을 통한 AdaBoost-Samme 알고리즘 구현
영문 Implementation of AdaBoost-Samme Algorithm via Python
이 름 김다예


1. 과제 개요
가. 과제 선정 배경
최근 필자는 공모전 주제로써 ‘당뇨병 발병 예측 모델 구현’프로젝트를 진행하였다.
가장 Accuracy 및 AUC 값이 높은 모델을 찾고자, 총 13개의 머신러닝 Classifier 및 MLP 모델을 적용 및 분석해보았고, 각 모델에 대해 gridSearch 및 HyperParameter Tuning을 하며 score(=AUC)을 비교하였다. 결과적으로, 비교한 모델 중 가장 성능이 좋았던 것은 Samme 알고리즘이 적용된 Adaboost Classifier였다. 필자는 AdaBoost Classifier의 적용 방법만 알 뿐, 상세한 알고리즘에 대한 내용에는 무지하였기에 알고리즘을 구현해보는 이번 과제로서 Adaboost Classifier를 조사하고, 실제 구현해보기로 하였다.

그림1.비교한 Classifier 목록/ 그림2. Adaboost에서 최적의 Parameter를 찾는 과정/ 그림3. Threshold에 따른 AUC값의 변화


나. 과제 주요 내용
1) Boosting 및 AdaBoosting 대해 조사한다.

2) Samme 알고리즘의 의사코드를 확인하고, 설명한다.
3) 파이썬으로 AdaBoost-samme 알고리즘을 구현한다.

4) 구현된 AdaBoost 알고리즘을 실제 적용해보고, 결과를 분석한다.



2. 알고리즘 조사 및 설명
가. Boosting 란 무엇인가?
• 매우 단순한 learning 모델을 여러 개 사용하여 성능이 매우 좋은 모델 구축
• 단순한 learning 모델: 무작위 선택보다 성능이 약간 우수한 weak learner
• 무작위 선택보다 약간 우수한 weak learner를 여러 개 결합하는 앙상블 방식
• 모델 구축 시 순서를 고려
• 각 단계의 weak learner는 이전 단계 weak learner의 단점을 보완


나. AdaBoosting 란 무엇인가?
• 이전 단계 weak learner의 단점을 보완하는 새로운 weak learner를 순차적으로 구축
• 매 단계에서 모든 관측치의 Weight를 업데이트 하는 방식으로 학습
• Weak learner: 하나의 node와 두 개의 leaf로 구성된 stump
• Random forest의 tree와 달리 하나의 stump는 하나의 변수만 사용
• Stump가 잘 분류/예측하지 못하는 관측치는 이후 생성될 stump에서 크게 고려함
• 순차적으로 구축된 stump가 최종적인 분류 및 예측 결과에 미치는 영향은 모두 다름


다. Samme 의사코드 및 설명
Adaboost 기법에는 Samme, Samme.R 의 두가지 알고리즘이 있다.
이번 과제에서는 Samme알고리즘을 구현할 예정이다.

다음은 Samme 알고리즘의 의사코드이다.

1) Selecting Stump
• 초기 Sample weight는 모든 관측치에 동일한 값 부여
• Sample Weight는 stump 구축에 사용된 각 관측치의 영향력을 의미
• 각 변수(feature)애 대해stump생성(변수가 3개라면 stump도 3개)
• Gini Index가 가장 작은 stump를 해당 단계의 weak learner로 사용


2) How much say this stump
• 선택한 weak learner가 최종 예측값에 얼마나 큰 영향력을 행사하는지 파악
(최종적인 분류 및 예측 결과에 대한 해당 stump의 영향력)

• 위의 식에서 Total error = 잘못 분류된 관측치의 sample weight총 합

3) update sample weight
• Stump의 분류 결과를 반영하여 sample weight 업데이트
• Sample weight를 업데이트하여 이후 생성되는 stump가 오분류된 관측치에 집중하게 함
• 업데이트 된 Sample weight를 사용해 다음 단계의 stump를 구축하기 위한 새로운 dataset 생성
• 생성된 dataset은 새로 생성될 stump가 직전 stump에서 오분류된 관측치에 더욱 집중하게 함
• 이후 다시금 개별 관측치의 weight와 stump의 영향력을 순차적으로 계산 및 sample weight 업데이트를 반복하며 학습
• 최종적으로 amount of say의 합을 통해 classification



3. Samme 알고리즘 구현 via 파이썬
가. Samme 알고리즘(Adaboost모델) 구조 설정
Class DecisionStump : Stump를 만드는 Class -> 이후 Adaboost class에서 이용
def __init__(self) : HyperParameter 설정 (polarity, Feature_idx, Threshold, alpha)
def predict(self, X) : 예측값을 반환하는 함수
return predictions
Class Adaboost
def __init__(self, n_clif=5) : HyperParameter 설정 (n_clf, clfs)
def fit(self, X, y) : train_X_data, train_y_data를 받아 fit 하는 함수
def predict(self, X) : 예측할 dataset을 받아, 예측된 y값을 반환하는 함수
return y_pred


. 알고리즘 구현

class DecisionStump:
def __init__(self ):
self .polarity = 1
self .feature_idx = None
self .threshold = None
self .alpha = None

def predict (self , X ):
n_samples = X.shape[0]
X_column = X[:, self .feature_idx]
predictions = np.ones(n_samples)
if self .polarity == 1 :
predictions[X_column < self .threshold] = -1
else :
predictions[X_column > self .threshold] = -1
return predictions

class Adaboost:
def __init__(self , n_clf =5 ):
self .n_clf = n_clf
self .clfs = []

def fit (self , X , y ):
n_samples, n_features = X.shape
# 가중치를 1/N으로 초기화
w = np.full(n_samples, (1 / n_samples))
self .clfs = []
# classifier 를 통해 반복함
for _ in range (self .n_clf):
clf = DecisionStump()
min_error = float ("inf")
# greedy search 를 통해 최상의 임곗값 확인
for feature_i in range (n_features):
X_column = X[:, feature_i]
thresholds = np.unique(X_column)
for threshold in thresholds:
# polarity = 1 로 예측
p = 1
predictions = np.ones(n_samples)
predictions[X_column < threshold] = -1
# Error = 오분류된 Sample weight의 합
misclassified = w[y != predictions]
error = sum (misclassified)
if error > 0.5 :
error = 1 - error
p = -1
# 최고의 성능을 내는 결과값을 저장함
if error < min_error:
clf.polarity = p
clf.threshold = threshold
clf.feature_idx = feature_i
min_error = error
# alpha 계산
EPS = 1e-10
clf.alpha = 0.5 * np.log((1.0 - min_error + EPS) / (min_error + EPS))
# 예측값 계산 및 weight 업데이트
predictions = clf.predict(X)
w *= np.exp(-clf.alpha * y * predictions)
# weight 값 정규화
w /= np.sum (w)
# classifier 저장
self .clfs.append(clf)

def predict (self , X ):
clf_preds = [clf.alpha * clf.predict(X) for clf in self .clfs]
y_pred = np.sum (clf_preds, axis=0 )
y_pred = np.sign(y_pred)
return y_pred


4. 구현된 Samme 알고리즘 실제 적용
가. Test 환경 설명
• Dataset : sklearn에서 기본적으로 제공하는 breast_cancer() dataset을 이용함
• Score : Accuracy를 기준으로 측정
• Trainset, Testset비율 : ‘8:2’ 로 Split
• n_clf : 5로 설정함

나. Test Code
1) 직접 구현한 Adaboost를 통한 Test
if __name__ == "__main__":
from sklearn import datasets
from sklearn.model_selection import train_test_split
def accuracy (y_true , y_pred ):
accuracy = np.sum (y_true == y_pred) / len (y_true)
return accuracy
data = datasets.load_breast_cancer()
X, y = data.data, data.target
y[y == 0 ] = -1
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2 , random_state=5
)
# 5 weak classifiers를 이용한 Adaboost Classifier (구현한 모델 이용)
clf = Adaboost(n_clf=5 )
clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)
acc = accuracy(y_test, y_pred)
print ("Accuracy:", acc)

Test set Accuracy: 0.9736842105263158

2) Sklearn Labrary 에서 제공하는 Ababoost를 통한 Test
def accuracy (y_true , y_pred ):
accuracy = np.sum (y_true == y_pred) / len (y_true)
return accuracy
data = datasets.load_breast_cancer()
X, y = data.data, data.target
y[y == 0 ] = -1
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2 , random_state=5
)
# 5 weak classifiers를 이용한 Adaboost Classifier (sklearn 모델 이용)
model = AdaBoostClassifier(n_estimators=5 , random_state=42 )
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
acc = accuracy(y_test, y_pred)
print ("테스트 세트 정확도 : ", acc)

Test set Accuracy: 0.9649122807017544



과제는 해도해도 끝이없고,...

시험기간인데 밀린 녹강 들을 시간도 빠듯하고....

왜이렇게 바쁜것인가...!!!!!!??? 바빠서 최근에는 Tistory에 글도 못썼다..!!

최근에 뜬금없이 AI데이터톤/SW페스티벌 등 참가하느라 그런가.. 정말 너ㅓㅓㅓ무 바쁘다. 시상식도 갔어야했고..

이번학기는 6전공을 하고있는데 6전공은 진짜 할게 안되는것같다. 

더구나 나는 학업 뿐 아니라 이것저것 다른 활동을 하고있으니 -_- 진짜 예습은 커녕 복습도 못하겠다.

진짜 어떡하냐................ 이제 다 내려놓고 시험공부만 하고싶은데,,, 시험기간인데도 교수님께서 내주신 과제가 너무많다!

그렇다고 미루고 미루다 이렇게된게아니다........... 지금까지 미친듯이 과제만 하며 냈는데...하....

ㅠㅠ ㅍㅏ이팅... 이번학기 끝나고 원래 계절 들을생각이었는데, 안듣기로 마음을 굳혔다.

대신 랩실에서 진행하는 개인연구 제대로 진행하고, 토익/텝스 같은 영단어 공부하고,

그동안 바빠서 못올렸던 밀린 글들 Tistory랑 github에 업로드하고, 간간히 공모전이나 데이콘 참여해야겠다.

아! 그리고 가능하면 미뤄뒀던 SQLD 나 전문가 자격증도 따고싶다. 방학도 진짜 바쁘겠구나...

그런데 다음학기부터 4학년이라는걸 생각하면 또 안바쁘게 살수가 없다.!

 

Today #12.3# -금!! <시험까지 D-12>
~12.7 (화)
AS#3 제출
​~12.10 (금)
Lab13, Pj2
~12.12 (일)
알고 최종보고서제출
~12.14(화)
알고 최종결과설명 Youtube 제작(10분)
12.15~16 데센프,인공론 / 기계, 객프 기말고사
~12.18 
인공 최종보고서 제출
~12.19 
인공 Youtube 제작
~12.19 (일)
Lab14
 12.20 알고 기말고사​
~12.24
데캡디 최종보고서들
 

 

 

이번학기는 유독 과제가 많은것같다....................................
더구나 곧 논문쓸수도있는 팀 프로젝트를 동시에 진행해서..... 그거하느라도 더 바빴던듯하다...

제발살려달라제발시험공부하게해달라

안녕하세요! 시험기간이기도 하고, 이래저래 진행되는 프로젝트나 일정이 많아 오랜만에 인사드리게 되었네요.
오늘의 소식은 전국구 데이터톤! Artificial Intelligence Diabetes Datathon, AIDD -인공지능 당뇨병예측 모델개발에 참여하여 최종2위의 성적으로 최우수상을 수상하게 되었다는 것입니다! 짝짝짝🎉

아싸300만원


AIDD는 과학기술정보통신부, 한국지능정보사회진흥원이 주최하고 경희의료원이 주관한 인공지능 데이터톤입니다!
(제가 경희대 재학중인데 우연히 겹쳤네요..ㅋㅋ)

주제는 당뇨병 및 합병증 추적 관찰 데이터를 활용한 당뇨병 발병 예측 인공지능 모델 개발로,
인공지능 학습용 데이터 구축 사업 중 ‘당뇨병 및 합병증 추적관찰 임상데이터’ 과제의 일환으로 진행되었다고 해요.

제가 이 블로그에 예에에에전에 업로드 한 글 중 '의사결정나무를 이용한 당뇨병 진단 모델개발'프로젝트가 있었는데,
그때 '교수님께서 모델로는 의사결정나무 단일모델을 사용해야하며 엑셀로 직접 Entropy 등을 계산해 풀어야한다'고 제한을 두셔서 정확도가 높은 모델을 개발하지 못해 아쉬움이 남는다고, 후에 좀 더 자유로은 환경에서 정확도 높은 모델을 개발해보겠다고 말을 꺼냈었는데, 그 다짐을 이렇게 지키게 되네요.

AIDD 데이터톤의 참가대상은 국내 AI, 빅데이터 관련 기업 및 연구기관 종사자, 대학/대학원생이 1~5명 단위의 팀을 구성해 누구나 참여할 수 있었고,
저희는 같은 랩실의 학부연구생 및 석사연구원이 팀을 이뤄 참여하였습니다. (AIMS)
누구나 참여할 수 있다보니 참가자분들도 다양하더라구요. 카이스트, 포항공대 재학생을 포함해 서연고서성한 등의 학생들, 석사생들, 교수님들, 인공지능 관련 책을 쓰신분들까지...

듣기로는 총 참가신청한 팀은 132 팀이었고,

그 중에서 서류 전형으로 예선에 참가할 40팀을 선정하고, 예선에서 본선에 참가할 20팀을 선정하고,

본선에서는 상위 4위까지를 선정하는 방식이었는데요!

이때 NSML 리더보드를 통해 모든 팀의 실시간 score와 순위를 확인할 수 있어서 더 승부욕이 돋고 재미가 있던 것 같습니다. (NSML 리더보드 사용법은 추가적인 글로 간단히 게시해둘 예정입니다)

예선이 딱 3일, 본선도 딱 3일이고, 1시간 당 최대 1번씩 Submit해야한다는 제한이 걸려있어서 적은시간, 적은기회 안에 타임어택으로 높은 점수를 노려봐야했었는데,
그러다보니 다들 합숙을 하시는건지.... 정말 꾸준히 submit 을 하시더라구요...
대회 진행 기간인 총 72시간, 그러니까 즉 72번의 submit 기회중에서 69번을 submit 한 팀도 있었습니다. (-> 이분들이 1등)
물론 저희 팀도 분석하느라/논의하느라 자주 밤을 샜습니다...^^,,,,, (기진맥진)
그런데......... AIDD 에서 분석시 사용되는 데이터가 의료 데이터다보니, 개인정보가 중요하다며 주최측에서 데이터셋을 주지 않아서,
참가자들은 데이터셋의 Feature 종류만 알고 데이터의 분포 등을 확인하지 못한채로 오직 서버에서 데이터를 사용하여 훈련시켜야하고,
테스트셋에는 아예 접근 자체(보는 등)를 할 수 없어서 로컬PC에서는 모델의 score값을 볼 수 없는 구조였습니다.
(score=AUC값)
즉, 우리 팀의 score를 확인할 수 있는 유일한 기회는 1시간에 1번있는 submit 을 통해서 였던거죠...
그나마 Validation set을 이용해서는 score를 확인할 수 있었으나, Test set 과는 또 차이가 있으니.. 사실상 스스로 모델을 평가할 수 있는 지표가 거의 없었다고 볼 수 있습니다.
1시간에 1번씩 성능을 확인할 수 있다면 모델이 개선되는 속도가 느릴 수 밖에요.. 이 점이 진짜 진짜 불편했습니다. -_-

왜 이렇게 한거에요.....!!!! 분석할 데이터셋에 대해 아무것도 알 수 없으면 그게 분석일까요? 최적 모델/파라미터 찾는 노가다지....!!!! ㅠㅠ

교수님께서도 데이터분석 공모전을 진행하는데 데이터셋을 안주는건 아닌것같다고 하셨습니다.


이게 본선 리더보드인데요~ 2 위에 랭킹되어있는 AIMS 가 저희 팀입니다!
수상팀의 최종 Score는 1등팀 0.903932, 2등팀(우리) 0.887426, 3등팀 0.866463, 4등팀 0.859686 으로 마무리가 되었습니다.
모델 평가시 사용된 'Score'는 ROC-Curve 하단 영역의 넓이, 즉 AUC 값 이었습니다.
그런데 저는 이해가 안됐던게, ROC-curve를 그릴때 당연히 True Label과 Predict 'Probability' 를 input 하여 구해야하는데, 이 데이터톤에서는 Predict Probability가 아니라 Predict Label을 넣어 구한다는 것입니다.
그러면 ROC-curve 그래프에는 대각선의 끝과 끝을 잇는 점과, 그 중간의 하나의 점만(Threshold=1개) 찍히게 되고 결과적으로 삼각형의 형태를 가지게 되죠.
ROC-curve는 보통 그렇게 안그릴텐데 왜 이렇게한건지 잘 모르겠습니다.
모델 개발을 하다 느낀것은.... score = 0.90 과 0.88 사이에는 엄청난 벽이 있고, 0.88 과 0.86 사이에는 엄청난 벽이 있다는 것입니다.. 물론 0.86 언저리까지 오는데도 벽은 있지만요..

아무튼! 이번 데이터톤이 제 인생에서 처음으로 참가한 인공지능 개발 챌린지였는데, 좋은 성과를 얻어 기쁩니다 :>
대회가 진행되던 6일동안 랩실 선배님들과 함께 이런저런 논의를 하며 공부한것도, 학습에 큰 도움이 되었습니다.
선배님들이 진짜 캐리하셨어요.. 다들 고생하셨어요 TT

곧이어 부정맥 진단 모델 개발 인공지능 데이터톤도 참가할 예정인데, 이건 주최측의 사정으로 일정이 미뤄지는바람에 시험기간과 겹쳐서........ 할지 말지 살짝 고민중입니다. -> 미참가로 결정
저는 밀린 과제/수업/일정 등등이 많아서.. 나중에 글을 또 쓰도록 하고 이만 줄이겠습니다.
안뇽



+12.08 추가)
내일(12.09) 시상식 및 모델 발표가 오프라인/온라인으로 있습니다!

코로나때문에 발표자 1명만 오프라인으로 참석할 수 있고, 남은 팀원은 온라인으로 참석해야한다고 하더라구요. (아쉽)

시상식 후기는 내일 이 글에 추가적으로 남기기로 하고,

저희가 구현한 모델을 설명하는 글을 따로 올릴까는 생각중에 있습니다.

아마 시험이 끝나고 업로드하게되지않을까싶네요! 


+12.09 추가)
시상식이 끝난후, 짧은 후기!!

시상식은 말씀드린대로 온/오프라인 혼합 형태로 이루어졌고, 랩장님이자 팀장님께서 오프라인으로 발표를 하러 가셨습니다!

저는 온라인으로 시상식을 봤는데, 1등팀하고 4등팀이 포항공대 학생들, 3등팀이 모 대학의 교수님들이셨습니다! ㄷ.ㄷ,,

시상과 함께 각 팀의 모델 설명(발표)을 들을 수 있어서 유익한 시간이었던것같습니다. (대체 1등팀 무슨짓을한것인가 했는데!)

괜히 저희 팀 이름 한명한명 불리면서 상을 주시니 감격스럽더라구요.

다음에도 또 랩실 인원들과 함께 좋은 대회에 참여할 수 있었으면 좋겠습니다 :>

 

 

 

 

 

 

11.14(일)

------------- 기말고사까지 한달 - - - - - - - - - - 
 
11.15(월)
7-9 인공론cnn제출
3-6 수업(인공/알고) 
7-8 오엑스리허설
8-9 데캡디 회의
10-11 댓글 회의/ 소개작성
 
11.16(화)
10:30-3 기계/객체 수업
4-8 데센프 as2
8-10 주가돌리기
11-12 주가회의
 
11.17(수)
3-10 숙면
드럼녹음듣기
3-6 수업
7-8 드럼수업/계절희과담
10-11 ie밤 리허설
1-4 데캡디feature확인
4-10 숙면
 
10 기상
10-1 데캡디
1-3 수업
4-5 데캡디 회의
7-3 개인연구/밀린수업/Lab11
 
9-10 수업(1)
10-3 개인연구(ppt제작?)
4-6 랩미팅
6-7 행사전 마지막확인(ppt제작?)
7-10 ie밤 행사
10~ 공모전예선(총 4일) 
<<수업/주가/댓글>>
 
공모전예선
복습/온강/시험준비
개인연구/데캡디/주가/댓글
오삐약만나기? - - 3시간놀/나머지공부
 
공모전예선
데캡디
복습/시험준비
 
 
 
 
---------------- 이후 제출 준비 - - - - - - - - - 
 
월 
공모전예선종료
 

똑같은거 찾고 잊어버려서 똑같은거 또 찾고 하는데 지쳐서 기록용으로 작성...

직접 써보고 확실히 작동하는것만 하나씩 채울 예정... 

 

파일의 n번째행 삭제

sed -i nd filename

 

파일 병합

먼저 병합하고싶은 파일이 있는곳으로 이동 (cd )

cat filename1 filename2 filename3 > mergefile

* 컬럼명도 붙여넣어지므로 확인 후 삭제하고 병합할것

 

파일의 특정 컬럼 값 몽땅 원하는 값으로 바꾸기

sudo apt install gawk

gawk -i inplace 'BEGIN{FS=OFS=","}{$바꾸고싶은컬럼넘버 = 바꾸고싶은내용}'1 파일이름.csv

 

~ 발표후기 ~

바빴던 2021년! 2021년의 절반의 시간을 들여 진행한 댓글분석 웹페이지 제작 프로젝트가 상위 8팀 안에 들어 은상을 수상하게 되었습니다! (짝짝짝) -> 300만원... 흐흐

저번주 주말에 저와 또 다른 팀원 둘이서, 팀을 대표하여 서울의 코엑스로 발표를 하러 갔었는데요.

발표 + 완성된 작품시연을 해야해서 혹시나 시연중에 오류가 뜨면 어떡하지 긴장이 되었었는데, 무사히 잘 넘어갔습니다. 질문도 어느정도 예상하던 질문이 나와 잘 대처할 수 있었어요.

사실 발표 아침까지도 웹페이지에 넣을 추가적인 코딩을 하느라 바빴었습니다. 뉴스 분석 페이지에 들어간 감성분석 모듈이, 기존에는 감성사전을 이용해 하는것으로 만들었다가 논의끝에 딥러닝 모델을 이용해 감성분석을 하는것으로 발표 1주전에 결정났거든요.. 쇼핑몰 페이지나 뉴스페이지의 감성분석 파트는 제가 전담했었기때문에, 후반부부터 딥러닝 모델로 변경하느라 혼자 마음이 급했던 기억이 납니다.

다행히 발표 전날까지는 완성을 했지만... 완성된 감성분석 모듈을 페이지에 넣고 보니, 사용자가 입력한 URL을 댓글을 긁어오고 댓글을 하나하나 분석해 Label을 붙이는데 생각보다 시간이 너무 오래걸려서 웹페이지에 못넣겠다는 판단이 되어서, 댓글 하나하나가 아니라 한꺼번에 예측할 수 있도록 하고, 더 모델 복잡도가 작으면서 정확도는 유지할 수 있도록 하는걸 발표날 아침까지 수정하고 또 수정했었습니다. 무사히 작동해서 다행이에요.

 

다음에는 12.3일에 일산 킨텍스로 시상 및 전시를 하러 갑니다. 전시를 대비하여 저희 웹사이트도 로딩페이지 추가, UI의 대대적인개편 등의 버전 업그레이드를 하였습니다. 다음에는 전시 및 시상식 후기를 남기도록 할게요.

 


 

~시상식 후기~

ICT 멘토링엑스포! 엑스포 겸 시상식이 일산 킨텍스에서 열렸습니다!

 

이런식으로 포스터? 를 걸어두고 이 앞에서 작품 전시를 했습니다. ㅎㅎ

저희는 40인치 모니터를 빌려서, 웹페이지 전시를 했어요

 

약 반년동안의 프로젝트가 정말 끝났습니다.

댓글분석 웹페이지 프로젝트는 끝났지만 앞으로도 열심히 살아보도록 하겠습니다 .!!!

 


 

아래는 블로그에 조금씩 올렸던 프로젝트 자료 모음..

빅데이터를 이용한 댓글 분석 및 시각화, 댓글대시 서비스(0. 글을 올리기 전에)

 

빅데이터를 이용한 댓글 분석 및 시각화, 댓글대시 서비스(0. 글을 올리기 전에)

 안녕하세요! 저번에 대외활동으로 주식 가격 예측 프로그램을 만드는 팀 프로젝트를 하고 있다고 글을 올렸었는데, 이번에도 그 대외활동에서 동시에 하고있는 팀 프로젝트에 관련해 글을 올

checherry.tistory.com

 

빅데이터를 이용한 댓글 분석 및 시각화, 댓글대시 서비스(1. 개발설계).

*** 업로드된것은 초창기의 개발설계서입니다. 시험이 끝난 후 최종 개발설계서로 글을 수정할 예정입니다.

 

빅데이터를 이용한 댓글 분석 및 시각화, 댓글대시 서비스(1. 개발설계)

 

checherry.tistory.com

빅데이터를 이용한 댓글 분석 및 시각화, 댓글대시 서비스(2. 수행계획+1차보고서)

 

 

빅데이터를 이용한 댓글 분석 및 시각화, 댓글대시 서비스(2. 수행계획+1차보고서)

요 약 본 작품 정보 프로젝트명 국문 빅데이터 댓글 분석 및 시각화(키바나), 댓글대시 서비스 영문 Big-data Analysis of Comments and Visualization 작품 소개 네이버 뉴스, 영화, 쇼핑몰의 URL을 받아 댓글

checherry.tistory.com

 

빅데이터를 이용한 댓글 분석 및 시각화, 댓글대시 서비스(3. 최종보고 및 시연영상)

 

빅데이터를 이용한 댓글 분석 및 시각화, 댓글대시 서비스(3. 최종보고 및 시연영상)

들어가는 말.. 최근 인터넷이 발달하고 사용자가 급증함에 따라, 인터넷을 통한 정보 교환이 활발하게 이루어지고 있습니다. 네이버 뉴스의 댓글을 읽으며 여론을 파악하신 적이 있으신가요? 네

checherry.tistory.com

 

노트북 배터리 충전기가 고장났다.
고장난 당시 내 노트북 배터리는 10퍼도 안됐다.
안돼애에앵엥에에에에에.......
너랑 해야할게 많단말이야...
근처에 바로 충전기를 구매할곳이나 빌릴만한 사람이 떠오르지않아서 pc방을 가야하나 고민하다가,
아 랩실에 내 자리가 있었지! 하고 오후6시쯤에 얼른 달려갔다.
요즘 코로나때문에 버스 막차가 빨라져서 12시가 되기전에 끊기는데,
그거 타고갈때까지 오늘 해야할걸 못끝낼거같아서 밤을 새우고 첫차를 타고가기로 마음먹었다.
팀원이 해오기로한 ppt를 취합해서 내일 오후1시까지 내야하는데 연락이 안되고 주기로한 시점이 지나서, 맘이 급해서 더 급하게 랩실에 왔는데. 다행히 랩실에오니 연락이 닿았다. 휴
어쨌거나 ppt 받고 최종 수정 및 추가, 검토해서 보냈다. (이거하는데만 3시간 걸렸다 =_=)
그거말고도 내일 데캡디 회의때 가져가야할 자료조사도 해야했고.. 학생회 메타버스 ox퀴즈 진행방식이랑 메뉴얼도 만들어야했고.. 해서 이래저래 할게 많았다.
급하게 하다보니 타자가 세게 쳐져서 조금 시끄러웠을것같아 걱정이다. 그래서 키스킨을 하나 샀다. 사는김에 동일 키보드 사용하는 다른 분들거도 같이 샀다.
시험기간동안 랩실에 안오다가 어느정도 시험이 끝나고 오랜만에 오니까 또 좋더라.
새벽의 랩실에는 나 혼자 있었다. 그런데 ... 갑자기 건들이지도 않은 프린트기가 혼자서 막 작동하더니 웹서버 관련 코드를 막 뽑아내더라. 뭐지????? 하고 가서 정지시켰는데 혼자 또 작동하더니 똑같은 코드를 뽑아내더라. 그래서 종료해버렸다. 뭘까... 뭐지? ... 얘기를 들어보니 새벽에 저 프린터기가 종종 저런다고한다. 가장 그럴듯한 가설은 다른 방에서 프린터를 하는데 연결이 우리 프린터기에 돼서 나오는가 싶기도 한데.. 하필 왜 새벽에 저럴까?..
아무튼 나는 새벽5시-5시30분경 있는 첫차를 타고 집에 돌아왔다.
역시 집이 좋다. 근데 집청소는 언제하지... 청소할시간이없다.
일단 이번주가 진짜 바쁘고, 일요일만 지나면 조금은 덜 바빠질것같아서 그때까지는 해야할일에 매진해야겠다.

가장 걱정은 그동안 다른거하느라 개인연구 진전이 하나도 없다는점.. 근데 금요일에 3주만에 랩미팅 하면서 업데이트 발표 해야한다는점... 하하...하... 내일 일어나서부터 금요일 발표할때까지 개인연구 관련만 해야겠다. 가뜩이나 우리 랩실 교수님 수업 중간고사 망쳤는데.. 이거라도..해가야....내가......덜죄송하지....후...ㅠㅠ...
변명을하자면.. 그 수업 시험이랑 같은 날에 다른 수업도 시험이었고, 그 수업은 중간고사 오픈북에 계산문제 안나온다고해서 그동안 짠 코드 검색해가면서 하면 되겠네! 하고 완전 마음놓고 다른 수업 공부만 하고 그 수업은 상대적으로 매우 덜하게되었는데 ......
시간대비 문제량이 많아서 망했다. 그리고 제출할때 인터넷오류인지뭔지 제출이 잘 안됐어서 또 망했다.
반면 그 수업대신 공부한 다른 수업은 매우 잘봤다. 만점이 100점인데 110점 맞았다.(보너스문제가있어서..)
차라리 랩실 교수님걸 공부할것을........
너무 맘에 쓰인다. 문득문득 생각이 난다...... 기말에는 꼭 제대로 공부해서 볼게요 교수님..

오늘은 이만 자야겠다. 내일 일찍인나서 실강들어야한닷.!


+ 맞다 오늘 바빠서 드럼연습도 못갔다.. ㅠㅠ 이거도 오랜만에 다시 연습 시작하는 날이었는데 .. 담주부터는 꼭 가야지 !! 악보출력



최근 일주일 - 해야할 것
-----------------------------------------------------
데캡디(11.4목, 4시회의)
Feature 조사, 추가Feature 계산, 라벨에 따른 시각화

개인연구(-11.5금)
데이터셋확인, Encoding-Decoding 확인, 연구방향 확립
-> 계획서(문서) 및 발표PPT 제출

데센프중간대체(-11.7일)
기업 후보 : 루닛, 뷰노, IBMwatson,

객프Pj1지뢰찾기(-11.7일)

녹강듣기(!)
데센프 등 관리

발표ppt수정/ 회의11. 5금, 발표11.6토
영채님이 보내주시면 수정 및 추가

학생회(
11.4목22시회의)
메타버스 OX 게임진행/메뉴얼 작성
노아님 의견 정리해서 추가


--------—-----------------------------------------
일요일 지나면 개인연구/데캡디/학점에 더 신경쓸수있을듯!!

11.4(목)
12 기상
1-3 수업
4-5 데캡디회의
5-10 개인연구조사
10-11 학생회회의
11-2 개인연구조사
3~ 숙면

11.5(금)
10-12 데캡디발표, 개인연구조사
12-3 개인연구조사
4-6 랩미팅
7-8 위클리리포트작성
8-10 녹강듣기
10-11 댓글분석회의
1 샤워 후 숙면

11.6(토)
일찍기상, 코엑스로..
10시 도착
1시20-3시30 진행 후 철수
4-8 코엑스구경, 저녁
8-12 카페공부(데센프중간대체, 객프지뢰찾기 일부)
1-2 집으루
3 숙면

11.7(일)
11-16 데센프 중간대체작성
17-23 객프pj1 지뢰찾기구현

이후 녹강 ㅠㅠㅠㅠㅠ 수업 ㅠㅠ제발듣고싶다 바쁘다

'일상·미래 > 일상생각·계획' 카테고리의 다른 글

12.03-12.24 DailyPlan  (0) 2021.12.03
11.14-22 DailyPlan  (0) 2021.11.18
10.29~11.7+a DailyPlan  (0) 2021.10.29
🎇소프트웨어융합학과 복수전공 합격했다!🎇  (0) 2021.10.27
왜 열심히 안하세요?  (0) 2021.10.15

하.. 오늘 회의만 3 번 했다....
기진맥진이다.... 말을 너무 많이했다.
뭔가 앞으로 해야할게 너무 많고 난잡해서 다시 일정을 정리한다!
/데분캡/주가예측/댓글분석/시험/개인일정 기준 작성이다!
---> 수업은 기재하지 않음. 꼭 챙겨듣기

10.29(금)
오전 11~12:20 : 데분캡 발표 / 이후 보고서 작성
오후 8시 : 키위옴
10.30(토)
오후 8시 : 키위감
10.31(일)

11.1(월)
오전10시 : 데센프 과제설명회
오후4시: 산경알 중간고사
오후10시: 댓글분석 회의 (이전까지)-발표자선정/제출물확인
- 코드 개선 업로드 ( 쇼핑몰 크롤링 코드개선, 뉴스 감성분석 코드 개선)

11.2(화)
오후 4시~ 랩실

(Sentimental 부분만 ppt 제작해주기)

(1시~ 객프 수업듣기/ 그외 녹강듣기 { 기계1, 데센프2, 인공론1 } )


11.3(수)
오후 7시 : 드럼연습

11.4(목)
오후 1시 : 공모전 3차 접수마감
오후 4시 : 데캡디 회의
- Feature (MAX-PSF, MAX-PSD, RMS) 조사
- Label 별 Feature EDA/ 시각화 해보기
오후 6시 랩실

11.5(금)
오전 9~12 : 데캡디 중간보고서 제출 / 데캡디 수업

오후 4~6 : 랩미팅 (3주치&PPT준비)
- 데이터셋 확인(EEG, eye-tracking)
- Encoding/Decoding 개념 확인 및 조사
- 연구 방향 계획서/PPT 제작

오후 10시 : 댓글분석 회의-(발표대본확인/질의응답지확인)
- 추가 코드 개선 업로드
- 발표 대본, 질의응답지 업로드

11.6(토)
공모전 오프라인(코엑스) 전시 및 발표

11.7(일)
데센프 중간대체 과제 마감
객프 PJ1 지뢰찾기 구현 마감

---------이후 학부연구, 학업, 기말고사, Sqld시험 에 집중!! ------

11.13(토)
오후 10시 : 주가예측 회의
- Clustering 된 데이터셋 받아서, AutoML 돌리기(Pycaret 말고 다른거*camcan 등 도 써보기)
- 기존모델 vs cluster모델 / 랜덤군집 vs 특정 군집 정확도 확인

11.16(화)
데센프 Assign#2 제출

11.19(금)
IE의밤 학과행사 - 메타버스
- ppt자료 제작, OX퀴즈 및 동선 확인

11.20(토)
Sqld 시험

----- 이하 생략 ----

여담으로 오늘까지 시험을 3개 쳤다.
1개는 잘봤고 (그런데 비중이 15%..ㅠ)
1개는 꽤 잘본거같고
1개는 폭망했다.

 



..

+ Recent posts