
데이터 수집 -> 데이터 파악 -> 전처리 -> 모델링(머신러닝 코드 작성) -> 훈련(테스트용 남겨두고) -> 성능 평가 -> 배포
Pandas: 파이썬 데이터 처리를 위하 라이브버리.
Pandas는 총 세 가지의 데이터 구조를 사용합니다.
시리즈 클래스는 1차원 배열의 값(values)에 각 값에 대응되는 인덱스(index)를 부여할 수 있는 구조를 갖고 있습니다.
데이터프레임은 2차원 리스트를 매개변수로 전달합니다.
데이터프레임은 리스트(List), 시리즈(Series), 딕셔너리(dict), Numpy의 ndarrays, 또 다른 데이터프레임으로부터 생성할 수 있습니다.
Numpy: 수치 데이터를 다루는 파이썬 패키지.
start: 시작 인덱스 (생략 가능, 기본값은 0)
stop: 종료 인덱스 (생략 가능, 기본값은 배열의 끝)
step: 단계 (생략 가능, 기본값은 1)
Matplotlib : 데이터를 차트나 플롯으로 시각화하는 패키지
plt.xlabel('hours') // x축에 이름삽입
plt.ylabel('score') //y축에 이름삽
plt.legend(['A student', 'B student']) //범례 삽입
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size= 0.2, random_state=1234) X : 독립 변수 데이터. (배열이나 데이터프레임) y : 종속 변수 데이터. 레이블 데이터. test_size : 테스트용 데이터 개수를 지정한다. 1보다 작은 실수를 기재할 경우, 비율을 나타낸다. train_size : 학습용 데이터의 개수를 지정한다. 1보다 작은 실수를 기재할 경우, 비율을 나타낸다. random_state : 난수 시드 random_state의 값을 고정해두면 실행할 때마다 항상 동일한 순서로 데이터를 섞으므로, 동일한 코드를 다음에 재현하고자 할 때 사용할 수 있습니다. ```
벡터: 1차원 값
행렬: 2차원 값 = 2차원 텐서
텐서: 3차원 값
batch: 행렬에서 행의 크기
dim: 행렬에서 열의 크기
컴퓨터에서는 batch단위로 연산을 수행함. 데이터가 너무 많으면 연산 효용성이 낮아지기 때문.
1D with PyTorch
t = torch.FloatTensor([0., 1., 2., 3., 4., 5., 6.]) print(t)```
2D with PyTorch
t = torch.FloatTensor([[1., 2., 3.], [4., 5., 6.], [7., 8., 9.], [10., 11., 12.] ]) print(t)```
브로드캐스팅: 자동으로 행렬의 크기를 맞춰서 연산을 수행하게 만드는 PyTorch 기능
matmul() 과 mul() 차이
matmul(): 행렬 곱셈
mul(): 서로 다른 크기의 행렬을 브로드캐스팅 후 element_wise 곱셈 실행.
.mean(): 평균
dim = 0: 첫번째 차원(행렬에선 행)이 0임을 의미
.sum(): 덧셈
.max(): 최댓값 리턴
.view(x,y): 원소의 수를 유지하면서 텐서의 크기 변경
Numpy의 reshape과 같은 역할
텐서의 크기를 (x,y)의 크기로 변경
- view는 기본적으로 변경 전과 변경 후의 텐서 안의 원소의 개수가 유지되어야 합니다.
- 파이토치의 view는 사이즈가 -1로 설정되면 다른 차원으로부터 해당 값을 유추합니다.
.squeeze(): 차원이 1인경우 해당 차원을 제거
ex) (3x1)인 차원에서 (3,)의 크기를 가지는 텐서로 변경된
.Unsqueeze(): 특정 위치에 1인 차원을 추가한다
ex) .unsqueeze(0)
[0,1,2] -> [[0., 1., 2.]]
인자로 -1이 들어가면 인덱스 상으로 마지막 차원을 의미
타입 캐스팅 : 자료형 변환
텐서 연결하기 (concatenate)
In-Place Operation (덮어쓰기 연산)
연산뒤에 _를 붙이면 기존의 값을 변수에 저장하지 않아도 덮어쓰기 함
옵티마이저 : 최적화 알고리즘. 옵티마이저를 통해 최적한 와 를 찾아내는 과정을 머신러닝에서 학습이라고 함
전체코드
# 데이터
x_train = torch.FloatTensor([[1], [2], [3]])
y_train = torch.FloatTensor([[2], [4], [6]])
# 모델 초기화
W = torch.zeros(1, requires_grad=True)
b = torch.zeros(1, requires_grad=True)
# optimizer 설정
optimizer = optim.SGD([W, b], lr=0.01)
nb_epochs = 1999 # 원하는만큼 경사 하강법을 반복
for epoch in range(nb_epochs + 1):
# H(x) 계산
hypothesis = x_train * W + b
# cost 계산
cost = torch.mean((hypothesis - y_train) ** 2)
# cost로 H(x) 개선
optimizer.zero_grad()
cost.backward()
optimizer.step()
# 100번마다 로그 출력
if epoch % 100 == 0:
print('Epoch {:4d}/{} W: {:.3f}, b: {:.3f} Cost: {:.6f}'.format(
epoch, nb_epochs, W.item(), b.item(), cost.item()
))
다수의 x로부터 y의 값을 예측하는 것
벡터의 내적: 행렬의 곱셈 과정에서 이루어지는 벡터 연산
x_train = torch.FloatTensor([[73, 80, 75],
[93, 88, 93],
[89, 91, 80],
[96, 98, 100],
[73, 66, 70]])
y_train = torch.FloatTensor([[152], [185], [180], [196], [142]])
# 모델 초기화
W = torch.zeros((3, 1), requires_grad=True)
b = torch.zeros(1, requires_grad=True)
# optimizer 설정
optimizer = optim.SGD([W, b], lr=1e-5)
nb_epochs = 20
for epoch in range(nb_epochs + 1):
# H(x) 계산
# 편향 b는 브로드 캐스팅되어 각 샘플에 더해집니다.
hypothesis = x_train.matmul(W) + b
# cost 계산
cost = torch.mean((hypothesis - y_train) ** 2)
# cost로 H(x) 개선
optimizer.zero_grad()
cost.backward()
optimizer.step()
print('Epoch {:4d}/{} hypothesis: {} Cost: {:.6f}'.format(
epoch, nb_epochs, hypothesis.squeeze().detach(), cost.item()
))
--- nn.Module과 클래스 구현