👩‍💻LEARN : ML&Data/Book Study

[모두의 딥러닝]#2-4. 가장 훌륭한 예측선

쟈니유 2023. 2. 10. 15:26
728x90

평균과 관련된 짤을 찾아보고 싶었는데, mean meme이라 했더니 그냥 못된 애들만 백만개 나옴

 

결국 머신러닝에서 기본이 되는 것은 '선형회귀' 와 '로지스틱회귀'. (물론 이 외에 다른 기본기가 여러개 있긴함)

무언가를 예측하기 위한 방정식을 풀어나가는 과정이기 때문에 그 방정식을 다양한 관점에서 풀 수 있는 방법을 단순 선형회귀에서부터 로지스틱회귀까지 딥러닝 기법을 사용해가면 될 것 같다. 

 

문과 석사 쓸모없는 줄 알았는데, 그래도 통계 열심히 배워두길 잘한 듯 ... 과거의 나야 잘햇다 ...

 


#2. 예측 모델의 기본 원리 - 4. 가장 훌륭한 예측선 

 

딥러닝을 포함한 머신러닝의 예측은 결국 기존 데이터(정보)를 가지고 어떤 선이 그려질 지 예측한 후, 아직 답이 나오지 않은 그 무언가를 그 선에 대입해 보는 것. 



[최소 제곱법] 

  • 주어진 데이터를 가장 잘 설명할 수 있는 가장 정확한 선을 구하기 위한 방법 중 하나 (ax+b 에서 a,b를 구하는 것) 
  • a = {(x편차)*(y편차)의 합} / (x편차)**2
  • b = y의 평균 - (x의 평균 * 기울기 a)

→ 해당 데이터를 가장 잘 설명하는 선을 그릴 수 있게 됨 

 

파이썬에서 최소제곱법 

##데이터 만들기
# x는 공부한 시간, y는 시험점수를 의미

import numpy as np

x = np.array([2,4,6,8])
y = np.array([81,93,91,97])

#각 원소의 평균값 구하기

mx = np.mean(x)
my = np.mean(y)

#최소제곱근의 분모 만들기

divisor = sum([(i - mx)**2 for i in x])

#최소제곱근의 분자 만들기. 편차 곱의 합(시그마)를 위해 반복문 사용 

def top(x,mx,y,my) :
   d = 0
   for i in range(len(x)):
      d += (x[i] - mx) * (y[i] - my)
   return d

dividend = top(x,mx,y,my)

# a 기울기 구하기

a = dividend / divisor

b = my - (mx*a)

print(a,b)

→ 2.3 79.0


 
 

 

 

[평균제곱오차] 

  • 최소제곱법의 한계 
    • x가 한개일 때엔 단순하지만, 여러개가 되면 처리하는 것에 무리가 있음 
  • 대안 
    • 일단 예측선을 그리고 조금씩 수정해 나가자 
    • 나중에 그린 선이 먼저 그린 선 보다 정말 나은지 선의 오차를 계산하고 오차를 작은 쪽으로 바꿔야 함 
  • 평균제곱오차 (MSE)
    • 주어진 선의 오차(관측한 데이터값 - 예측값)를 평가하는 방법 
    • 각 오차를 제곱(음수 제거)한 후 합한 것을 관측값의 개수 n으로 나눈 것 
    • 더 작은 평균제곱오차를 가진 직선을 찾아나가면 됨 

 

평균제곱오차 파이썬으로 구하기 

#평균제곱오차 만드는 식

n = len(x)
def mse(y, y_pred):
return (1/n) * sum((y-y_pred)**2)

print("평균제곱오차 : " + str(mse(y,predict_result)))

predict_result = []

#예측값 넣어주기

for i in range((len(x))) :
predict_result.append(predict(x[i]))
#print("공부시간 =%.f, 실제점수 =$.f, 예측점수 =%.f" %(x[i], y[i], predict(x[i]))) >> 수식엔 문제 없으나 에러가 계속 남 

#평균제곱오차 만드는 식

n = len(x)
def mse(y, y_pred):
return (1/n) * sum((y-y_pred)**2)

print("평균제곱오차 : " + str(mse(y,predict_result)))
→ 평균제곱오차 : 11.0