전체 글 (124) 썸네일형 리스트형 Decision Tree 자료출처 1. 목표 feature들을 기반으로 결과를 분류하거나 예측 결과는 규칙들의 집합 아이가 오늘 놀지 안놀지에 대해서 예측하는 문제를 보자. 맨 위를 보면 노는게 9, 안노는게 5로 총 14일의 데이터가 있다. 맨 위에서는 그 날의 바깥 날씨가 어떤지를 가지고 분기(split)를 하였다. overcast의 경우 play만 있기 때문에 완벽하게 분류되었다. sunny로 분기된 다음에 습도에 따라 분기하였고 rain으로 분기된 다음엔 바람이 부는지 안부는지에 따라 분기하였다. 데이터 분석을 할 때 트리 기반 모델을 사용하는 이유 중 하나가 이런식으로 예측 결과물에 대해 사람의 언어로 설명이 가능하기 때문이다. 2. 용어 정리 root node : 부모 노드가 없고 자식 노드만 있는 노드 leaf no.. KNN K-Nearest Neighbor로 대표적인 지도학습 알고리즘이다. 새로운 데이터가 들어왔을 때 기존 데이터의 그룹 중 어떤 그룹에 속하는지 분류하는 문제를 말한다. 자주 사용되지는 않지만 가끔 성능이 괜찮은 경우가 있다. 이 글을 쓰게된 이유도 지금 하고 있는 경진대회에서 KNN이 성능이 최고는 아니지만 준수한 성능을 보여서 다른 모델과 ensemble을 시도해보려고 하고 그런 김에 내용을 정리해 두면 좋을 것 같아서 쓰게 되었다. 우선 uniform 방식으로 원리를 설명하자면 다음과 같다. 만약에 탐색할 이웃 수를 3로 설정한다면, 새로 들어온 별과 가장 가까운 이웃 3개는 네모 2개, 동그래미 1개이기 때문에 별의 그룹은 네모로 결정된다. sklearn의 KNeighborsClassifier 기준으.. 8장 어텐션 (2) 양방향 RNN 앞에서 배운 Encoder에 초점을 맞춰보자. 그 구조는 다음과 같았다. 여기서 주목할 것은 모델이 왼쪽에서 오른쪽으로 처리한다는 것이다. 즉 '고양이'에 대한 은닉 상태를 만들어낼때는 '나', '는', '고양이' 까지 세 단어의 정보가 인코딩되어 들어간다. 여기에서 전체적인 균형을 생각하면 '고양이' 단어의 주변 정보를 균형 있게 담는 것이 좋을 것이다. 그래서 LSTM을 양방향으로 처리하는 방법을 생각할 수 있다. 왼쪽에서 시작하는 TimeLSTM 계층과 오른쪽에서부터 시작하는 TimeLSTM 계층이 만들어내는 은닉 상태 벡터를 concat하여 정보를 균형있게 인코딩할 수 있다. 구현 할 때도 하나의 입력이 "abcd"이었다면 다른 것은 "dcba'로 순서를 바꿔 입력하면 된다. cla.. 8장 어텐션 (1) seq2seq의 문제점은 Encoder의 출력이 '고정 길이의 벡터'라는 것이다. 기계번역을 예로 들면 입력 문장이 길어지게 되면 필요한 정보를 충분히 인코딩할 수 없을 것이다. 따라서 이를 해결하기위해 Encoder와 Decoder를 개선해보자. Encoder 개선 지금까지는 LSTM 계층의 마지막 은닉 상태만 Decoder에 전달했다. 그럼 모든 시각의 은닉 상태를 전달하게되면 Encoder는 고정 길이 벡터라는 제약으로부터 해방될 것이다. 그림으로는 다음과 같다. (케라스에서는 return_sequences=True로 설정하면 모든 시각의 은닉 상태 벡터를 반환한다.) $hs$의 각 단어에 대한 정보를 갖고 있는 벡터들의 집합이라고 볼 수 있다. Encoder의 개선은 이것이 전부다. Decoder.. random 정리 rand() 주어진 shape을 가진 array를 생성하며, [0, 1) 범위에서 균일한 분포를 갖는다. import numpy as np a = np.random.rand(5) print(a) b = np.random.rand(2, 3) print(b) [0.41626628 0.40269923 0.80574938 0.67014962 0.47630372] [[0.83739956 0.62462355 0.66043459] [0.96358531 0.23121274 0.68940178]] randint() [최소값, 최대값)의 범위에서 임의의 정수를 만든다. size 인수를 통해 shape을 지정할 수 있다. import numpy as np a = np.random.randint(2, size=5) print.. 7장 RNN을 사용한 문장 생성 (2) seq2seq 개선 입력 데이터 반전 이 트릭을 사용하면 많은 경우에 학습이 빨리져서 결과적으로 최종 정확도도 좋아진다고 한다. 참고로 입력 데이터 반전은 다음과 같이 할 수 있다. array = array[:, ::-1] 위와 같이 사용하면 배열의 행만 반전시킬 수 있다. 이 트릭을 사용해서 정확도가 향상됨을 보여준다. 왜 결과가 좋아지는지를 생각해보면 "나는 고양이이다"를 "I am a cat"으로 번역하는 문제에서 트릭을 사용하지 않으면 "나"로부터 "I"까지 가려면 여러 타임 스텝("는", "고양이" 등)을 거쳐야한다. 시간적으로 거리가 멀다. 입력을 반전시키면 이 거리가 짧아지게 되어 역전파시 기울기가 직접 전해진다. 입력 데이터 반전 덕분에 시간적으로 거리가 짧아지는 경우가 이전보다 더 많아지.. 7장 RNN을 사용한 문장 생성 (1) "you say goodbye and I say hello."라는 말뭉치로 학습한 언어 모델을 예로 생각해보자. 이 모델에 "I"라는 단어를 입력으로 주면 모델은 다음과 같은 확률분포를 출력한다. 우리는 확률이 가장 높은 단어를 선택하는 결정적인 방법과 확률적으로 샘플링하는 방법을 사용할 수 있다. 여기서는 후자를 사용한다. 샘플링을 하였을 때 "say"가 선택되었다면 이것을 다시 모델에 입력하여 다음 단어의 확률분포를 얻는 식으로 문장을 생성해낼 수 있다. 주로 일정 길이나 "end of sentence"를 의미하는 eos 토큰이 나타날 때 까지 반복한다. 그럼 문장 생성을 구현해보자. class RnnlmGen(Rnnlm): def generate(self, start_id, skip_ids=None.. 6장 게이트가 추가된 RNN (2) LSTM 구현 이전에 보았던 LSTM의 계산 그래프는 다음과 같다. 그리고 아래 수식들은 LSTM에서 수행하는 계산을 정리한 수식들이다. 행렬 라이브러리는 큰 행렬을 한꺼번에 계산할 때 효율이 좋기 때문에 $x{W_x}+h{W_h}+b$ 같은 아핀 변환을 다음과 같이 한 번에 처리한다. 이때의 계산 그래프는 slice 노드를 포함하여 다음과 같이 표현할 수 있다. 이제 LSTM 클래스를 구현해보자. 우선 초기화 부분이다. class LSTM: def __init__(self, Wx, Wh, b): ''' Parameters ---------- Wx: 입력 x에 대한 가중치 매개변수(4개분의 가중치가 담겨 있음) Wh: 은닉 상태 h에 대한 가장추 매개변수(4개분의 가중치가 담겨 있음) b: 편향(4개분의.. 이전 1 ··· 9 10 11 12 13 14 15 16 다음