DecisiomTree, RandomForest 정리

이예나·3일 전
중고차 가격 예측: Decision Tree · Random Forest
1. 라이브러리 불러오기
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeRegressor
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import root_mean_squared_error
2. 데이터 불러오기
file_path = "/데이터가_있는_폴더/car_data.csv"

df = pd.read_csv(file_path)
df.head()
3. 데이터 전처리
# 차량 이름은 종류가 많으므로 제거
car_df = df.drop(columns="Car_Name")

# 주행거리 이상치 제거
car_df = car_df[car_df["Kms_Driven"] < 100000].copy()

# 연식(Year)을 차량 나이(Vehicle_Age)로 변환
car_df["Vehicle_Age"] = 2020 - car_df["Year"]
car_df = car_df.drop(columns="Year")

# CNG 차량 데이터 제거
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
)

car_df.head()
4. 입력 데이터와 정답 데이터 분리
  • X: 가격 예측에 사용할 입력 정보
  • y: 예측할 정답값인 판매 가격
X = car_df.drop(columns="Selling_Price")
y = car_df["Selling_Price"]
5. 학습 데이터와 테스트 데이터 분리
X_train, X_test, y_train, y_test = train_test_split(
    X,
    y,
    test_size=0.2,
    random_state=2026
)
6. 결정 트리 모델
tree_model = DecisionTreeRegressor(
    max_depth=6,
    min_samples_leaf=5,
    random_state=2026
)

tree_model.fit(X_train, y_train)

tree_pred = tree_model.predict(X_test)

tree_rmse = root_mean_squared_error(y_test, tree_pred)
print(f"결정 트리 RMSE: {tree_rmse:.3f}")
7. 랜덤 포레스트 모델
rf_model = RandomForestRegressor(
    n_estimators=200,
    random_state=2026
)

rf_model.fit(X_train, y_train)

rf_pred = rf_model.predict(X_test)

rf_rmse = root_mean_squared_error(y_test, rf_pred)
print(f"랜덤 포레스트 RMSE: {rf_rmse:.3f}")
8. 실제 가격과 예측 가격 비교

빨간 선에 가까울수록 실제 판매 가격과 예측 가격이 비슷하다는 의미입니다.

sns.scatterplot(x=y_test, y=rf_pred)

plt.plot(
    [y_test.min(), y_test.max()],
    [y_test.min(), y_test.max()],
    color="red"
)

plt.xlabel("실제 판매 가격")
plt.ylabel("예측 판매 가격")
plt.show()
9. 변수 중요도 확인

랜덤 포레스트가 가격을 예측할 때 어떤 변수를 중요하게 사용했는지 확인합니다.

feature_importance = pd.DataFrame({
    "feature": X.columns,
    "importance": rf_model.feature_importances_
}).sort_values("importance", ascending=False)

print(feature_importance)

sns.barplot(
    data=feature_importance,
    x="importance",
    y="feature"
)

plt.title("변수 중요도")
plt.show()
결과 해석
  • RMSE가 작을수록 예측 오차가 작습니다.
  • 결정 트리는 한 개의 나무로 예측합니다.
  • 랜덤 포레스트는 여러 결정 트리의 예측을 평균 내므로 일반적으로 더 안정적입니다.
  • 트리 기반 모델은 입력 데이터의 스케일링이 필수는 아닙니다.

0개의 댓글