Notes
본 글은 Kikagaku의 무료 강좌 파이썬&기계학습 입문의 강의 노트 중 첫 번째 노트입니다.
아래의 리스트는 해당 강좌의 커리큘럼이며, 본 노트는 "1. 도입"부터 "7. 단회귀분석 구현"까지의 내용을 간단하게 정리한 글입니다.
Curriculum (401/548)
1. 도입 (42 min)
2. 미분 (49 min)
3. 선형대수 (55 min)
4. 단회귀분석 (52 min)
5. 중회귀분석 (56 min)
6. Python 속성 강의 (101 min)
7. 단회귀분석 구현 (51 min)
- 중회귀분석 구현 (27 min)
- 연습문제 (52 min)
- 통계 (32 min)
- 중회귀분석 2 (31min)
Intro
인공지능・기계학습・딥러닝이란?
기계학습에 필요한 수학
- 미적분, 선형대수, 확률통계
- 처음부터 이 세 수학을 전부 공부하는 건 힘들다.
- 처음은 미분과 선형대수로 시작하고, 베이즈 통계를 공부하는 단계부턴 적분과 확통.
기계학습의 3 대 토픽
- 교사 학습: 입력 x 와 출력 y 일반적인 비즈니스 현장에 쓰임
- 회귀: " 수치 " 예측
- 평수와 월세와의 관계
분류: " 카테고리 " 예측
- 백포도주 or 적포도주
- 비교사 학습: 입력 x만 존재
- 클러스터링: 눈대중으로 덩어리를 구분하는 느낌. 정확한 분류, 출력 y 가 존재하지 않음.
- 차원축소: 입력 변수 (차원) 을 줄임. 수학적으로 변수가 많으면 모델이 잘 움직이지 않는 경우가 있음.
- 강화 학습 데이터가 아예 없거나 거의 없음
- 청소 로봇: 첫 기동 시는 방의 구조를 모르지만, 점점 방의 구조를 파악해감
- 알파고: 스스로 기보를 만들어서 학습.
간단한 기계학습과 내삽・외삽
입력 | 데이터 1 | 데이터 2 | 예측 1 | 데이터 3 | 예측 2 |
---|
x | 1 | 2 | 3 | 4 | 5 |
y | 2 | 4 | 6 | 8 | 10 |
| | | 내삽 | | 외삽 |
- 사람은 y=2x 를 예측하기 쉽지만, 컴퓨터는 예측하기 어려움
- 기계학습에선 데이터 범위 내, 즉, 내삽은 보장하지만, 외삽은 보장하지 않음.
- 그렇다면 미래의 값을 예측하는 주식 예측은 어떠한가?
- 시계열을 기준으로 두면 범위 밖을 예측하지만, 가격을 기준으로 두면 범위를 어느 정도 정할 수 있음.
- 하지만 범위를 벗어나는 가격에 대해선 외삽이 되므로 모델을 새로 만들어야 함.
미분
미분은 어디에 쓰이는가
- 미분으로 접선의 기울기를 구할 수 있다.
- 접선의 기울기=0를 이용하는 것으로 어떤 함수가 최소 (혹은 최대) 가 되는 점을 구할 수 있다.
미분 (도함수) 1, 미분 (도함수) 2, 미분의 공식, 편미분
도함수나 공식, 편미분은 다 아는 거니 패스하고 쓰임새만 요약
선형대수
스칼라・벡터・행렬
- 스칼라 → 벡터 → 행렬 → 텐서 (행렬의 집합)
행렬의 연산, 연습문제
간단한 더하기, 빼기, 내적
사이즈감
- xTy = 스칼라, Xy = 벡터, xTAy = 스칼라
- 앞으로 나올 수식의 사이즈감을 익히기 위한 간단한 설명.
전치, 단위행렬, 역행렬
역시 쉬우니 패스
벡터로 미분
∂x∂(C)=0∂x∂(bTx)=b∂x∂(xTAx)=(A+AT)x
단회귀분석
입력 변수가 하나. 여러 개를 이용할 경우 중회귀분석.
문제 설정: 월세 예측
- 학습: 넓이 - 월세 데이터셋으로 모델을 학습
- 추론: 학습된 모델에 새로운 넓이 x 를 넣어, 월세 예측값 y^ 을 추론
Step1: 모델을 정하자
- 모델을 고르는 건 사람이 할 일
- 목표: 데이터셋에 기반해 적절한 파라미터를 결정하자.
- 데이터의 중심화 (Centering): 구해야 할 파라미터가 적어짐.
Step2: 평가함수를 정하자
- 적절을 정하자 → 평가함수 (손실함수) L 을 정하자
- MSE(Mean Squared Error)
MSE=N1i=1∑N(yi−y^i)2=(y−y^)T(y−y^)
- RMSE(Root Mean Squared Error)
RMSE=N1i=1∑N(yi−y^i)2
MAE=N1i=1∑N∣yi−y^i∣
(비밀) Latex 문법 스스로 쓰는 게 귀찮아서 ChatGPT 한테 맡겼더니 훌륭한 결과물이 나왔다!
Step3: 평가함수를 최소화하자
∂aT∂(L)=0
- Step3-1: 식변형, yi^=axi 를 평가 함수에 대입
- Step3-2: 최적인 파라미터 a 를 구한다.
중회귀분석 1
Step1: 모델을 정하자
y^=ω1x1+ω2x2+⋯+ωMxM+b=ω0x0+ω1x1+⋯+ωMxM(b=ω0x0)=[ω0ω1⋯ωM]⎣⎢⎢⎢⎢⎡x0x1⋮xM⎦⎥⎥⎥⎥⎤=ωTx=[x0x1⋯xM]⎣⎢⎢⎢⎢⎡ω0ω1⋮ωM⎦⎥⎥⎥⎥⎤=xTω=Xω
Step2: 평가함수를 정하자
- 파라미터는 ω 와 b: M+1 개
- 평가함수는 단회귀 분석과 동일.
L=(y−y^)T(y−y^)
Step3: 평가함수를 최소화하자
- Step3-1: 식변형, y^=Xω 를 평가 함수에 대입
L=yTy−2yTXω+ωTXTXω=C+bTω+ωTAω(스칼라C=yTy,b=−2XTy,A=XTX)
∂ω∂(L)=0=b+(A+AT)ω=−2XTy+2XTXω
XTXω=XTyω=(XTX)−1XTy
- 굳이 ω=X−1y 로 안 쓰는 이유는 X 가 정방행렬이 아닐 수도 있기 때문에. 역행렬의 필요 조건이 정방행렬.
* 엄밀하게 말하면 정방행렬이어도 역행렬이 존재하지 않을 수도 있음.
파이썬 속성 강좌
환경구축
- 파일 업로드 시 주의사항
- 런타임이 12 시간을 넘어 종료되면 재연결 후 재업이 필요.
- 런타임 유형을 바꿀 경우에도 재연결이 되므로 재업이 필요.
변수
- 수치: int, float
- 문자열: str, 덧셈 가능
- 리스트 [ ]
- .append()
- 터플 ( ): 요소 변경 불가능
- 사전 {key : value }
- 사전 요소 추가: results[key] = value
- Bull
기본 구문
- 비교연산자
- Escape sequence: \n (newline), \t (tab)
제어 구문
- for 문 (반복)
- range(), len()
- zip(a, b): 각각에서 요소를 하나 씩 꺼내옴.
numbers = [1,2,3]
animals = ['dog', 'cat', 'bird']
for number, animal in zip(numbers, animals):
print(number)
print(animal)
함수
def say_hello(name):
print("안녕하세요. {}입니다.".format(name))
def say_hello(name):
print(f"안녕하세요. {name}입니다.")
def calc(a=2, b=3):
return a + b
calc()
calc(3)
calc(b=4)
클래스 기초
- init 함수: 초기화
- call 함수: 인스턴스에 대해 인수를 넣는 것으로 실행 가능.
class Person:
def __init__(self, name, nationality, age):
self.name = name
self.nationality = nationality
self.age = age
def say_hello(self, name):
print(f'안녕하세요, {name} 씨. 저는 {self.name}입니다')
단회귀분석 구현
- 단회귀분석의 기울기를 구하는 식
a=n=1∑Nxn2n=1∑Nxnyn=∣x∣2xy
- 사용하는 샘플의 데이터
NumPy 속성 강좌
- 벡터: np.array( [[ ]] )
- 전치시킬 때 쓰기 편하게 대괄호를 2중으로.
- 평균 .mean()
- 데이터 중심화
- a의 산출
- 요소곱과 합계 .sum()
Pandas / Matplotlib 속성 강좌
Pandas
import pandas as pd
df = pd.read_csv('/content/drive/MyDrive/1. Projects/Kikagaku/1. Python&機械学習入門/sample.csv')
df.head(3)
df.tail(3)
df[2:10]
df.iloc[1,1]
x = df['x']
y = df['y']
Matplotlib
import matplotlib.pyplot as plt
fig = plt.figure(figsize = (10,8))
ax = fig.add_subplot(1,1,1)
ax.scatter(x,y, c='red');
ax.set_title('first scatter')
ax.set_xlabel('x')
ax.set_ylabel('y')
Numpy 구현
df.describe()
df.mean()
plt.legend()
예측
y − y^ = a(x−x^) → y = a(x−x^) + y^