나른한 코딩 생활

[18일차] ABC 부트캠프 선형회귀 본문

ABC 부트캠프

[18일차] ABC 부트캠프 선형회귀

GerHerMo 2024. 7. 21. 11:55

어제 잠깐 언급했던 회귀 부분은 인공지능을 만들기 위한 과정 중 중요도가 높다고 볼 수 있다

 

오늘 포스트에서는 Pycharm 설치 및 선형회귀에 대한 간단한 설명 그리고 파이선에서 배우는 간단한 통계학을 알아볼 것이다.


새로운 툴 Pycharm

지난번 동적 크롤링을 위해서 사용했던 Anaconda 내의 Spyder도 사용할 수 있겠지만, 강사님 마다의 툴이 제각각이라 최대한 환경을 맞춰주기 위해 새로운 툴을 사용해보자

 

기존의 Java 언어를 공부하기 위해 Jetbrains 사의 Intellij 를 사용한 사람이라면 아마 알 수 있을 것이다

같은 회사의 Pycharm 은 이와 비슷하게 Python 을 사용하기 위한 편리한 툴이다.

 

https://www.jetbrains.com/ko-kr/pycharm/download/?section=windows

 

PyCharm 다운로드: 데이터 과학 및 웹 개발을 위해 JetBrains가 만든 Python IDE

 

www.jetbrains.com

ProfessionalCommunity Edition 두가지가 있는데 전자는 유로버전 / 후자는 무료버전이다

각 버전별로 상세 기능에서 차이가 있지만 이번 실습 과정을 진행하는데 해당 기능은 불필요하다

 

다만, 현재 대학생인 경우 학생용 계정을 통해 Professional 버전을 무료로 사용할 수 있으니 사용가능한 사람이라면 이를 사용하는 편이 훨씬 좋다

 

Spyder 에서는 여러 라이브러리 패키지를 Anaconda를 통해 설치되어 있는 경우가 대부분이지만, Pycharm 같은 경우에는 처음 설치때 해당 패키지들을 인스톨 하지 않기 때문에 해당 과정을 해줄 필요가 있다

 

또한 Python 3.12 는 몇몇 패키지들이 간혹가다 충돌하는 경우가 있어 이번 실습기간 동안에는 3.11 버전의 Python 을 사용할 것이다.


Class 

Python 은 함수(지향)프로그램

def say() : 
( ) <-  self (다른 언어에서는 this, 명시적으로  적어주는것)

class 는 껍데기이고, 그 안의 함수로 이루어져 있다.
class 도 마찬가지로 주소를 가르킨다 

클래스를 사용하기 위해서는 어떻게 해야하나

hello = Hello()


hello : 변수? -> 객체
Hello() : 함수X , 클래스O

class 를 담는 애가 self 

Hello.say()


say() : 함수X , 메소드O


생성자를 호출한다 -> 메모리에 올라가야 쓸 수 있다


 

선형회귀

데이터에 대한 분류(classification) / 회귀(regression) -> 점선으로 표시

 

회귀란 일반적으로 데이터들을 2차원 공간에 찍은 후에 이들 데이터 들을 가장 잘 설명하는 직선이나 곡선을 찾는 문제

 

LTI(Linear Time Invariant) : '선형성 + 시간 불변성' 을 가지는 시스템

 

y = f(x) 에서 등호는 mapping 의 의미를 가짐

-> 선형회귀일 경우 y = wx + b 형태의 함수이다

 

1차 증가함수와 같은 선형 함수를 '모델'이라고 한다

 

y = wx + b 일때 / w = 기울기, b = y 절편
x = 데이터, y = 정답 (target)

 

x 가 1일때 y 는 w+b
기울기 w는 웨이트(weight) 라고 하며 이는 가중치를 의미한다

b 는 위에서 언급했던 y 절편이며 이는 바이어스(bias) 즉, 편향을 의미한다

 

w =y/x -> 비율 = 미분

 

y = wx + b 의 미분(비율) 은 w , 웨이트는 양수

 

비선형 = 순간 미분
-> 이걸 위해서 반복 : 

데이터와 정답을 통해 순간 미분을 반복해서 비선형 그래프를 따라 그린다

 

즉, 선형회귀라는 것은 그에게 모델을 찾아가는건데 LTI 의 과정이다


다중 선형 회귀

w = weight 
[x1, x2, x3, x4]
[1.5,2,1,1]
[1.5.m1,1]

 

y - y^ = 0 일때까지 반복 ( 차이가 0 되는건 미분과 같다 ) 

 

w1,w2,w,3,w4 의 숫자를 계속 바꿔준다 

 

어떤 데이터 중 우리가 알고싶은 이상적인 데이터와 결과가 있으면

그러한 결과나 데이터들이 맞아떨어지기 위해서는 미분을 줄여야함

 

미분 = ( n ) = (n-1)

 

기존 모델과 세팅된 모델은 오차가 0이 됨

 

정답률 과 오차율은 따로 놀아야 한다 

 

머신러닝은 학습된 러닝이다


Ex04.py 경사 하강법 구현

import numpy as np
import matplotlib.pyplot as plt

X = np.array([0.0, 1.0, 2.0]) # x 값
y = np.array([3.0, 3.5, 5.5]) # 정답

W = 0       # 기울기
b = 0       # 절편

lrate = 0.01  # 학습률
epochs = 1_000  # 반복 횟수 1_000 == 1000 ',' 콤마와 동일한 역할
n = float(len(X)) # 입력 데이터의 개수

# 경사 하강법
for i in range(epochs):
    y_pred = W*X + b  # 예측값 , error 가 0 이 되게끔 반복
    dW = (2/n) * sum(X * (y_pred-y))
    db = (2/n) * sum(y_pred-y)
    W = W -lrate * dW  # 기울기 수정
    b = b -lrate * db  # 절편 수정
    print (W, b)

# 기울기와 절편을 출력한다.
print (W, b) # 기울기와 바이어스 출력
# 즉, y = wx + b 그래프는 y = 1.2432...x + 2.7455... 이다

# 예측값을 만든다.
y_pred = W*X + b

# 입력 데이터를 그래프 상에 찍는다.
plt.scatter(X, y)

# 예측값은 선그래프로 그린다.
plt.plot([min(X), max(X)], [min(y_pred), max(y_pred)],color='red')
plt.show()

# 점 3개를 가지고 학습을 했더니 plot 과 같은 형태의 선형 그래프가 그려짐
# 이를 통해 x = n 값일 떄의 유사값을 도출하는 y=mx+b 를 사용할 수 있다

경사 하강법을 구현한 선형회귀 그래프