House Rent Prediction Dataset은 주택 임대료를 예측하기 위한 목적으로 사용되는 데이터셋입니다. 이 데이터셋은 주로 머신러닝 및 데이터 분석 프로젝트에서 사용되며, 주택의 다양한 특성과 위치 정보를 기반으로 임대료를 예측하는 모델을 학습하는 데 활용됩니다.
import numpy as np
import pandas as pd
import seaborn as sns
rent_df = pd.read_csv('/본인의 드라이브 경로/House_Rent_Dataset.csv')
rent_df
rent_df.info()
rent_df.describe()
4.746000e+03
round(rent_df.describe(), 2)
rent_df['BHK']
sns.displot(rent_df['BHK'])
sns.displot(rent_df['Rent'])
rent_df['Rent'].sort_values()
sns.displot(rent_df['Size'])
boxplot
Boxplot은 데이터의 중앙값, 사분위수, 이상치 등을 시각적으로 표현하는 통계 그래프입니다. 주로 데이터 분포와 이상치를 빠르게 파악하기 위해 사용됩니다.
1. 중앙값 (Median, Q2): 데이터를 크기 순으로 정렬했을 때 중간에 위치한 값
2. Q1 (제1사분위수, 25%): 하위 25%에 해당하는 값
3. Q3 (제3사분위수, 75%): 상위 25%에 해당하는 값
4. IQR (Interquartile Range, 사분위 범위): Q3 - Q1, IQR은 데이터의 중간 50% 범위를 의미합니다.
5. Minimum: Q1 − 1.5 × IQR 이하에 속하지 않는 가장 작은 값
6. Maximum: Q3 + 1.5 × IQR 이하에 속하지 않는 가장 큰 값
7. 이상치: 일반적인 데이터 분포를 벗어난 값(Lower Bound=Q1−1.5×IQR, Upper Bound=Q3+1.5×IQR)
( IQR 기준으로 이상치를 정의하기 때문에 모든 상황에 완벽하지 않을 수 있습니다)
sns.boxplot(rent_df['Rent'])
sns.boxplot(rent_df['Size'])
sns.boxplot(rent_df['BHK'])
rent_df.isna().sum()
rent_df.isna().mean()
rent_df.info()
rent_df['Area Type'].unique()
rent_df['Area Type'].nunique()
for i in ['Floor', 'Area Type', 'Area Locality', 'City', 'Furnishing Status', 'Tenant Preferred', 'Point of Contact']:
print(i, rent_df[i].nunique())
rent_df.drop(['Floor', 'Area Locality', 'Posted On'], axis=1, inplace=True)
rent_df = pd.get_dummies(rent_df, columns=['Area Type', 'City', 'Furnishing Status', 'Tenant Preferred', 'Point of Contact'])
rent_df.head()
X = rent_df.drop('Rent', axis=1) # 독립변수
y = rent_df['Rent'] # 종속변수
X.head()
y
from sklearn.model_selection import train_test_split
# X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=2025)
X_train.head()
X_train.shape, X_test.shape
y_train.shape, y_test.shape
※ 사이킷런의 선형 회귀 학습 방법
사이킷런의 LinearRegression은 최소 제곱법(Ordinary Least Squares, OLS)을 기반으로 학습하며, 입력 데이터와 실제 목표값 사이의 잔차(Residual)의 제곱합을 최소화하는 방식으로 최적의 가중치(Weight)와 절편(Bias)를 구합니다. 내부적으로는 수치적으로 더 안정적인 특이값 분해(Singular Value Decomposition, SVD)를 사용하여 계산됩니다. 이 방식은 데이터셋이 비교적 작고 특성 수가 적당할 때 효율적입니다.
※ 최소 제곱법
최소 제곱법(Least Squares Method)은 주어진 데이터 포인트들과 예측 모델(주로 직선) 사이의 오차(Residuals)의 제곱합(Sum of Squared Errors, SSE)을 최소화하여 최적의 예측 모델을 찾아내는 통계적 방법입니다. 이 방법은 선형 회귀 분석에서 가장 널리 사용되며, 데이터 포인트들이 회귀선(Regression Line)에 최대한 가깝도록 조정합니다. 수학적으로는 오차의 제곱합을 최소화하는 기울기(w)와 절편(b)을 계산하여 모델을 최적화합니다.
※ 닫힌 해(Closed-form Solution)
from sklearn.linear_model import LinearRegression
lr = LinearRegression()
lr.fit(X_train, y_train)
pred = lr.predict(X_test)
from sklearn.metrics import mean_squared_error, root_mean_squared_error
print(mean_squared_error(y_test, pred))
print(root_mean_squared_error(y_test, pred))
X_train.loc[1837]
y_train.loc[1837]
# 아웃라이어로 생각되는 데이터를 삭제
X_train.drop(1837, inplace=True)
y_train.drop(1837, inplace=True)
lr = LinearRegression()
lr.fit(X_train, y_train)
new_pred = lr.predict(X_test)
root_mean_squared_error(y_test, new_pred)
주택 임대료 데이터셋은 오른쪽으로 치우친 분포를 가지고 있습니다. 값이 큰 임대료(Outliers)가 평균과 모델 예측 결과에 큰 영향을 미치기 때문에 로그 변환을 통해 값의 범위를 축소하고, 분포를 정규 분포(Normal Distribution)에 가깝게 만듭니다. 로그 변환은 극단적으로 높은 값의 영향을 줄여주기 때문에 모델이 이상치에 덜 민감하게 반응하고 RMSE가 감소할 수 있습니다.
※ 정규 분포
정규 분포(Normal Distribution)는 데이터가 평균을 중심으로 좌우 대칭을 이루며 종 모양(Bell Curve)으로 퍼져 있는 통계적 분포입니다. 대부분의 값은 평균 근처에 몰려 있고, 평균에서 멀어질수록 값의 빈도가 급격히 감소합니다. 이는 자연현상, 시험 점수, 사람들의 키와 같은 많은 실제 데이터에서 흔하게 나타납니다.
※ 데이터 변환의 개념
원본 데이터: 실제 관측된 값 그대로입니다. (예: 임대료 1,000원, 10,000원, 100,000원)
로그 변환된 데이터: 데이터의 **비율(비율적 차이)**에 초점을 맞추어 변환된 값입니다. (예: log(1,000) → 3, log(10,000) → 4, log(100,000) → 5)
y_train = np.log1p(y_train)
y_test = np.log1p(y_test)
lr = LinearRegression()
lr.fit(X_train, y_train)
y_pred_log = lr.predict(X_test)
# 로그 예측값을 원래 값으로 변환
log_pred = np.expm1(y_pred_log)
y_test_original = np.expm1(y_test)
root_mean_squared_error(y_test_original, log_pred)
앙상블 모델(Ensemble Model)은 여러 개의 머신러닝 모델을 조합하여 하나의 강력한 예측 모델을 만드는 방법입니다. 각 개별 모델(약한 학습기, Weak Learner)이 가진 장점을 결합하고 약점을 보완함으로써 예측 정확도와 안정성을 향상시킵니다. 대표적인 앙상블 기법으로는 배깅(Bagging), 부스팅(Boosting), 스태킹(Stacking)이 있으며, 랜덤 포레스트(Random Forest)와 XGBoost는 각각 배깅과 부스팅을 대표하는 알고리즘입니다. 앙상블 모델은 특히 복잡한 문제나 다양한 패턴이 존재하는 데이터셋에서 뛰어난 성능을 발휘합니다.
※ 랜덤 포레스트
랜덤 포레스트(Random Forest)는 다수의 결정 트리(Decision Tree)를 결합해 예측을 수행하는 앙상블 학습 방법입니다. 각각의 트리는 무작위로 선택된 데이터 샘플과 특성(feature)을 사용해 학습되며, 분류 문제에서는 다수결 투표, 회귀 문제에서는 평균을 통해 최종 예측값을 도출합니다. 이 방식은 과적합(overfitting) 위험을 줄이고 안정적인 성능을 보장하며, 비선형 관계를 잘 포착하고 이상치(outlier)에 강인한 특성을 가지고 있습니다. 또한, 변수 중요도(Feature Importance)를 제공해 어떤 특성이 예측에 중요한 역할을 하는지 이해할 수 있습니다.
※ XGBoost
XGBoost (eXtreme Gradient Boosting)는 그레디언트 부스팅(Gradient Boosting) 알고리즘을 기반으로 한 강력한 머신러닝 앙상블 모델입니다. 여러 개의 약한 학습기(Weak Learner), 주로 결정 트리(Decision Tree)를 순차적으로 학습시키며, 이전 트리의 오차를 보정해 예측 성능을 점진적으로 개선합니다. 정확도, 속도, 과적합 방지 측면에서 뛰어난 성능을 자랑하며, 결측치 처리, 과적합 제어, 병렬 학습 등의 기능을 지원합니다. 주로 복잡한 패턴을 학습해야 하는 대규모 데이터셋이나 비선형 데이터 문제에서 뛰어난 성능을 보입니다.
from sklearn.ensemble import RandomForestRegressor
from xgboost import XGBRegressor
models = {
'Linear Regression': LinearRegression(),
'Random Forest': RandomForestRegressor(n_estimators=100, random_state=2025),
'XGBoost': XGBRegressor(n_estimators=100, random_state=2025)
}
# 모델 학습 및 평가
results = {}
for model_name, model in models.items():
model.fit(X_train, y_train)
y_pred_log = model.predict(X_test)
# 로그 변환을 원래 값으로 복구
y_pred = np.expm1(y_pred_log)
y_test_original = np.expm1(y_test)
# RMSE 계산
rmse = np.sqrt(mean_squared_error(y_test_original, y_pred))
results[model_name] = rmse
print(f'{model_name} RMSE: {rmse:.2f}')
# 최적 모델 확인
best_model = min(results, key=results.get)
print(f'Best Model: {best_model} RMSE: {results[best_model]:.2f}')
X_train, X_test, y_train, y_test = train_test_split(X, y,
test_size=0.3,
random_state=2025)
results = {}
for model_name, model in models.items():
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
rmse = root_mean_squared_error(y_test, y_pred)
results[model_name] = rmse
print(f'{model_name} RMSE: {rmse:.2f}')
best_model = min(results, key=results.get)
print(f'Best Model: {best_model} RMSE: {results[best_model]:.2f}')
호텔 예약 수요 데이터셋 (1) | 2025.01.09 |
---|---|
서울 자전거 공유 수요 예측 데이터셋 (0) | 2025.01.08 |
사이킷런 (0) | 2024.12.31 |
머신러닝 (3) | 2024.12.23 |
커피 프랜차이즈의 입점전략 (3) | 2024.12.20 |