[TIL] 20.08.10

우주먼지·2020년 8월 10일
0

TIL

목록 보기
19/28

mobilenet_v2

신경망을 모바일에서도 작동 가능하도록 네트워크 구조를 경량화한 신경망

tensorflow_hub를 통해 불러와서 사용가능하다.

import tensorflow_hub as hub
mobile_net_url = 'https://tfhub.dev/google/tf2-preview/mobilenet_v2/classification/2'
model = tf.keras.Sequential([hub.KerasLayer(handle=mobile_net_url, input_shape=(224, 224, 3))])

Seq2Seq

한 도메인(예: 한글 문장)에서 다른 도메인(예: 영어로 된 문장)으로 시퀀스(sequence)를 변환하는 모델 학습

즉, 문장을 입력받아 문장을 출력받는다.


출처:https://wikidocs.net/24996
위에 사진은 영어문장을 불어 문장으로 바꾸는 모델이다. 영어로 들어온 문장을 토큰화하고 임베딩을 한 후, 단어 하나당 하나의 LSTM을 거친다. 마지막의 은닉상태, 쉘상태를 다음 도메인의 입력값으로 넣어준다.
이때, 들어온 값은 첫번째 LSTM의 은닉상태, 쉘상태 값으로 사용된다.
훈련시는 순서에 따라 진행되는데, 테스트시에는 sos, eos와 단어를 추가하여, 처음과 끝을 명시해준다. 이는 문장 혹은 언어마다 길이가 다르기 때문에 끝과 시작을 표시로 모델에게 알려주는 것이다.

앙상블 학습

여러개의 머신러닝 모델을 연결하여 더 강력한 모델을 만드는 기법이다.
많은 모델중에서 랜덤포레스트, 그래디언트 부스팅을 많이 사용한다.

<앙상블 학습 유형>
1. 보팅(Voting) : 서로 다른 알고리즘의 분류모델을 결합
2. 배깅(Bagging) : 같은 유형의 알고리즘을 데이터 샘플만 다르게 하여 결합
3. 부스팅(Boosting) : 여러개의 분류 모델을 순차적으로 진행. 다음 분류기에 가중치를 부여하여 학습과 예측을 동시에 진행
4. 스태킹(Stacking) : 부스팅에서순차적이 아닌 동시진행이 가능하도록 한 유형


출처 : https://injo.tistory.com/22

logistic_regression = LogisticRegression()
knn = KNeighborsClassifier(n_neighbors=8)

# 개별모델을 소프트보팅 기반의 앙상블 모델로 구현한 분류기
voting_model = VotingClassifier(estimators=[ ('LogisticRegression',logistic_regression),('KNN', knn) ], voting='soft')

voting_model.fit(X_train, y_train)

개별 모델 2개를 만든 후, voting방법을 이용하여 앙상블 모델을 구현했다.
그 후 학습은 같은 방식으로 진행한다.

각 개별 모델의 정확도 보다 조금 높게 나타났지만, 결합한다고 항상 성능이 향상되지는 않는다.

RandomForest

결정트리의 문제점인 과적합을 방지하기 위해 다수의 결정트리들을 임의적으로 학습하여 분류 또는 평균 예측을 출력한다.

일반적으로 의사결정트리보다 성능이 좋고, 파라미터 수가 적어 튜닝도 비교적 간단하다.
랜덤트리는 데이터 포인트를 무작위로 선택하거나 분할테스트에서 특성을 무작위로 선택하여 모델을 생성한다.

<랜덤 포레스트 생성 방법>
1. 생성하고자하는 모델의 개수를 정해준다.
2. 데이터의 bootstrapSample을 생성한다.
3. 생성한 데이터 셋으로 트리를 만든다.
4. 모델에 있는 모든 트리의 예측을 만든다.

model = RandomForestClassifier(n_estimators=5, random_state=0)
model.fit(X_train, y_train)

다른 모델과 같은 방법으로 모델을 생성하는데, n_sstimators를 통해 만들고자하는 트리의 개수를 지정해준다.

fig, axes = plt.subplots(2, 3, figsize=(20, 10))

for i, (ax, tree) in enumerate(zip(axes.ravel(), model.estimators_)):
  ax.set_title('tree {}'.format(i))
  mglearn.plots.plot_tree_partition(X, y, tree, ax=ax) # 속성이 두개일경우만 사용가능

# 랜덤포레스트로 만들어진 결정경계
mglearn.plots.plot_2d_separator(model, X, fill=True, ax=axes[-1, -1], alpha=0.5)
mglearn.discrete_scatter(X[:, 0], X[:, 1], y)


5개의 트리를 시각화해주었다. 마지막 6번째 그래프는 모든 그래프를 결합하여 랜덤포레스트로 만들었다.
하나의 트리만을 출력한 결과는 과적합이 일어난것으로 보이나, 랜덤포레스트로 만든 그래프는 더 좋은 결정경계를 보여준다.
트리의 개수를 늘려주면 더 부드러운 결정 경계를 얻을 수 있을 것이다.

profile
안녕하세요 ㅎㅎ

0개의 댓글