" 회귀 "
독립 변수(X)가 종속 변수(Y)에 미치는 영향을 모델링하고, 이를 통해 예측하거나 관계를 이해하는 통계 기법
목표
변수
종류
" 선형 회귀 "
독립 변수(X)가 종속 변수(Y)에 미치는 영향을 직선(선형)으로 모델링하는 방법
가정(공통 전제 조건)
회귀식
특징
사례
# 예시 데이터 생성
np.random.seed(0)
X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)
# 데이터 분할
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)
# 회귀 계수 및 절편 출력
print(f"회귀 계수: {model.coef_[0,0]:.3f}")
print(f"절편: {model.intercept_[0]:.3f}")
# 모델 평가
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print(f"평균 제곱 오차(MSE): {mse:.3f}")
print(f"결정 계수(R2): {r2:.3f}")
# 시각화
plt.scatter(X, y, color='blue')
plt.plot(X_test, y_pred, color='red', linewidth=2)
plt.title('linear regeression')
plt.xlabel('X : cost')
plt.ylabel('Y : sales')
plt.show()
회귀식
특징
사례
# 예시 데이터 생성
data = {'TV': np.random.rand(100) * 100,
'Radio': np.random.rand(100) * 50,
'Newspaper': np.random.rand(100) * 30,
'Sales': np.random.rand(100) * 100}
df = pd.DataFrame(data)
# 독립 변수(X)와 종속 변수(Y) 설정
X = df[['TV', 'Radio', 'Newspaper']]
y = df['Sales']
# 데이터 분할
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)
# 회귀 계수 및 절편 출력
print(f"회귀 계수: {model.coef_[0]:.3f}")
print(f"절편: {model.intercept_:.3f}")
# 모델 평가
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print(f"평균 제곱 오차(MSE): {mse:.3f}")
print(f"결정 계수(R2): {r2:.3f}")
" 범주형 회귀 "
순서가 있는 경우 : XL → 3, L → 2, M → 1, S → 0
순서가 없는 경우 : 부산 = [1,0,0], 대전 = [0,1,0], 서울 = [0,0,1]
# 예시 데이터 생성
data = {'Gender': ['Male', 'Female', 'Female', 'Male', 'Male'],
'Experience': [5, 7, 10, 3, 8],
'Salary': [50, 60, 65, 40, 55]}
df = pd.DataFrame(data)
# 범주형 변수 더미 변수로 변환
df = pd.get_dummies(df, drop_first=True) # drop_first=True : 범주형 변수 중 1개를 빼는 것 -> male컬럼의 false = female 이므로 female 컬럼이 따로 필요 x, 오히려 있으면 다중공선성 문제 발생할 수 있음
# 독립 변수(X)와 종속 변수(Y) 설정
X = df[['Experience', 'Gender_Male']]
y = df['Salary']
# 단순선형회귀 모델 생성 및 훈련
model = LinearRegression()
model.fit(X, y)
# 예측
y_pred = model.predict(X)
# 회귀 계수 및 절편 출력
print(f"회귀 계수: {model.coef_[0]:.3f}")
print(f"절편: {model.intercept_:.3f}")
# 모델 평가
mse = mean_squared_error(y, y_pred)
r2 = r2_score(y, y_pred)
print(f"평균 제곱 오차(MSE): {mse:.3f}")
print(f"결정 계수(R2): {r2:.3f}")
종속 변수 Y가 범주형(특히 이항, 0 / 1)일 때 사용, 분류 모델
선형회귀처럼 단순히 직선으로 예측하지 않고, 시그모이드 함수(로짓 함수)를 통해 0~1 사이의 확률로 변환
회귀식
종류
사례
import numpy as np
import pandas as pd
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# 데이터 생성 (공부 시간에 따른 합격 여부)
np.random.seed(0)
X = np.random.randint(1, 10, size=(50, 1)) # 공부 시간
y = (X.flatten() + np.random.randn(50) > 5).astype(int) # 1=합격, 0=불합격
# 모델 학습
model = LogisticRegression()
model.fit(X, y)
# 예측
y_pred = model.predict(X)
print("정확도:", accuracy_score(y, y_pred))
print(f"회귀계수: {model.coef_[0,0]:.3f}")
print(f"절편: {model.intercept_[0]:.3f}")
" 비선형 회귀 "
종속변수 Y와 독립변수 X의 관계가 직선이 아닌 곡선일 때 사용
장점 : 현실 데이터를 더 잘 설명해서 선형 모델보다 예측 정확도를 높일 수 있음
단점 : 해석이 어렵고 계산이 복잡하며 과적합의 위험이 있음
데이터가 곡선적 경향을 보일 때 사용
회귀식
특징
# 예시 데이터 생성
np.random.seed(0)
X = 2 - 3 * np.random.normal(0, 1, 100)
y = X - 2 * (X ** 2) + np.random.normal(-3, 3, 100)
X = X[:, np.newaxis]
# 다항 회귀 (2차)
polynomial_features = PolynomialFeatures(degree=2)
X_poly = polynomial_features.fit_transform(X)
model = LinearRegression()
model.fit(X_poly, y)
y_poly_pred = model.predict(X_poly)
# 모델 평가
mse = mean_squared_error(y, y_poly_pred)
r2 = r2_score(y, y_poly_pred)
print(f"평균 제곱 오차(MSE): {mse:.3f}")
print(f"결정 계수(R2): {r2:.3f}")
# 시각화
plt.scatter(X, y, s=10)
# 정렬된 X 값에 따른 y 값 예측
sorted_zip = sorted(zip(X, y_poly_pred))
X, y_poly_pred = zip(*sorted_zip)
plt.plot(X, y_poly_pred, color='m')
plt.title('polynomial regerssion')
plt.xlabel('area')
plt.ylabel('price')
plt.show()
데이터가 국부적으로 다른 패턴을 보일 때 사용
회귀식
특징
정신 체리자 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 아 웃기네