html
파이썬에서 의사 결정 트리 회귀 시각화: 종합 가이드
파이썬으로 의사 결정 트리 회귀의 힘을 활용하세요! 이 종합 가이드에서는 파이썬의 강력한 라이브러리를 사용하여 의사 결정 트리 회귀 모델을 시각화하는 방법을 안내합니다. 신진 데이터 과학자이든 경험 많은 전문가이든 관계없이 모델을 시각화하고 해석하는 방법을 이해하는 것은 정보에 입각한 결정을 내리는 데 필수적입니다. 우리는 과소적합과 과적합, 모델 평가, 실제 데이터셋을 사용한 실용적 구현과 같은 개념을 깊이 있게 다룰 것입니다.
목차
- 의사 결정 트리 회귀 소개
- 데이터셋 이해하기
- 환경 설정하기
- 데이터 탐색 및 시각화
- 데이터 준비하기
- 의사 결정 트리 모델 구축
- 예측하기
- 실제 값과 예측 값 비교
- 모델 평가
- 모델 시각화
- 과소적합과 과적합 이해하기
- 결론
1. 의사 결정 트리 회귀 소개
의사 결정 트리 회귀는 연속적인 결과를 예측하는 데 사용되는 다재다능하고 강력한 머신 러닝 알고리즘입니다. 선형 회귀 모델과 달리 의사 결정 트리는 광범위한 데이터 전처리 없이도 특징 간의 복잡한 관계와 상호 작용을 포착할 수 있습니다. 이러한 트리를 시각화하면 모델의 의사 결정 과정을 이해하는 데 도움이 되며, 결과를 해석하고 전달하기가 더 쉬워집니다.
왜 시각화가 중요한가:
- 해석 가능성: 모델이 어떻게 예측하는지 쉽게 이해할 수 있습니다.
- 디버깅: 과적합이나 과소적합과 같은 모델의 결함을 식별하고 수정할 수 있습니다.
- 커뮤니케이션: 이해관계자에게 명확한 통찰력을 제공할 수 있습니다.
2. 데이터셋 이해하기
이번 시연에서는 Kaggle의 캐나다 1인당 소득 데이터셋을 사용할 것입니다. 이 데이터셋에는 1950년부터 2030년까지 미국의 연간 1인당 소득에 대한 정보가 USD로 측정되어 포함되어 있습니다.
샘플 데이터:
연도
1인당 소득 (미국 달러)
1970
3399.30
1971
3768.30
1972
4251.18
1973
4804.46
1974
5576.51
3. 환경 설정하기
구현을 시작하기 전에 필요한 라이브러리가 설치되어 있는지 확인하세요. 우리는 numpy
, pandas
, matplotlib
, seaborn
, scikit-learn
과 같은 라이브러리를 사용할 것입니다.
12345678
import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport seaborn as snsfrom sklearn.model_selection import train_test_splitfrom sklearn.tree import DecisionTreeRegressorfrom sklearn.metrics import r2_scorefrom sklearn import tree
왜 이러한 라이브러리를 사용하는가?
- NumPy & Pandas: 효율적인 데이터 조작 및 분석.
- Matplotlib & Seaborn: 고품질 데이터 시각화.
- Scikit-learn: 강력한 머신 러닝 도구와 알고리즘.
4. 데이터 탐색 및 시각화
데이터를 이해하는 것은 첫 번째로 중요한 단계입니다. 연도별 1인당 소득을 시각화하여 추세를 파악해 봅시다.
123456789101112
# Load the datasetdata = pd.read_csv('canada_per_capita_income.csv') # Display the first few rowsprint(data.head()) # Scatter plotsns.scatterplot(data=data, x='per capita income (US$)', y='year')plt.title('Canada Per Capita Income Over Years')plt.xlabel('Per Capita Income (US$)')plt.ylabel('Year')plt.show()
출력:
통찰력:
- 1970년부터 2000년대 초반까지 1인당 소득이 명확히 상승하는 추세를 보입니다.
- 일부 변동은 소득 수준에 영향을 미친 경제적 사건을 나타냅니다.
5. 데이터 준비하기
모델링 전에 데이터를 특징(X
)과 타겟(Y
)으로 분리한 후, 모델 성능을 평가하기 위해 학습용과 테스트용으로 분할해야 합니다.
12345678
# Features and TargetX = data[['year']] # PredictorY = data['per capita income (US$)'] # Target # Train-Test SplitX_train, X_test, y_train, y_test = train_test_split( X, Y, test_size=0.20, random_state=1)
왜 학습-테스트 분할이 필요한가?
- 학습 세트: 모델을 학습시키기 위함.
- 테스트 세트: 보지 못한 데이터에서 모델의 성능을 평가하기 위함.
6. 의사 결정 트리 모델 구축
데이터가 준비되었으니, 이제 의사 결정 트리 회귀기를 구축하고 학습시켜 봅시다.
12345
# Initialize the model with a max depth of 10model = DecisionTreeRegressor(max_depth=10) # Train the modelmodel.fit(X_train, y_train)
매개변수 설명:
- max_depth: 트리의 최대 깊이를 제어합니다. 깊은 트리는 더 복잡한 패턴을 포착할 수 있지만 과적합할 수 있습니다.
7. 예측하기
학습 후, 테스트 데이터셋에서 예측을 수행합니다.
12345
# Make predictionsy_pred = model.predict(X_test) # Display predictionsprint(y_pred)
샘플 출력:
12
[15875.58673 17266.09769 37446.48609 25719.14715 3768.297935 5576.514583 16622.67187 18601.39724 41039.8936 16369.31725]
8. 실제 값과 예측 값 비교
성능을 시각적으로 평가하기 위해 실제 값과 모델의 예측 값을 비교하는 것이 중요합니다.
1234567
# Create a comparison DataFramecomparison = pd.DataFrame({ 'Actual': y_test, 'Predicted': y_pred}) print(comparison)
샘플 출력:
Actual
Predicted
24
15755.82
15875.59
22
16412.08
17266.10
39
32755.18
37446.49
35
29198.06
25719.15
2
4251.17
3768.30
3
4804.46
5576.51
29
17581.02
16622.67
32
19232.18
18601.40
45
35175.19
41039.89
26
16699.83
16369.32
시각화:
1234567
plt.scatter(X_test, y_test, color='blue', label='Actual')plt.scatter(X_test, y_pred, color='red', label='Predicted')plt.title('Actual vs Predicted Per Capita Income')plt.xlabel('Year')plt.ylabel('Per Capita Income (US$)')plt.legend()plt.show()
9. 모델 평가
모델의 성능을 정량적으로 평가하기 위해 R² 점수를 사용합니다. 이는 모델이 타겟 데이터의 변동성을 얼마나 잘 설명하는지를 나타냅니다.
123
# Calculate R2 Scorer2 = r2_score(y_test, y_pred)print(f"R² Score: {r2:.2f}")
출력:
1
R² Score: 0.93
해석:
- R² 점수 0.93은 1인당 소득의 변동성 중 93%가 모델에 의해 설명됨을 의미합니다.
- 이는 강력한 예측 성능을 나타냅니다.
10. 모델 시각화
시각화는 모델의 의사 결정 과정을 이해하는 데 도움이 됩니다. 회귀 트리와 모델의 예측을 플롯해 봅시다.
연도 범위에 따른 예측 플롯
1234567891011121314
# Define a range of years for predictionvals = np.arange(1950, 2050, 2).reshape(-1, 1) # Predict using the modelpredictions = model.predict(vals) # Plotplt.scatter(X, Y, color='blue', label='Data')plt.plot(vals, predictions, color='red', label='Decision Tree Prediction')plt.title('Decision Tree Regression Model')plt.xlabel('Year')plt.ylabel('Per Capita Income (US$)')plt.legend()plt.show()
의사 결정 트리 구조 시각화
트리 구조를 이해하는 것은 의사 결정이 어떻게 이루어지는지를 해석하는 데 필수적입니다.
12345
# Plot the decision treeplt.figure(figsize=(25,15))tree.plot_tree(model, fontsize=10, feature_names=['Year'], filled=True)plt.title('Decision Tree Structure')plt.show()
11. 과소적합과 과적합 이해하기
모델 복잡성의 균형을 맞추는 것은 매우 중요합니다. max_depth
매개변수를 조정하여 모델 성능에 어떻게 영향을 미치는지 살펴봅시다.
과소적합:
- 정의: 모델이 너무 단순하여 추세나 노이즈를 모두 포착하지 못함.
- 지표: 낮은 R² 점수, 학습 데이터와 테스트 데이터 모두에서 성능이 저조함.
123456
# Initialize model with low max_depthunderfit_model = DecisionTreeRegressor(max_depth=2)underfit_model.fit(X_train, y_train)under_pred = underfit_model.predict(X_test)under_r2 = r2_score(y_test, under_pred)print(f"Underfitted Model R² Score: {under_r2:.2f}")
출력:
1
Underfitted Model R² Score: 0.65
시각화:
설명:
- 모델이 기본 추세를 포착하지 못해 부정확한 예측을 초래합니다.
과적합:
- 정의: 모델이 너무 복잡하여 추세와 노이즈를 모두 포착함.
- 지표: 학습 데이터에서는 높은 R² 점수를 보이나, 테스트 데이터에서는 일반화가 잘 되지 못함.
123456
# Initialize model with high max_depthoverfit_model = DecisionTreeRegressor(max_depth=10)overfit_model.fit(X_train, y_train)over_pred = overfit_model.predict(X_test)over_r2 = r2_score(y_test, over_pred)print(f"Overfitted Model R² Score: {over_r2:.2f}")
출력:
1
Overfitted Model R² Score: 0.92
시각화:
설명:
- 모델이 학습 데이터에 매우 잘 맞추어졌지만, 복잡성으로 인해 보지 못한 데이터에서 성능이 저하될 수 있습니다.
최적의 깊이:
균형을 찾으면 모델이 너무 단순하거나 과도하게 복잡하지 않으면서도 잘 일반화할 수 있습니다.
12. 결론
의사 결정 트리 회귀 모델을 시각화하면 모델의 의사 결정 과정, 성능 및 과소적합과 과적합과 같은 잠재적 문제점에 대한 귀중한 통찰력을 얻을 수 있습니다. max_depth
와 같은 매개변수를 조정함으로써 데이터의 복잡성에 맞게 모델의 복잡성을 조정하여 견고하고 신뢰할 수 있는 예측을 보장할 수 있습니다.
핵심 요약:
- 모델 시각화: 해석 가능성과 디버깅에 필수적입니다.
- 과소적합 vs. 과적합: 최적의 성능을 위해 복잡성의 균형을 맞추는 것이 중요합니다.
- 평가 지표: 모델 성능을 정량화하기 위해 R² 점수를 사용하세요.
이러한 시각화 기법을 활용하여 데이터 과학 프로젝트를 향상시키고, 모델을 정확할 뿐만 아니라 투명하고 신뢰할 수 있게 만드세요.
의사 결정 트리 회귀와 그 시각화를 마스터하여 데이터 과학 여정을 향상시키세요. 분석 기술을 향상시키기 위한 더 많은 튜토리얼과 통찰력을 위해 계속 지켜봐 주세요!