■ 단순선형회귀
한 개의 변수에 의한 결과를 예측
하나의 독립 변수(X)와 하나의 종속 변수(Y) 간의 관계를 직선으로 모델링하는 방법
Y = β0 + β1X (β0 : 절편, β1 : 기울기)
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, r2_score
# 예시 데이터 생성
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("회귀 계수:", model.coef_)
print("절편:", model.intercept_)
# 모델 평가
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print("평균 제곱 오차(MSE):", mse)
print("결정 계수(R2):", r2)
# 시각화
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()
회귀 계수: [[2.9902591]]
절편: [4.20634019]
평균 제곱 오차(MSE): 0.9177532469714291
결정 계수(R2): 0.6521157503858556
■ 다중선형회귀
두 개 이상의 변수에 의한 결과를 예측
두 개 이상의 독립 변수(X1, X2, ..., Xn)와 하나의 종속 변수(Y) 간의 관계를 모델링하는 방법
Y = β0 + β1X1 + β2X2 + ... + βnXn
변수들 간의 다중공선성 문제가 발생할 수 있다.
- 다중공선성 (Multicollinearity) : 회귀분석에서 독립 변수들 간에 높은 상관관계가 있는 경우를 말한다.
▷ 다중공선성 진단방벙
→ 가장 간단한 방법으로는 상관계수를 계산하여 상관계수가 높은(약 0.7) 변수들이 있는지 확인해볼 수 있다.
→ 더 정확한 방법으로는 분산 팽창 계수 (VIF)를 계산하여 VIF값이 10 초과면 다중공선성이 높다고 판단할 수 있다.
▷ 다중공선성 해결 방법
→ 가장 간단한 방법으로는 높은 계수를 가진 변수 중 하나를 제거하는 것이다.
→ 혹은 주성분 분석(PCA)과 같은 변수들을 효과적으로 줄이는 차원 축소 기법을 적용하여 해결할 수도 있다.
# 예시 데이터 생성
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("회귀 계수:", model.coef_)
print("절편:", model.intercept_)
# 모델 평가
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print("평균 제곱 오차(MSE):", mse)
print("결정 계수(R2):", r2)
회귀 계수: [-0.02208636 -0.04524956 0.36955755]
절편: 47.47458066489461
평균 제곱 오차(MSE): 953.8458662397385
결정 계수(R2): -0.1404412078044821
■ 범주형변수
수치형 데이터가 아닌 주로 문자형 데이터로 이루어져 있는 변수
- 순서가 있는 범주형 변수
- 옷의 사이즈 (L, M, …), 수능 등급 (1등급, 2등급, ….)과 같이 범주형 변수라도 순서가 있는 변수에 해당한다
- 이런 경우 각 문자를 임의의 숫자로 변환해도 문제가 없다 (순서가 잘 반영될 수 있게 숫자로 변환)
- ex) XL → 3, L → 2, M → 1, S → 0
- 순서가 없는 범주형 변수
- 성별 (남,여), 지역 (부산, 대구, 대전, …) 과 같이 순서가 없는 변수에 해당한다
- 2개 밖에 없는 경우 임의의 숫자로 바로 변환해도 문제가 없지만
- 3개 이상인 경우에는 무조건 원-핫 인코딩(하나만 1이고 나머지는 0인 벡터)변환을 해주어야 한다 → pandas의 get_dummies를 활용하여 쉽게 구현 가능
- ex) 부산 = [1,0,0,0], 대전 = [0,1,0,0], 대구 = [0,0,1,0], 광주 = [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)
# 독립 변수(X)와 종속 변수(Y) 설정
X = df[['Experience', 'Gender_Male']]
y = df['Salary']
# 단순선형회귀 모델 생성 및 훈련
model = LinearRegression()
model.fit(X, y)
# 예측
y_pred = model.predict(X)
# 회귀 계수 및 절편 출력
print("회귀 계수:", model.coef_)
print("절편:", model.intercept_)
# 모델 평가
mse = mean_squared_error(y, y_pred)
r2 = r2_score(y, y_pred)
print("평균 제곱 오차(MSE):", mse)
print("결정 계수(R2):", r2)
■ 다항회귀, 스플라인회귀
- 다항회귀 : 독립 변수와 종속 변수 간의 관계가 선형이 아닐 때 사용. 독립 변수의 다항식을 사용하여 종속 변수를 예측
데이터가 곡선적 경향을 따를 때 사용
고차 다항식의 경우 과적합(overfitting) 위험이 있다.
from sklearn.preprocessing import PolynomialFeatures
# 예시 데이터 생성
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("평균 제곱 오차(MSE):", mse)
print("결정 계수(R2):", r2)
# 시각화
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()
평균 제곱 오차(MSE): 9.447441952450278
결정 계수(R2): 0.9898873384220381
- 스플라인회귀 : 독립 변수의 구간별로 다른 회귀식을 적용하여 복잡한 관계를 모델링
구간마다 다른 다항식을 사용하여 전체적으로 매끄러운 곡선을 생성한다.
데이터가 국부적으로 다른 패턴을 보일 때 사용
복잡한 비선형 관계를 유연하게 모델링할 수 있다.
적절한 매듭점(knots)의 선택이 중요하다.
'통계' 카테고리의 다른 글
스파르타 통계학 기초 강의 정리 6 <가설검정의 주의점> (0) | 2024.08.07 |
---|---|
스파르타 통계학 기초 강의 정리 5 <상관관계> (0) | 2024.08.07 |
스파르타 통계학 기초 강의 정리 3 <유의성 검정> (0) | 2024.08.06 |
스파르타 통계학 기초 강의 정리 2 <데이터의 분포> (3) | 2024.08.05 |
스파르타 통계학 기초 강의 정리 1 (0) | 2024.08.05 |