글쟁이, 코딩한다

0105 / K_digital 20일차 / ML이론기초(지도학습) 본문

나는 코딩도 한다/TIL

0105 / K_digital 20일차 / ML이론기초(지도학습)

Algori 2021. 1. 5. 23:05

0.

  머신러닝, 쉽지않음

  또다른 공부라는 점에서 흥미롭기는 하다. 입문에 발만 담갔는데도 세상이 또 넓어지는 기분이다.

  이해가 온전하지 않았던 수학공식들은 추가 공부를 한 후에 기록한다.

 

 

Linear Regression

 

선형 회귀. 정답 있는 데이터의 추세를 잘 설명하는 선형 함수를 찾아 x에 대한 y를 예측

 

y=ax+b의 꼴.  (a=θ1, b=θ0, θ의 수는 여럿이 되면 y= θ0+ θ1x1 + θ2x2 + ... +  θnxn)

 결국 θ들(parameter theta)의 값이 정확해야한다
   !목표는 가장 적합한 θ들의 set를 찾는 것

어떻게 적합도를 구할까? 

 

MSE

  평균Mean 제곱Square(d) 오차Error 함수Function, 모델의 평균 에러값 !당연히 작을수록 좋다

  #모든 에러 값에 제곱 (부호 없애기) / 에러 갯수(평균 내기)

 

  Cost Function(비용 함수, Loss F, Error F, J(θ)) : 모델의 효율, 적합도를 판별하는 식

 무작정 θ를 바꿔가며 MSE 값을 구한다? => 비효율적 =>

 

  경사하강법(Gradient Descent Algorithm)
 

  1.  θ 초기값을 임의로 설정
  2. 미분해 접선의 기울기를 구함(부호 +,-)
  3. 부호 반대방향(기울기가 떨어지는 방향)으로 θ를 이동
  4. 접선의 기울기 최소값에 도착   
    즉, MSE 함수를 기반으로 기울기를 구하며 최솟값을 구한다 => 이를 통해 최적의 함수(모델)를 찾는다 

#학습률(Learning Rate, LR, 보폭) / θ가 나아가는 거리 / 사용자가 결정

 알파값이 너무 작으면, 학습이 느려지거나 지나치게 오래 걸린다 <-> 알파값이 너무 크면, 에러가 너무 크게 터진다

 

LR처럼 사용자가 결정해야 하는 모든 것들

   Hyper-parameter(초매개변수)

(어떤 모델, 어떤 cost function, 어떤 gradient descent 등등 방대하다) => 이를 Tuning하는 것이 주요 과제


1. 데이터셋 불러오기

sklearn.datasets.load_[data]( )
 #DB, excel, json 등 다양한 데이터의 전처리  #feature selection(필요한 열 골라내기)
 #행렬(array)의 형태로 바꿔줄 것!

2. training/test set으로 데이터 나누기

x_train, x_test, y_train, y_test = sklearn.model_selection.train_test_split(X, Y, test_size)
 #random_state : 매번 동일한 random 값이 나옴 / random이라는 속성은 가져가되 실험을 재현하도록 해준다 / 뒤에 숫자는 임의지정, fix만 하면 된다

3. 모델 객체 생성하기(모델 클래스를 객체로 불러오기)

model = sklearn.linear_model.LinearRegression(hyper-para)
 #모델 이름 찾아 붙이기(Hyper-parameter 튜닝)

4. 모델 학습 시키기(Model fitting)

model.fit(train_x, train_y)
 #a값(θ1) : model.coef_ / Coefficients(계수)
 #b값(θ0) : model.intercept_ 

5. 모델로 새로운 데이터 예측하기

model.predict(test) #예측

@MSE 구하기
* np.mean((model.predict(x_train) - y_train) ** 2) #손으로 만든 MSE 코드
sklearn.metrics.mean_squared_error(model.predict(x_train), y_train) #MSE 코드
##training data MSE값과 test data MSE값이 크게 다르다면, Overfitting을 의심해야 한다. 하지만, 그 차이는 주관적.

nq.sqrt(mean_squared_error( ))
#MSE의 제곱근을 벗겨낸다. 평균 에러차이 #결론적으로 선형 회귀는 성능이 그닥 좋지는 않다

 

Logistic Regression

  이진 분류(binary classification) 문제 : 둘 중 하나의 해결 모델 ex) 스팸 메일, 질병 양/음성

Sigmoid function (s자 곡선 그래프 함수)


 p(Class(+) | X) = 1 / 1 + e ** ax+b(e ** -0 ** Tx)

  #x가 class+일 확률 #e는 자연수 함수(상수) #변수는 a(θ1)와 b(θ0). a는 선의 가파름, b는 x축 대칭이동
   

정답의 형태  

1-정확한 y값을 요청(regression) 

2-특정 cutoff 기준 한 쪽의 값(0, 1)   #cutoff = decision boundary = threshold = 조정이 가능하다

 

#적합도 확인

Cross-entropy function(역시 Cost function, 수치가 작아질수록 제대로 분류)

  Cross-entropy는 숫자들을 비교해 정답에 대한 확신, 아쉬운 오답 등을 세밀하게 비교한다.

 

ROC Curve 
계단식 그래프 : 모델 분별력의 한계를 선으로 표현한 것 : 완벽한 모델이라면 직각에 가까워진다
#분별이 어려운 두 선 => 그 아래 면적(AUC, AUROC)을 본다 / 0.5와 1 사이 / 0.8이 넘으면 훌륭하다고 본다
 진양성율(TPR) : 실제 참인 것 가운데 모델이 참이라고 예측한 비율, 그래프의 y축
 위양성율(FPR) : 실제 거짓인 것 가운데 모델이 참이라고 예측한 비율, 그래프의 x축


#Linear Regression을 참고

1. 데이터셋 불러오기
#분류 문제에서는 데이터 세팅을 0과 1로 바꿔보자 #apply, lambda함수를 쓰면 편안

2. training/test set으로 데이터 나누기

3. 모델 객체 생성하기
model = linear_model.LogisticRegression( )

4. 모델 학습 시키기(Model fitting)

5. 모델로 새로운 데이터 예측하기
model.predict_proba(x_test) #한 행이 0일 확률과 1일 확률, 두 개를 뱉는다 #기존 시그모이드 함수는 1일 확률만 계산

#적확도 계산
from sklearn.metrics import accuracy_score 
accuracy_score(model.predict(x_test), y_test)
#accuracy_score(적합도)는 나이브한 접근방식

 

오늘의 (일단) 적어두기

 

1. Least Squares Estimation

2. 데이터 한 건 : 데이터 1 point : 데이터 1 instances

3. 직선 형태 모델로는 한계가 있다 -> model 대다수는 비선형 -> 딥러닝은 비선형의 최대화(직선을 곡선으로 구부린다)

4. 통계학 기반 예측 지표들을 많이 알아두면, 활용하기 좋다

5. Softmax Algorithm : 다중 클래스 분류 문제를 위한 알고리즘(함수)

 #model이 내보낸 score를 각 클래스 소속 확률 값으로 변환 #logistic regression을 변형/발전시킨 방법

Comments