해결된 질문
작성
·
27
0
# 라이브러리 및 데이터 불러오기
import pandas as pd
train = pd.read_csv("https://raw.githubusercontent.com/lovedlim/inf/refs/heads/main/p4/8_2/churn_train.csv")
test = pd.read_csv("https://raw.githubusercontent.com/lovedlim/inf/refs/heads/main/p4/8_2/churn_test.csv")
#EDA
print(train.shape, test.shape)
#(4116, 19) (1764, 18)
# print(train.info())
# print(test.info())
#결측치 x
# print(train.isnull().sum())
# print(test.isnull().sum())
#,수치형,오브젝트 체크
# train.describe(include='O')
# train.describe()
#Id는 버리기
# train['TotalCharges'].value_counts() #타겟이 많으면 회귀
#데이터 전처리
train = train.drop('customerID',axis=1)
test= test.drop('customerID',axis =1)
print(train.shape, test.shape)
#타겟 분리
target = train.pop('TotalCharges')
#스케일링
#컬럼다르면 합치고 인코딩후 분리
df = pd.concat([train,test],axis=0)
train1 = df.iloc[:len(train)].copy()
test1 = df.iloc[len(train):].copy()
print(train.shape, test.shape)
from sklearn.preprocessing import RobustScaler
cols = train1.describe(exclude='object').columns
scaler = RobustScaler()
train1[cols] = scaler.fit_transform(train1[cols])
test1[cols] = scaler.transform(test1[cols])
#인코딩
from sklearn.preprocessing import LabelEncoder
cols = train1.describe(include='object').columns
le = LabelEncoder()
for col in cols:
train1[col] = le.fit_transform(train1[col])
test1[col] = le.transform(test1[col])
print(train.shape, test.shape)
#검증데이터 분리
from sklearn.model_selection import train_test_split
x_tr,x_val,y_tr,y_val = train_test_split(train1, target, test_size=0.2, random_state=0)
print(x_tr.shape,x_val.shape,y_tr.shape,y_val.shape)
#모델 학습(랜덤)
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_absolute_error
rf = RandomForestRegressor(random_state=0)
rf.fit(x_tr,y_tr)
pred = rf.predict(x_val)
print(mean_absolute_error(y_val,pred))
#lightGBM
import lightgbm as lgb
lgbmr = lgb.LGBMRegressor(random_state=0, verbose=0)
lgbmr.fit(x_tr,y_tr)
pred = lgbmr.predict(x_val)
print(mean_absolute_error(y_val,pred))
#xgboost
from xgboost import XGBRegressor
xgbr = XGBRegressor(random_state=0)
xgbr.fit(x_val,y_val)
pred = xgbr.predict(x_val)
print(mean_absolute_error(y_val,pred))
#951.033800718042 랜덤
#952.79254077987 lightgbm
#41.89787395866172 xgboost
맨마지막에 xgboost로 돌렸는데 41이라는 결과 나옵니다 이건 과적합인가요?
답변 2
0
이렇게까지 차이가 나진 않는데 특이 케이스네요~
무조건 성능이 좋은쪽을 선택해 주세요!
빅분기에서 저는 과적합이란 단어는 사용하지 않고 있는데
신경쓰지 않으셔도 됩니다.
0
안녕하세요, 인프런 AI 인턴입니다. 김경원님.
현재 질문하신 코드에서 xgboost
를 사용하여 테스트 데이터를 예측한 후 41이라는 매우 낮은 값의 Mean Absolute Error (MAE)
를 얻으신 것 같습니다. 이는 과적합을 의심할 수 있는 상황입니다. 일반적으로 과적합이 발생할 때는 모델이 학습 데이터에 너무 잘 맞추어져 있지만, 새로운 데이터(혹은 검증 데이터)에 대해서는 일반화가 잘 이루어지지 않아서 과도하게 낮은 손실 값이나 높은 평가 점수가 나타날 수 있습니다.
과적합을 방지하거나 줄이기 위해 다음과 같은 방법을 고려하실 수 있습니다:
Regularization 사용: XGBoost에는 L1(Lasso regularization) 및 L2(Ridge regularization)를 적용하여 모델의 복잡도를 제어할 수 있습니다. 이를 통해 과적합을 방지할 수 있습니다.
모델의 복잡도 줄이기: max_depth
와 같은 하이퍼파라미터를 조정하여 트리의 깊이를 제한하거나, n_estimators
값을 줄여 모델이 너무 깊거나 방대한 설정을 피하는 것이 좋습니다.
더 많은 데이터 사용: 더 많은 데이터를 사용하면 모델이 더 일반화될 수 있도록 도움을 줄 수 있습니다.
Cross-validation 사용: 교차 검증을 통해 모델이 데이터의 특정 부분에 의존하지 않고 일반화되는지 확인할 수 있습니다.
Feature engineering 및 selection: 불필요한 특성을 제거하거나, 새로운 특성을 추가하여 데이터를 잘 표현할 수 있도록 합니다.
그 밖에, MAE가 크게 다른 모델 간의 결과를 비교할 때는 각 모델의 하이퍼파라미터 설정을 동일하게 하고, 동일한 데이터를 사용하였는지 체크해 보시기 바랍니다.
유사 질문 참고 링크:
- 과적합 문제 해결 방안
- 하이퍼파라미터 튜닝이 있는 과적합 조정
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.