Day 1 ) 예습
순서 : Diary/ ML study / Python
Diary ( 7.4.20 )
어떤 것에 미친다는 게 뭘까, 사실 대학에 내 전공이 있다는 거는 미치기에 딱 좋은 것 같다.
물론 가장 먼저 , 나의 identity 상으로 나는 예수님에게 미친 사람이지만, 그 다음으로 내가 삶에서 미칠 수 있는 대상을 내가 선택했다는 것에 새삼 기분이 좋은것 같다.
그래서 정말 다시 미쳐보려고 한다!!
나는 되게 느린거 같다. 다른 사람들보다 조금 늦게 깨닫고, 늦게 중요성을 알게 되는 경우가 많은것 같다.
하지만, 걱정 하지 않기로 했다. 엄마께서는 어리면은 그 늦음을 극복하는데 적게 시간이 걸리지만 나이가 들수록 그것을 극복 하는것이 어려우니 이제는 늦게 깨닫는 것을 줄여야 한다고 하셨는데, 앞으로 정말 그럴 것이지만..
그런데 이렇게 깨닫는것은 공부를 하다 보면 빨라지는 것 같다. ( 경험상이다.. ㅎㅎ)
그리고 무엇인가에 미친 상태가 가장 행복한거 같다. ( 이것도 경험상이다..ㅎㅎ)
공부에 손 놓은지 오래 되었어서 그것을 극복 하는데 정말 많은 시간이 걸렸지만,
이제는 내가 선택한 내 전공을 정말 잘 해내는 사람이 되고 싶은 마음이 생겼다.
( 어제 성적표를 보고, 나는 여러 이유로 마음으로 우렀다.. )
학습은 개념 습득은 빠르게, 응용하면서 학습해서 내꺼로 써먹을수 있는 무기를 들었으면 좋겠다.
그것이 내 전공이 되었음 좋겠다.
담주부터 본격적으로,
머신러닝을 배워본다니 되게 신이 난다.
배우는 것들을 노트에 기록을 하려고 했는데 글씨가 영 맘에 안들어서 블로그에 적어야 겠다는 생각을 했다.
(내가 보려고 정리하는 노트이다. ㅎㅎ)
이번 방학이 모르는 것을 배우고 익히고 성장하는 시간이 되었으면 좋겠다.
담주 부터 학교에서 랩 교수님 아래서 캠프가 시작되는데 일정은 아래와 같다. ( Day 1 , 7/6 ~ 5일간)
( 6 월 28 일날 학교에 와서, 3 일동안 최적화 캠프 수업을 들었는데 정말 재밌었다. 틈틈히 그 내용도 정리 하면 좋을 것 같다. )
ML Study
Day 1 때 배울 내용예습 ) 아직 잘 이해가 가지 않는 부분은 주황색!
k-Nearest Neighbors
k-Nearest Neighbors 는 머신러닝에서 사용되는 분류 ( classification ) 알고리듬이라고 한다.
- 유사한 특성을 가진 데이터는 , 유사한 범주에 속하는 경향이 있다는 가정 하에 사용하는 알고리듬이다.
새로운 (x,y ) 좌표를 가진 데이터가 등장을 했을 때! 그 주변에 있는 k 개의 데이터를 기반으로
이 새로 들어온 데이터를 기존에 있던 이미 분류된 각 점들의 것들 중 하나로 분류 하는 것이다.
k 가 늘어나면, 비교범위 대상이 늘어나는 것이다. ( k = 1,2,3,..)
그런데 여기서 기준이 되는 x 축과 y 축을 보면, 모든 데이터가 처음 부터 이 축을 기준으로 고르게 분포되어 있을까를 생각해 보면, 처음부터 그렇지 않을 것이다. 다양한 데이터들이 각각 다른 범위와 기준을 가지고 있는데 그것을 같은 기준을 가지게끔 만들어야 한다.
그것을 가능하게 해주는 것이 데이터 정규화!! 이다..
----------------------------------------------------------------------------------------------------------------------------------
<< 잠깐 머신러닝에 들어가는 data 에 대한 data 정규화에 대해서 알아보자!!!! >>
정규화 ( Normalization )
데이터를 정규화 하는 방법에는 크게 두가지가 있다고 한다.
1) min 값을 0 으로 , max 값을 1로 놓고, 모든 값들을 0-1 사이의 값으로 변환하는 방법이다. (최소-최대 정규화 방법)
2) 평균과 표준편차를 이용해서 평균으로 부터 얼마나 떨어져있는지 z-점수로 변환하는 방법이다.
+) 여기서 표준편차 , 편차 란
편차 : 개별자료와 전체자료의 평균 간의 차이 ( 개별값 - 평균 )
표준편차를 구한다~ 라고 하면 이러한 편차들을 다 더한 후 , 갯수만큼으로 나눠주는데
그런데 이러한 편차는 - 와 + 로 구성되어 있어서 일반적으로 다 더하면 0 이 되어서 제대로 값을 구할 수가 없다.
그렇기때문에, 편차의 제곱을 해서 다 더해 준 값의 평균인 분산! 을 이용해서 값을 계산 해 주고
그렇게 계산한 분산 값에 제곱근을 한 것을 표 준 편 차 라고 한다!!
(1) min -max 방법
그래서 첫번째(1) 방법을 파이썬으로 써보면 다음과 같당.
def normalization( list ):
normalized = []
for val in list :
normalized_element = (val - min(list)) / ( max(list)) - min(list) ) -> range
normalized.append(normalized_element)
return normalized
이 함수를 사용하면, 최댓값은 1 로 최솟값은 0 으로 변환된 것을 확인 할 수 있다.
그런데 이렇게 (1) 최소최대 정규화 방법을 사용하는데 문제가있다.
이상치에 영향을 받을 수 있다는 것이다! -> 어떤 한 값이 특별하게 크거나, y 축은 정규화가 제대로 일어났는데 x 축은 정규화가 제대로 일어나지 않은 등의 문제가 발생할 수 있다.
( 예를들어 y 는 -2 와 2 사이에 있는데 , x 는 -2 와 2 사이의 범위 안에 있지 않은 경우..?... 이럴 경우 , y 의 영향이 더 크다고 한다. )
이러한 단점을 보완 하려면, z-점수 정규화를 고려해야 한다!! -> z-score normalization (2) 번의 방법
(2) z-score normalization
Z-점수 정규화는 이상치(outlier) 문제를 피하는 데이터 정규화 전략이다.
(X - 평균) / 표준편차 -> 데이터의 표준편차가 크면, ( 값이 넓게 분포되어 있으면은 ) 정규화 되는 값이 0 에 가까워 진다.
이 방법을 python 으로 작성해 보면,
import numpy as np
def z_score_normalize(list):
normalized = []
for val in list:
normalized_num = (val - np.mean(list)) / np.std(list)
normalized.append(normalized_num)
return normalized
- 최소 최대 정규화: 모든 feature들의 스케일이 동일하지만, 이상치(outlier)를 잘 처리하지 못한다.
- Z-점수 정규화 : 이상치(outlier)를 잘 처리하지만, 정확히 동일한 척도로 정규화 된 데이터를 생성하지는 않는다.
----------------------------------------------------------------------------------------------------------------------------------
k-Nearest Neighbors 로 다시 돌아와서..
그래서, k-Narest Neighbors algorithm 을 사용할 떄에는, data 마다의 편차의 범위가 차이가 크게 나서,
data 간의 반영 비율이 이상하게 되지 않도록,
모든 특성들을 모두 고르게 반영 하기 위해서 정규화를 해주는 거야 !!
이에 대한 자세한 내용은 위의 점선 칸 안에서 다루었지?
그면은 k 가 뭔지 보면 k 는 새로 들어온 데이터가 위치하는 곳에서 부터 가까이 있는 원소가 counting 되는 갯수?
범위를 의미해!
이 k 를 정하는것두 중요한 고려 사항이래!
-> 모든 값들을 실제로 test 하면서 분류 정확도 ( accuracy ) 를 계산하는 과정에서 단서를 찾을 수 있다고 해.
> k가 너무 작은 경우 : overfitting(과적합)
일단 k가 너무 작은 경우 : overfitting(과적합) 를 생각해보자. 극단적으로 k=1이라고 하자. 그러면 분류 정확도가 상당히 낮을 수밖에 없다. 시야가 좁아지는 거고, 아주 근처에 있는 점 하나에 민감하게 영향을 받기 때문이다. 이를 overfitting(과적합)이라고 한다. (overfitting은 머신러닝 알고리즘에서 정말정말 중요한 개념이니 꼭 알고 넘어가야 한다. 아래 글을 참고하자.)
문제 : 하나의 이상치(outlier)가 있을 경우 근처에 있는 점의 레이블이 그 이상치에 의해 결정될 수 있다.
> k가 너무 클 때 : Underfitting
underfitting은 분류기가 학습 세트의 세세한 부분에 충분히 주의를 기울이지 않았기 때문에 나타난다. 예를 들어 학습 세트에 100개의 점이 있고 k=100으로 설정했다고 극단적으로 가정해보자. 그러면 모든 점이 결국 동일한 방식으로 분류될 거다. 점 사이의 거리는 의미가 없어진다. 물론 이건 극단적인 예이지만… 아무튼 k가 너무 그면 분류기가 학습 데이터를 충분히 세세하게 살펴보지 못한다는 뜻이다.
분류 모델을 생성할 때
일부 데이터는 검증에 활용되도록 떼어놓고
학습 데이터로만 모델을 생성해서
검증 데이터를 넣어 분류 정확도(Accuray) 확인할 수 있는데,
(참고 글: 머신러닝에서 학습세트, 검증세트, 평가세트를 나누는 이유와 방법)
아래 그래프는 한 분류 모델에서 k 값을 변화시키면서 분류 정확도를 확인한 예시다.
아무튼 이 정도까지 고려할 수 있다면 K-최근접 이웃(K-Nearest Neighbor) 알고리즘을 개념적으로 이해했다고 볼 수 있다. 구체적으로 점 사이의 거리를 구하는 방법도 중요한데, 그건 아래 포스팅을 참고하자.
http://hleecaster.com/ml-distance-formula/
두 점 사이의 거리 공식(Distance Formula) 쉽게 이해하기 - 아무튼 워라밸
본 포스팅에서는 두 점 사이의 거리를 구하는 방법 3가지 소개한다. 유클리드 거리(Euclidean Distance), 맨하탄 거리(Manhattan Distance), 해밍 거리(Hamming Distance).
hleecaster.com
점 사이의 거리를 구하는 방법이 왜 중요할까??
오늘은 늦었으니 내일 마저 읽어봐야 겠다..
중간에 언급했던 학습세트 , 평가세트를 나누는 이유와 방법 도 내일 읽어 봐야지!!!!
http://hleecaster.com/ml-training-validation-test-set/
머신러닝에서 학습세트, 평가세트를 나누는 이유와 방법 - 아무튼 워라밸
머신러닝에서 학습세트(Training Set), 검증세트(Validation Set), 평가세트(Test Set)를 나누는 이유와 방법에 대해 알아본다. 교차 검증(N-Fold Cross-Validation)의 개념도 함께 소개한다.
hleecaster.com
참고자료 : http://hleecaster.com/ml-knn-concept/
Python
오늘은 ( 아니 어제, 1 시간만에 완성하는 테크보이 워니 강의를 다 보고, )
백준 문제 5개를 풀었다. 곧 알고리듬 문제들도 풀어볼 예정이지만 아직 파이썬에 익숙하지 않은것 같아서
기본적인 단계별 문제를 풀었다. 내일은 꼭 c 로 라도 알고리듬 문제를 풀려고 한다.
1. 오늘 알게 된 거는 indentation 이 python 에서는 매우 중요 ( 물론 다른언어도.. ) 하다는 것과
2. map 은 rotation 함수 라서 한꺼번에 어떤 값을 다 원하는 형태로 바꿔줄 수 있다는 것
예를 들어서 a,b = map(int, imput(),split()) # 인풋을 int 로 바꿔주고 각각 a,b 에 저장!
3. 보통 input 으로 어떤 값을 받게 되면 그 값을 str 으로 받아오게 된다는 것
4. __name__ 이라는 변수에 대한 용도를 읽었는데 아직 모르겠다는 것..?ㅋㅋ 근데 패키지의 이름이 들어간다는 것은 알고 있다. main 에서 실행했을 경우.. main 으로 돌아오면 __main__ 이 저장된다.
5. 또 뭐 알았지.. 아 print(2) 정수인 경우 이렇게 print..
너무 기초적인 것들이라서 안적어놔두 될것같지만 그냥 생각나는 대루 적어보았다!
방학동안 어떤 서비스 하나도 사이드로 만들어 보고 싶은데 오늘 파이썬 + 장고 조금 맛봤고, ' 돈이 되는 서비스 ' = '꼭 필요하다고 느끼는 서비스 ' 를 나두 하나 만들어 보구 슆다.
아 그리고
6) range (1,20) 하면 1.2.3....19 까지 의 숫자 ! 이거는 for 문에서만 쓰인다는 거..? 정도( 나는 if, else 할때 range 에다가도 쓸려고 했는데 안되더라 )
예 )
a = [1,2,3,4,5]
for i in range(len(a)):
print (a[i])
오늘은 꿀잠 :)