오늘의 계획은 지도학습 : 회귀모델 코드를 이해하는 거였따!
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
# 데이터 생성
X = np.array([[1, 1], [2, 2], [3, 3], [4, 4], [5, 5],[6,6]])
y = np.array([1, 2, 3, 4, 5, 6])
# 데이터 분할 (훈련 데이터와 테스트 데이터)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 선형 회귀 모델 생성 및 학습
model = LinearRegression()
model.fit(X_train, y_train)
# 예측
y_pred = model.predict(X_test)
# 모델 평가
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print(f'Mean Squared Error: {mse}')
print(f'R^2 Score: {r2}')
사실 난 아직도 기다란 코드를 보면 겁을 먹는다.
ㅎ.. 게다가 아직 낯선 것들이 너무 많다면?
기절한다
그래서 오늘은 하나하나 모르는 걸 다 물어보기로 했다.
맨 처음에 나오는 import는 안다! 넘파이랑 판다스 라이브러리를 불러온다.
from sklearn.model_selection import train_test_split
사이킷 런 라이브러리에서! train_test_split을 가져온다는 말이다.
train_test_split은 데이터를 훈련용과 테스트용으로 나누는 함수다.
from sklearn.linear_model import LinearRegression
사이킷 런 라이브러리에서 LinearRegression을 가져오는 코드다.
LinearRegression은 사이킷런에서 제공하는 선형 회귀 모델을 생성하는 클래스다.
선형 회귀 모델 객체를 생성하고 학습시키는 도구!
from sklearn.metrics import mean_squared_error, r2_score
사이킷런의 metrics모듈에서 두 가지 모델 평가 지표를 가져오는 코드다.
mean_squared_error(MSE)는 모델이 예측한 값과 실제 값 간의 차이를 제곱한 값들의 평균이다.
(실제값-평균값)^2을 1번째부터 n번째까지 다 더해서 n으로 나눴다는 말이다.
쓰고보니 이게 뭔 말인지 잘 모르겠는데 난 이해했다.
수학 공식을 적으려면 힘든 과정을 거쳐야 하기 때문에 넘어가겠다.
아니다. 캡쳐해야지
r2_score는 모델이 데이터를 얼마나 잘 설명하는지를 나타내는 지표다.
R^2의 값은
예측 값이 실제 값과 완전히 일치하면 1
모델이 단순 평균만큼도 예측하지 못하면 0
모델이 데이터 평균보다 성능이 나쁘면 음수!
분자는 실제 값에서 예측 값을 뺀 예측 오차
분모는 실제 값에서 실제 값을 평균을 뺀 총 변동성이다.
그러니까 총 변동성보다 예측 오차가 큰지 작은지에 따라서 r^2 값이 바뀌는갑다 하고 이해했다.
X = np.array([[1, 1], [2, 2], [3, 3], [4, 4], [5, 5],[6,6]])
y = np.array([1, 2, 3, 4, 5, 6])
np.array는 다차원 배열을 생성하기 위한 numpy의 도구다.
numpy.array는 파이썬의 기본 리스트나 튜플을 기반으로 넘파이 배열로 변환한다.
그럼 왜 파이썬 리스트나 튜플 안쓰고 넘파이 어레이 쓰느냐 하면
넘파이 배열은 파이썬 리스트보다 메모리 효율이 높고, 수과학적 연산에 최적화되어있다고 한다.
넘파이 배열은 파이썬 리스트와 달리 모든 요소가 '같은 데이터 타입'을 가진다.
넘파이 배열은 메모리 효율적이고 C언어 기반으로 구현되어 빠른 연산이 가능하다.
1차원(벡터), 2차원(행렬), n차원 배열까지 쉽게 생성하고 다룰 수 있기 때문에 넘파이 어레이를 쓰는 것이다!!!!
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
train_test_split은 아까 본 건데?
다시 한번 : 사이킷 런에서 훈련 데이터와 테스트 데이터로 나눈다!
뒤에 (X, y, test_size = 0.2, random_state = 42)라 적힌 것은..!
X는 모델이 학습할 입력 데이터
y는 모델이 예측하려는 출력 데이터
X_train은 훈련용 입력 데이터
X_test는 테스트용 입력 데이터
y_train은 훈련용 출력 데이터
y_test는 테스트용 출력 데이터
아이고 어질어질하지만 X는 입력데이터, y는 는 출력 데이터네..
train_test_split함수의 주요 매개변수는 (test_size, train_size, random_state, shuffle)
필수 매개변수와 선택 매개변수가 있어서 매개변수의 구조를 조금 복붙하겠다.
매개변수의 구조
- X (필수 매개변수)
- 모델의 입력 데이터입니다.
- 독립 변수(특징) 데이터로 2차원 배열 형태를 가집니다.
- 예: X = [[1, 1], [2, 2], [3, 3]]
여기서는 XX에 np.array([[1, 1], [2, 2], [3, 3], ...])가 들어갑니다.
- y (필수 매개변수)
- 모델의 출력 데이터입니다.
- 종속 변수(목표값)으로 보통 1차원 배열 형태를 가집니다.
- 예: y = [1, 2, 3]
여기서는 yy에 np.array([1, 2, 3, ...])가 들어갑니다.
- test_size (선택 매개변수)
- 테스트 데이터의 비율(0.0~1.0 사이 값) 또는 정수(샘플 개수)를 지정합니다.
- 예: test_size=0.2는 전체 데이터의 20%를 테스트 데이터로 사용하겠다는 뜻입니다.
- 생략 시 기본값은 0.25입니다.
- train_size (선택 매개변수)
- 훈련 데이터의 비율(0.0~1.0 사이 값) 또는 정수(샘플 개수)를 지정합니다.
- 일반적으로 생략되며, test_size로 나머지 비율을 자동 계산합니다.
- random_state (선택 매개변수)
- 데이터 분할 시 랜덤성을 결정하는 시드 값입니다.
- 같은 값을 지정하면 데이터 분할 결과가 항상 동일하게 유지됩니다.
- 생략하면 매 실행마다 다른 데이터 분할 결과를 얻습니다.
- shuffle (선택 매개변수)
- 데이터를 분할하기 전에 섞을지 여부를 지정합니다.
- 기본값은 True입니다.
전달된 매개변수 정리
- X: np.array([[1, 1], [2, 2], [3, 3], [4, 4], [5, 5], [6, 6]])
- 입력 데이터 (특징)
- y: np.array([1, 2, 3, 4, 5, 6])
- 출력 데이터 (목표값)
- test_size=0.2
- 테스트 데이터의 비율로, 전체 데이터의 20%를 테스트 데이터로 사용.
- 데이터가 6개라면 20%는 1.2개이지만, 정수로 반올림하여 1개를 테스트 데이터로 할당.
- random_state=42
- 랜덤 분할 시 동일한 결과를 보장하기 위한 시드값.
매개변수 전달 방식
- 위치 인자 (Positional Argument):
- train_test_split(X, y)처럼 순서대로 매개변수를 전달.
- 이 경우 X는 입력 데이터, y는 출력 데이터로 해석됩니다.
- 키워드 인자 (Keyword Argument):
- train_test_split(X, y, test_size=0.2, random_state=42)처럼 매개변수 이름을 명시적으로 지정.
- 순서를 바꿔도 문제가 없으며, 가독성을 높입니다.
늘 이렇게 날로 먹다가 직접 쓰려니 정말 힘들긴 하지만 확실히 머리에 넣는 데 도움이 되는 것 같다.
model = LinearRegression()
model.fit(X_train, y_train)
다시 나온 LinearRegression() : 선형 회귀 모델을 생성한다.
.fit(X, y)는 머신러닝 모델의 학습을 수행하는 핵심 메서드로, 입력데이터 X와 출력 데이터 y의 관계를 학습시킨다.
사용 시 주의점은 X가 반드시 2차원 배열이어야 한다는 것,
y의 크기가 X의 샘플 개수와 동일해야 한다는 것.
데이터에 이상치가 많거나 선형 관계가 없으면 모델 성능이 떨어질 수 있다.
y_pred = model.predict(X_test)
학습된 모델을 사용하여 새로운 데이터 X_test에 대한 예측값 y_pred를 생성하는 코드다.
model : 학습된 선형 회귀 모델 (LinearRegression), 이전 단계에서 fit(X_train, y_train)으로 학습된 상태다.
X_test : 테스트 데이터로 모델이 학습에 사용되지 않은 데이터 - 모델 성능 평가에 사용된다.
predict 메서드 : 학습된 모델이 Xtest를 기반으로 y_pred를 예측한다...
y_pred : 모델이 X에 대해 계산한 예측 결과값(출력 데이터). 실제 값과 비교하여 모델의 성능을 평가한다.
그리고 마지막! 모델 평가!
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print(f'Mean Squared Error: {mse}')
print(f'R^2 Score: {r2}')
첫번째 줄은 mean_squared_error(y_test, y_pred)
아까 초반부에 불러온거다! 그래서 MSE를 계산한다.
두번째줄도! 초반부에 불러온거다! 결정 계수를 계산한다.
그리고 마지막 두 줄은 f-string을 사용해서 계산된 MSE와 R^2값을 출력한다!
와 모르는거 너무 많다..
사실 오후 4시 쯤 가짜로 기절했었다. 너무 막막해서...
수준별 수업 들을 때 누워서 들었다...ㅎ
힘들고 답답했는데 좀 더 힘들고 답답해졌다가 그래도 이상하게 힘이 나서...
옆 방 스탠다드 방에 가서 놀았다.
근데 스탠다드 반 갈ㄱ걸 그랬나 싶었다가도..
난 아직 파이썬이 부족하니까, 베이직반에서 열심히 파이썬 하고, 스탠다드 방 녹화강의 보던지 해야겠다!
아무튼 아무튼 아무튼... 오늘도 나름 화이팅했다..!
'TIL' 카테고리의 다른 글
내일배움캠프 본캠프 15일차 - 파이썬 - 연산자, 자료형 / 함수 문제 풀기 (1) | 2024.12.13 |
---|---|
내일배움캠프 본캠프 14일차 - 파이썬 함수 (0) | 2024.12.12 |
내일배움캠프 본캠프 12일차 - 머신러닝 : 데이터 전처리, 의사결정나무 실습 (1) | 2024.12.10 |
내일배움캠프 본캠프 11일차 - 머신러닝 개념 정리 (1) | 2024.12.09 |
2주차 WIL (3) | 2024.12.06 |