사람에게 사진을 보고 고양이와 강아지를 구분하라고 하면 쉽지만 기계는 그렇지 않다. 기계는 이미지를 분류하기 위해 이미지의 shape이나 edge를 판별하고 찾아 알고리즘화를 하려고 하지만 한계는 존재한다. 이럴때 머신러닝이 해결책이 될 수 있다. 머신러닝은 데이터와 해답을 주고 기계에게 비슷한 예제를 학습시켜 규칙성을 만든다. 즉, 머신러닝은 "주어진 데이터로부터 규칙성을 찾는 것"이다.
머신러닝 모델은 일반적으로 훈련용, 검증용, 테스트용으로 분리해서 사용한다. 훈련용으로 모델을 훈련하고, 검증용에서 모델의 성능을 조정한 뒤(과적합 판단, 하이퍼파라미터) 조정 등), 튜닝한 검증용 데이터를 아직 보지못한 데이터, 테스트 데이터로 모델의 진짜 성능을 평가한다. 문제지, 모의고사, 수능시험으로 비유를 들 수 있다.
+ 추가로 데이터가 충분하지 않아 나눌 수 없다면 k-fold 교차검증이라는 방법을 쓰기도 한다.
변수의 속성: 하이퍼파라미터와 매개변수
하이퍼파라미터는 모델의 성능에 영향을 주는 매개변수이고, 사용자가 직접 정해줄 수 있다. (ex.학습률) 훈련 이후 검증하면서 하이퍼파라미터를 튜닝한다. 매개변수는 모델이 학습하는 과정에서 얻어지는 값이다. ex)가중치, 편향
러닝? 어떤걸 학습할까? : 지도학습, 비지도학습, 강화학습
지도학습은 훈련데이터를 훈련시킬 때 문제지를 주고 답을 암기시키는 방법이다. 문제에 해당하는 답을 학습하고, 새로운 문제를 봤을 때 정답을 예측한다. 여기에 분류와 회귀가 있다. ex)스팸분류기 비지도학습은 답이 없다. 단, 각각의 데이터의 특징을 분석해서 비슷한 형태를 찾아내는 학습을 한다. 즉, 군집화한다.ex)다리 4개인 동물, 다리가 2개인 동물 군집화 강화학습은 배우지 않겠지만 상과 벌점 제도가 있어서 벌을 최소화시키는 방식이다. 알파고와 게임의 최적 동작을 찾는 방법.
어떤 문제에 대해 다룰까? : 분류와 회귀
머신러닝은 많은 문제에서 분류 또는 회귀에 해당한다. 선형회귀는 회귀문제에 대해 학습하고, 로지스틱 회귀는 이름은 회귀이지만 분류문제를 학습한다. 분류는 이진분류와 다중클래스분류로 나뉜다. (추가로 다중레이블 분류도 있으나 이건 어려우니 패스.) 회귀는 분류처럼 0 또는 1, 분리된 카테고리 이런 답이 결과가 아니라 연속된 값이 결과다. 시간에 따른 주가 예측, 생산량예측, 결과 예측 등등이 있다. 분류는 답을 정한다. 이진분류는 주어진 입력에 대해서 둘 중 하나의 답을 정한다.(ex. 합격/불합격, 스팸/정상메일) 다중클래스분류는 주어진 입력에 대해서 두개 이상의 정해진 선택지 중에서 답을 정하는 것. 입력값이 들어오면 카테고리를 판단해서 적절한 곳에 판단된다.
어떤 데이터를 다룰까? : 샘플과 특성
많은 머신 러닝 문제가 1개 이상의 독립 변수 xx를 가지고 종속 변수 yy를 예측하는 문제이다. 신경망에서 우리는 훈련데이터를 행렬로 표현을 많이하게 되는데, 독립변수 x의 행렬을 그 갯수만큼 나열한다. 여기서 가로줄은 샘플(DB에서는 레코드), 세로줄은 종속변수 y를 예측하기 위한 특성이라한다.
데이터 분석 이후 결과 : 정확도, 혼동행렬, 정밀도, 재현률
우리는 학습을 시키기 때문에 테스트 데이터에서 정확도(맞춘거/전체)가 높을수록 좋다. 근데 우리가 학습시키는 대답이 긍정이었는지, 부정이었는지를 알 수 없다. 그냥 정확도만 확인한다고 좋은게 아니기 때문에... 그래서 혼동행렬이라는 행렬을 만들어서, 각 대답에 대한 긍부정, 결과, 그리고 정밀도와 재현률을 알 수 있다.
머신러닝에서 고려해야할 점 : 과적합, 과소적합
여기까지 테스트 데이터에 대한 결과를 보는 방법과, 답변의 방향성까지 보게 되었다. 근데 여기서 예상치 못한 에러가 날 수 있지 않을까? 그걸 방지하는 두가지 방법. 과적합은 지금 이 모델이 이 훈련데이터에 딱 맞게 만들어진 모델이라 생기는 오류이다. 그럼 훈련은 겁나 좋게 나왔는데 테스트에서는 원하는만큼의 결과치가 나오지 않는다. 이건 훈련데이터를 지나치게 일반화한 것. 에포크(훈련횟수)가 많아질수록 비슷한 데이터로 학습시킨 것이기 때문에 과적합이 생긴다. 반대로 너무 훈련을 덜하면 배울 수 있는 여지가 있는데도 기회를 안준 것이므로 과소적합이라고 부른다. 적합(fit)이라는 단어는 모델이 주어진 데이터에 대해서 적합해져가는 과정이기 때문에 붙여졌다. 케라스에서는 학습시키는 도구 이름을 fit이라고 부르기도 한다.
회귀분석
회귀부터 하자. 선형회귀는 ~할수록 ~하다 라는 말이 딱이다. 한 변수값(x)의 변화에 따라 특정 변수의 값(y)이 영향을 받는다. x가 하나면 단순선형회귀다. 다중선형회귀는 여기서 wx가 여러개 있는것이다. 집가격은 집 평수 뿐만 아니라, 방의 갯수, 역세권 등 여러 영향이 있다. 독립변수가 여러개면 다중선형회귀이다.
단순선형회귀는 1차함수 수식을 쓴다.(y=Wx+b)여기서 기울기에 해당하는 w와 절편을 의미하는 b는 각각 가중치와 편향을 뜻한다. 어차피 변수값은 뭘 넣느냐에 따라 y값이 그거에 맞게 나오기 때문에, 그 변화의 폭, 또는 변화의 질을 바꾸는 것은 가중치와 편향이다. 따라서 적절한 w와 b의 값을 찾아내야 x와 y의 관계를 적절히 모델링한 것이라 볼 수 있다.
일단 비용함수(=손실함수, 목적함수)를 구해야 한다. 이건 함수의 값을 최소화하거나 최대화하는 목적을 가진 함수이다. 여기서 우리가 최소화 하는 것은 예측값의 오차이다. 즉, 회귀식인 예측값과 실제값(점)의 거리를 최소화해야 한다. 여기서는 MSE(평균 제곱 오차)라는 것을 쓰고, 이것은 임의로 그린 회귀선을 서서히 w와 b값을 바꿔가면서 최소화하는 값들을 찾는다. 각각 점과 선 사이의 거리를 절댓값 처리를 위해 제곱해주고 그걸 갯수로 나눠서 평균을 냈다.
MSE(평균제곱오차)
이게 최소가 되어야하는데 그때 최적의 알고리즘을 옵티마이저(Optimizer)라고 한다. 가장 기본적인 옵티마이저 알고리즘인 경사하강법을 써보자.
경사하강법(Gradient Descent)
따로 절편 상관 없이 가장 극단적인 양 극단을 그려보면 가운데로 올 수록 오차가 줄어드는 2차함수 형태로 그려진다. (x: w(기울기) y:오차율 => MSE) 이 오차가 최소인 지점을 우리는 극점으로 배웠다. 편미분 써서 값 찾고 등등... 접선의 기울기가 =0 인 지점을 찾는다. 컴퓨터에서는 임의의 w,b값에서 학습률(learning rate)이라는 하이퍼파라미터(개발자가 설정하는 값)를 정해서 조금씩 극단으로 다가간다. 여기서 학습률이 너무 크면 최소값을 넘어 반대편으로 넘어가니(=발산) 조심해야한다.
최소값으로 가는 법발산할 경우
선형회귀에서 가장 적합한 비용함수와 옵티마이저는 MSE와 경사하강법이다.
코딩 방법) 케라스에서 구현한다. activation을 선형으로 설정하고, 컴파일 loss를 mse로 한다. 모델을 학습률 0.01로 해서 fit한다. 그러면 주어진 x와 y에 대해서 오차를 최소화하는 작업을 epochs만큼 시도한다. 어느순간 하다가 MSE가 정해져서 오차가 줄어들지 않는다. predict 하면 그 모델의 예측값이 나온다.
이진분류
둘 중 하나 선택하고 분류하는 것. 대표적으로 0과 1만 출력하는 계단함수, 또는 시그모이드 함수 같은 것이 있다. 이 그래프들은 극단적으로 둘중에 하나만 선택하기 때문에 s자 형태를 띈다. 실험을 하려고 해도 직선으로는 안되고 s자 그래프가 필요하다는 소리. 선형회귀는 둘 중 하나이기 때문에 선형회귀분석처럼 직선의 방정식으로 표현하기 힘들다.
시그모이드 함수
이런 문제들을 풀기 위해 s자 형태인 시그모이드 함수를 사용한다. σ(Wx+b) 대충 이런 형태를 갖는데, 시그모이드는 출력값을 0과 1 사이의 값으로 조정해서 반환하고, x가 0일 때 0.5인 중간값을 가진다. 굴곡지지 않게 부드럽게 이어준 그래프라는 소리. 그래서 그 기준을 0.5로 두고 0.5 이상이면 1로 판단하고 그 이하면 0으로 판단한다. 확률로 따지면 50%라는 소리.
왜 얘는 경사하강법 못해?
그래프의 저점이 여러 개다. 이떄 크로스 엔트로피(Cross Entropy)함수를 사용하는데, 이 함수는 데이터의 개수와 범주 개수, 실제값(0과1)과 실제 값에 대한 확률로 계산하는 비용함수이다. 이거는 말 그대로 엔트로피, 불확실성에 대한 척도를 나타내는 수식이다. 1이나 0인경우 말고, 그 중간의 지점을 어느쪽에 치우쳐져있나 판단하는 것.
즉 로지스틱 회귀는 비용함수로 크로스 엔트로피 함수를 사용하며, 가중치를 찾기 위해서 크로스 엔트로피 함수의 평균을 취한 함수를 사용한다. 크로스 엔트로피 함수는 소프트맥스 회귀 비용 함수이기도 하다.
연속형 변수를 검정하는데에는 T검정과 ANOVA(분산분석) 이 사용되고, 범주형 변수를 검정할 경우 카이제곱검정과 피셔의 정확검정법을 사용할 수 있다.
상관분석 : 두 변수 간에 얼마나 상관이 있는가?선형관계인가?
회귀분석 : y=a+bx 관계식 구하기
카이제곱검정
T검정
ANOVA(분산검정)
범주형 변수
연속형 변수
두 변수간의 상관관계 측정할 때
두 그룹의 평균 차이를 볼 때
세 그룹 이상의 평균값 분석할 때
기대빈도를 두고, 관찰빈도가 통계적으로 유의미한지 측정
두 표본이 있는데 그 차이를 표본 오차로 한다. 표본 오차가 발생할 확률이 a<0.05로 유의미하면 대립가설 채택
세개 이상 표본이 있는데 각각의 평균이 동일하다는 가설을 검정. 분산이 모두 같다는 가정 하에 오차가 크면 대립가설 채택
- 적합도 검정 : 관측된 데이터가 예측한 분포를 따르는지 검정 - 독립성 검정 : 관측값들이 다수의 인자들에 의해 분할되어 있는 경우, 그 인자들이 서로 독립적인지 또는 관련이 있는지 검정
- 단일표본 t검정 : 하나의 모집단의 평균값을 기준값과 비교 - 독립표본 t검정 : 서로 다른 두개의 그룹간의 평균 비교 - 대응표본 t검정 : 동일한 집단의 사전, 사후 평균 비교
- 일원분산분석 : 하나의 독립변수를 이용한 분산분석(수준 2개) 두 평균이 같은가 다른가? - 이원분산분석 : 두개의 독립변수를 이용한 분산분석(수준 여러개) 여러 요인들이 종속변수와 얼마만큼 관련이 있는가? - 다변량분산분석 : 종속변수가 여러개
- 주사위 프로그램을 만들었다. 프로그램 관측한 값과 기대한 값(나올 수 없는 값)이 서로 상관관계가 있는가?(적합) - 완두콩 잡종을 분류하려고 한다. 이 관측데이터로 보아 이 데이터는 유전이론모형에 적합한가?(적합) - 학년별 인원에 대한 관측값으로 보아 학년 분포가 균일한가?(독립) - 교육수준과 성적이 연관관계가 있나?(독립)
- 신입사원에게 4가지 각기 다른 교육 훈련 방법을 사용해서 가르치고 표준 시험을 치룬 결과가 다음과 같다. 기법간 차이가 있나?(일원) - 당뇨병과 관련된 정보와 당뇨병에 걸렸는지(1), 안걸렸는지(0)에 대한 환자데이터가 있다. 어떤 정보가 당뇨병이 걸릴 확률과 관련이 높은가?(이원) - 교과서의 차이가 학생들의 수학과 과학점수에 미치는 영향(다변량)
1) 일원분산분석(One-way ANOVA)
[ 문제 ] 김부장이 4개의 각기 다른 신입사원 교육훈련 기법의 효과성을 평가하고자 한다. 새로 입사한 32명의 신입사원에게 4가지 기법을 임의로 적용시켜 교육을 시켰다. 한 달간의 훈련기간이 끝난 후 표준 시험을 쳤는데 그 점수는 아래와 같다. 4개의 교육훈련 기법간 차이가 있는가? 만약 있다면 어떻게 다른가?
matplotlip으로도 대부분의 시각화는 가능하지만 아래와 같은 이유들로 seaborn을 더 선호하는 추세이다.
1. seaborn에서만 제공되는 통계 기반 plot 2. 특별하게 꾸미지 않아도 깔끔하게 구현되는 기본 color 3. 더 아름답게 그래프 구현이 가능한 palette 기능 4. pandas 데이터프레임과 높은 호환성 : hue 옵션으로 bar 구분이 가능하며, xtick, ytick, xlabel, ylabel, legend 등이 추가적인 코딩 작업없이 자동으로 세팅된다.
한 개 이상의 변수를 다룰 때 특정 변수가 다른 변수와 어떤 관계를 맺는지 분석하고, 이를 바탕으로 모델을 정의해 값을 예측하는 기법. 통계적으로 데이터를 분석하는 방법 중 하나로, 입력에 대해서 연속적인 값을 대응시키는 문제이다.
회귀분석은 독립변수 X에 대해 종속변수 Y의 사이의 관계를 수학적인 모형을 이용해서 규명한다. 규명된 함수식을 이용해서 독립변수 X의 변화로부터 종속변수의 Y값의 변화를 예측한다.
회귀분석은 기본적으로 회귀모델 직선과 실제 값의 차이를 뜻하는 잔차(residual error)를 최소화 시키는 것을 기본 원리로 한다.
회귀분석은 1. 두 변수가 선형관계를 가지는 지 산점도를 작성 2. 최소자승법으로 최적의 직선식 구함 3. '선형관계가 없다'는 귀무가설을 기각할 것인지 결정하기 위한 분산분석 을 진행한다.
1) 단순선형회귀분석(simple linear regression analysis)
하나의 종속변수(y)와 하나의 독립변수(x) 사이의 관계를 분석할 경우 사용. 둘 사이의 관계를 가장 잘 설명해주는 선형함수를 찾으면, 우상향 또는 우하향하는 직선을 찾게 된다. 사실 완벽하게 들어맞는 선형함수를 찾아내는 것은 거의 불가능하지만, 최대한 x와 y의 관계를 가장 잘 설명해줄 수 있는 일차함수식을 찾아내는 것이 단순선형회귀의 목적이다.
y = wx +b -> 이 직선은 최소제곱법을 이용한 예측치와 관측치 차이의 제곱의 합이 최소가 되는 직선이다.
보통 y는 예측값(=라벨값, 구하려는 값), x는 특성이며, w는 가중치 또는 계수(coefficient), b는 편향(offset)이라 부른다. 우리는 여러 개의 샘플들의 특성값들과 라벨값들을 이용해서 가장 적합한 w와 b를 찾아야 한다. 이럴 때 사용되는 방법이 바로 경사하강법(gradient descent)이다.
경사하강법(gradient descent)
1. 임의로 설정한 일차함수와 데이터 사이의 평균제곱오차(MSE, mean squared error)를 구한다.
평균제곱오차(MSE)
n은 샘플의 갯수이고,y는 i번째 예측값에
[ 문제1 ] 윌별로 전기 생산금액(억원)에 대해 전기사용량(백만 Kw)은 어떠한 관계를 보이는가?
그룹간 관찰빈도와 기대빈도를 통해 두 집단간의 차이가 유의한가를 판별하는 방법. 카이검정은 범주형 변수일 경우 두 독립군간의 비교를 할 때 쓰인다.(연속형 변수인 두 독립군 간의 비교는 t-test 사용)
귀무가설(H0)과 대립가설(H1)
이 가설들은 기본적으로 통계학에서 처음부터 버릴 것을 예상하는 가설이다.
귀무가설은 앞으로 내가 검정해야 하는 것이다. (내가 궁금한 것/관찰한 것 ex-주사위 프로그램 검정 (기댓값과 달리 랜덤하게 나오는가?) 기댓값과 같이 유사한 구조로 나오는가? 등) 일단 귀무가설이 옳다는 가정하에 시작하나, 예상이기 때문에 진실일 가능성이 적다.
대립가설은 귀무가설이 기각될 때 받아들여지는 가설이다.
유의확률(pvalue)
통계적으로 유의하다면 우연이 아닌 의미가 있다는 뜻으로, 유의확률(pvalue)가 작을수록 좋다. 유의확률은 기본적으로 귀무가설이 맞다고 가정할 때, 귀무가설이 실제로 옮음에도 기각할 오류(기각할 때 따르는 위험부담)이다. 위험부담이 클수록 귀무가설이 맞다는 소리. 따라서,
귀무가설 : 두 변수는 연관성이 없다, 차이가 없다. => 주사위 프로그램은 제대로 만들어졌다. 대립가설 : 두 변수는 연관성이 있다, 차이가 있다. => 주사위 프로그램은 문제가 있다.
#scipy 통계 라이브러리
from scipy import stats
#임의의 데이터 생성
data1 = [4,6,17,16,8,9]
print('주사위 던진 횟수 : ',sum(data1)) #60회
chisquare:카이제곱 검정은 이산형과 이산형 변수가 서로 상관관계가 있는지 없는지를 확인한다.
#관측값
data1 = [4,6,17,16,8,9]
#기대값
data2 = [10,10,10,10,10,10]
data1은 내가 던진 주사위의 데이터다. 주사위 프로그램 실험을 위해 귀무가설로"(확률상 나오기 힘든)임의의 기댓값이 내가 만들어낸 프로그램의 관픅값과 연관성이 있는가?" 를 판단해보자. 만약 관련이 있으면 주사위 프로그램에 문제가 있는 것이다. 동일한게 6번 나오는건 극히 드물기 때문에....
수식으로는 겁나 복잡하지만 코딩으로는 한줄.
#검정통계량과 p-value
chis = stats.chisquare(data1,data2)
chis
깔끔하게 보기 위해 if문으로 결과값을 내보자.
#결과 출력
statistic,pvalue = chis #zip 형태처럼 두개의 변수에 값을 각각 할당
관측값들이 다수의 인자들에 의해 분할 되어 있는 경우 그 인자들의 관찰 값에 영향을 주고 있는지 아닌지를 검정하는 방법. 여러 범주를 가지는 두 개의 변수가 서로 독립적인지 또는 관련이 있는지를 분석한다. ex) 선호하는 음식의 종류와 연령이 서로 관령성이 있는지를 알고 싶을 때
독립성 검정은 귀무가설 : 독립이다. / 대립가설 : 독립이 아니다. 를 의미한다. 여기서 독립이라는 의미는 인과관계 혹은 연관이 없다는 말이 될 수 있다. (교육수준 과 수업이 연관관계가 있는지 없는지,나이와 정당선호도가 연관이 되는지 없는지)
obs = np.array([[5,15],[10,20]])
numpy와 아주 밀접한 관계가 있다.
chi2_contingency(독립성 검정) : 카이제곱 통계량, p-value, 자유도 등을 return
빠트린 것! index가 0부터 안하니까 다시 reset 해줘야한다. df.reset_index(drop=True)
np.random.seed()는 난수를 예측 가능하게 만든다.
원래 np.random.rand(4)로 4개의 랜덤한 array를 만든다고 했을 때, 4개가 랜덤으로 지정되고 실행을 시킬 때마다 다른 array가 나온다. 하지만 np.random.seed(1)를 하게 되면 고정되어 동일한 세트의 난수가 나타난다. -> seed라는 하나의 파라미터를 생성해서 똑같은 것을 불러오는 것. 괄호의 숫자는 키값과 비슷하다.