A. 금일 학습 내용
Diabetes 데이터 회귀 분석 진행하기
Diabetes 데이터셋 이용
해당 데이터의 특징과 문제 해결 유형을 정리하라.
- Linear Regression 모델과 Polynomial Regression 모델을 학습한 후 MSE로 성능을 계산한 후 비교하라.
- 해당 문제에서는 Accuracy를 사용하면 어떻게 될지 고민 할 것.
1. 데이터 불러오기
import pandas as pd
from sklearn.datasets import load_diabetes
diabetes = load_diabetes()
X1, y1 = diabetes.data, diabetes.target
diabetes_df = pd.DataFrame(diabetes.data, columns=diabetes.feature_names)
diabetes_df['target'] = diabetes.target
diabetes_df.head(3)
- scikit-learn(일명 사이킷런)에서 diabetes dataset를 불러온다.
2. LinearRegression 모델 생성 및 훈련
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
- 필요 라이브러리 불러오기
# LinearRegression 모델 생성
model_lr = LinearRegression()
X = diabetes_df[['bmi']]
y = diabetes_df[['target']]
# train data, test data 분리
X_train, X_test, y_train, y_test = train_test_split(diabetes.data,diabetes.target, random_state=42,test_size=0.3)
# LinearRegression 모델 훈련
model_lr.fit(X=X_train, y=y_train)
# 예측값 구하기
y_pred =model_lr.predict(X_test)
y_train_pred = model_lr.predict(X_train)
# mse 평가
train_mse = mean_squared_error(y_train, y_train_pred)
test_mse = mean_squared_error(y_test,y_pred)
print(train_mse)
print(test_mse)
3. Polynomial Regression 모델 생성 및 훈련
import pandas as pd
from sklearn.datasets import load_diabetes
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
- 필요한 라이브러리 불러오기 (앞서 불러온 것은 다시 불러올 필요 없다.)
# 데이터 불러오기
diabetes = load_diabetes()
X, y = diabetes.data, diabetes.target
diabetes_df = pd.DataFrame(data=X, columns=diabetes.feature_names)
diabetes_df['target'] = diabetes.target
# train data, test data 분리
X_train, X_test, y_train, y_test = train_test_split(diabetes.data,diabetes.target, random_state=42,test_size=0.3)
# 다항회귀분석 모델 생성
poly = PolynomialFeatures(degree=2)
# 다항식 특성을 갖는 x값 변환
X_poly_train = poly.fit_transform(X_train) #train 용 데이터 변환
X_poly_test = poly.transform(X_test) # test용 데이터 변환
# PolynomialFeatures을 LinearRegression 모델 훈련
model_lr2 = LinearRegression()
model_lr2.fit(X_poly_train,y_train)
# 예측값 구하기
y_pred =model_lr2.predict(X_poly_test)
y_train_pred = model_lr2.predict(X_poly_train)
# mse 평가
train_mse2 = mean_squared_error(y_train, y_train_pred)
test_mse2 = mean_squared_error(y_test,y_pred)
print(train_mse2)
print(test_mse2)
4. Linear Regression 모델과 Polynomial Regression 모델의 MSE 비교
print('LinearRegression_train_mse: ',train_mse)
print('PolynomialFeatures_train_mse: ',train_mse2)
print('LinearRegression_test_mse: ',test_mse)
print('PolynomialFeatures_test_mse: ',test_mse2)
5. 결과
학습 데이터의 결과, Polynomial Regression의 학습 데이터에 대한 MSE가 Linear Regression보다 낮다. 이는 Polynomial Regression 이 학습 데이터에 더 잘 맞추어져 있다는 것을 의미한다.
테스트 데이터의 결과, Polynomial Regression 의 MSE가 Linear Regression의 MSE보다 높다. 즉, 학습 데이터의 결과와 반대되는 결과가 도출된다. 이는 Polynomial Regression이 학습데이터에는 잘 맞았지만 테스트 데이터에 대해서는 성능이 떨어진다는 것을 의미한다.
두 데이터를 바탕으로 Polynomial Regression의 경우 학습데이터가 과적합되었음을 유추할 수 있다. 학습데이터에서는 더 복잡한 Polynomial Regression이 잘 작동하지만, 테스트 데이터에서는 일반화가 잘 되지 않으며 성능이 떨어짐을 알 수 있다. 그러나 Linear Regression은 학습데이터와 테스트 데이터 간의 MSE 차이가 크지 않아 비교적 안정적인 성능을 보인다.
6. Accuracy 사용에 대한 고민
회귀 문제에서 Accuracy 지표를 사용하는 것은 적절하지 않을 수 있다고 생각한다. Accuracy는 주로 분류 문제에서 예측의 정확성을 비율로 나타내며, 이산적인 결과를 다루기 때문에 중요한 역할을 한다. 그러나 회귀 문제는 결과가 연속적이므로 Accuracy가 회귀 문제의 특성을 충분히 반영하지 못할 가능성이 있다. 임의의 기준을 설정하여 Accuracy를 계산하는 경우, 이는 주관적일 수 있으며 모델의 성능을 왜곡할 위험이 존재한다. 회귀 모델은 예측값이 실제값에 얼마나 근접하는지를 평가하고, 이 차이를 최소화하는 것을 목표로 한다. 예측값이 실제값에서 크게 벗어난 경우에도 Accuracy 계산에서는 이러한 차이가 반영되지 않을 수 있다. 따라서 회귀 문제에서는 MSE(Mean Squared Error)나 MAE(Mean Absolute Error)와 같은 연속형 평가 지표를 사용하는 것이 더 합리적이고 정확할 것으로 보인다. 이 실험에서도 MSE를 사용하여 두 모델을 비교했으며, 그 결과 Polynomial Regression 모델이 학습 데이터에서는 과적합되었지만 테스트 데이터에서는 성능이 떨어졌다는 것을 정확히 파악할 수 있었다. 만약 Accuracy를 사용했다면 이러한 과적합 문제를 제대로 감지하지 못했을 가능성이 크다.
'Today I Learned' 카테고리의 다른 글
[내일배움캠프_데이터분석] 11주차 월요일 TIL _ BI (Tableau 기초) (6) | 2024.09.02 |
---|---|
[내일배움캠프_데이터분석] 9주차 수요일 TIL _ 군집분석(과제) (0) | 2024.08.21 |
[내일배움캠프_데이터분석] 8주차 금요일 TIL _ 로지스틱 회귀분석(분류분석) (0) | 2024.08.16 |
[내일배움캠프_데이터분석] 8주차 수요일 TIL _ map( ), 문자열 나누기 (0) | 2024.08.14 |
[내일배움캠프_데이터분석] 8주차 화요일 TIL _ 단순선형회귀모형 식 구하기 (0) | 2024.08.13 |