오늘은 대학원 합격 데이터를 이용해 로지스틱 회귀와 규제 모델을 비교하고, 중고차 가격 데이터에 결정 트리 회귀를 적용했다. 분류에서는 정답을 맞힌 비율을, 가격 예측에서는 실제 값과 예측값의 차이를 확인했다.
대학원 합격 데이터에서 식별용 컬럼 두 개를 제외하고, GRE·TOEFL 점수, 학점, 연구 경험 등 일곱 특성으로 합격 여부를 예측했다. 400개 행을 학습 320개와 테스트 80개로 나누고, 학습 데이터 기준으로 표준화했다.
X2_train, X2_test, y2_train, y2_test = train_test_split(
X2, y2, test_size=0.2, random_state=2026, stratify=y2
)
X2_train_scaled = scaler2.fit_transform(X2_train)
X2_test_scaled = scaler2.transform(X2_test)
lr2 = LogisticRegression()
lr2.fit(X2_train_scaled, y2_train)
로지스틱 회귀의 학습·테스트 정확도는 모두 0.8875였다. predict_proba()로 각 행의 합격 클래스 확률도 확인했다. 계수를 정렬해 보니 표준화된 특성 중 CGPA의 계수가 가장 컸다.
같은 데이터에 선형 회귀, Ridge, Lasso도 적용했다. 이 모델들은 연속값을 반환하므로 MSE·RMSE를 계산하고, 출력값을 0.5 기준으로 나눴을 때의 분류 정확도도 별도로 확인했다.
| 모델 | RMSE | 0.5 기준 분류 정확도 |
|---|---|---|
| LinearRegression | 0.3183 | 0.8625 |
| Ridge | 0.3181 | 0.8625 |
| Lasso | 0.3183 | 0.8875 |
이번 설정에서 Lasso는 LOR 계수를 0으로 만들었다. 계수에 제약을 주는 방식에 따라 결과가 어떻게 바뀌는지 확인했지만, 이 정확도만으로 모델의 우열을 단정할 수는 없다.
중고차 데이터는 301개 행에서 시작했다. 차량 이름을 제외하고 주행거리 10만 km 이상인 행을 제거하니 293개가 남았다. 연료 종류가 CNG인 행 2개도 제외하고, 연료·판매자·변속기 종류를 더미 변수로 변환했다.
car_df = car_df[car_df["Kms_Driven"] < 100000].copy()
car_df["Vehicle_Age"] = 2020 - car_df["Year"]
car_df = car_df[car_df["Fuel_Type"] != "CNG"].copy()
car_df = pd.get_dummies(
car_df,
columns=["Fuel_Type", "Seller_Type", "Transmission"],
drop_first=True,
dtype=int
)
차량 연식에서 만든 Vehicle_Age와 원본 Year를 동시에 넣자 두 컬럼의 상관계수가 -1이고 VIF가 매우 크게 나왔다. Year를 제거한 뒤 다시 계산하니 나머지 특성의 VIF가 약 1.04~2.20으로 내려갔다. 파생변수를 만들었다면 원본 컬럼과 정보가 겹치는지도 확인해야 한다.
전처리한 291개 행을 학습 232개와 테스트 59개로 나누고 판매 가격을 예측했다. 결정 트리는 특성을 기준으로 데이터를 여러 구간으로 나눈 뒤, 각 구간의 값으로 가격을 예측한다. 이번 실습에서는 두 모델 모두 표준화한 입력값으로 학습했다.
dtr = DecisionTreeRegressor(random_state=2026)
dtr.fit(X_train_scaled, y_train)
y_pred1 = dtr.predict(X_test_scaled)
rmse = root_mean_squared_error(y_test, y_pred1)
기본 결정 트리의 테스트 RMSE는 약 1.179, 선형 회귀는 약 1.107이었다. 실제 가격과 예측 가격을 산점도로 비교하고, 오차를 원래 가격과 같은 단위로 볼 수 있는 RMSE를 사용했다.
트리의 max_depth=60, min_samples_leaf=40을 지정해 다시 학습한 결과 RMSE는 약 2.099로 높아졌다. 분할 조건을 제한한다고 항상 성능이 좋아지는 것은 아니었다. 다음에는 깊이와 리프의 최소 샘플 수를 각각 바꿔 보며 결과를 비교해 볼 생각이다.