html
Python에서 선형 회귀 구현 및 평가: 종합 가이드

선형 회귀 소개
선형 회귀는 머신러닝과 데이터 분석에서 가장 기본적이고 널리 사용되는 알고리즘 중 하나입니다. 이는 관측된 데이터에 선형 방정식을 적합시켜 종속 변수와 하나 이상의 독립 변수 간의 관계를 모델링합니다. 이 가이드에서는 scikit-learn 라이브러리를 사용하여 Python에서 선형 회귀를 구현하고 실제 결과와 예측 결과를 비교하며, R-제곱 지표를 사용하여 모델의 성능을 평가하는 과정을 안내합니다.
데이터 과학에 열정을 가진 분이든 숙련된 전문가이든, 이 포괄적인 튜토리얼은 선형 회귀 모델을 효과적으로 구축하고 평가하는 데 필요한 지식과 실용적인 기술을 제공할 것입니다.
목차
- 데이터셋 개요
- 환경 설정
- 필요한 라이브러리 가져오기
- 데이터 로딩 및 탐색
- 데이터 시각화
- 훈련을 위한 데이터 준비
- 선형 회귀 모델 구축
- 예측 수행
- 실제 결과와 예측 결과 비교
- R-제곱으로 모델 평가
- 결론
- 추가 읽을 거리
데이터셋 개요
이 튜토리얼에서는 Kaggle의 Canada Per Capita Income 데이터셋을 사용할 것입니다. 이 데이터셋은 여러 해에 걸친 캐나다의 연간 1인당 소득 정보를 제공하여 소득 추세를 분석하고 예측 모델을 구축할 수 있게 해줍니다.
환경 설정
코드 작업을 시작하기 전에 시스템에 Python이 설치되어 있는지 확인하세요. 프로젝트 종속성을 관리하기 위해 가상 환경을 사용하는 것이 권장됩니다. venv
또는 conda
와 같은 도구를 사용하여 가상 환경을 설정할 수 있습니다.
123456
# Using venvpython -m venv linear_regression_envsource linear_regression_env/bin/activate # On Windows: linear_regression_env\Scripts\activate # Install necessary packagespip install numpy pandas matplotlib seaborn scikit-learn
필요한 라이브러리 가져오기
데이터 조작, 시각화 및 회귀 모델 구축에 필요한 필수 라이브러리를 가져오는 것부터 시작하겠습니다.
12345678910
import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport seaborn as snsfrom sklearn.model_selection import train_test_splitfrom sklearn.linear_model import LinearRegressionfrom sklearn.metrics import r2_score # Set seaborn style for better aestheticssns.set()
데이터 로딩 및 탐색
다음으로, 데이터셋을 Pandas DataFrame에 로드하고 그 구조를 예비적으로 살펴보겠습니다.
12345
# Import Datadata = pd.read_csv('canada_per_capita_income.csv') # Preview the first few rows of the datasetprint(data.head())
출력:
123456
year per capita income (US$)0 1970 3399.2990371 1971 3768.2979352 1972 4251.1754843 1973 4804.4632484 1974 5576.514583
출력에서 데이터셋이 두 개의 열을 포함하고 있음을 알 수 있습니다: year
및 per capita income (US$)
.
데이터 시각화
시각화는 데이터 내의 기본적인 패턴과 관계를 이해하는 데 도움이 됩니다. 연도와 1인당 소득 간의 관계를 시각화하기 위해 산점도를 생성할 것입니다.
12345
sns.scatterplot(data=data, x='per capita income (US$)', y='year')plt.title('Per Capita Income Over Years in Canada')plt.xlabel('Per Capita Income (US$)')plt.ylabel('Year')plt.show()

산점도는 연도에 따라 1인당 소득이 증가하는 추세를 보여줍니다. 그러나 관계가 완벽하게 선형적이지 않을 수 있어 데이터에 잠재적인 변동성이 있음을 나타냅니다.
훈련을 위한 데이터 준비
모델을 훈련시키기 전에 특성(독립 변수)과 타겟 변수(종속 변수)를 분리하여 데이터를 준비해야 합니다.
123
# Define features and target variableX = data.iloc[:, :-1] # All columns except the last oneY = data.iloc[:, -1] # The last column
이 경우, X
는 year
열을 포함하고, Y
는 per capita income (US$)
를 포함합니다.
선형 회귀 모델 구축
이제 데이터를 훈련 세트와 테스트 세트로 분할하여 보지 않은 데이터에 대한 모델의 성능을 평가하겠습니다.
12
# Train-test splitX_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.20, random_state=1)
설명:
- X_train & y_train: 모델을 훈련하는 데 사용됩니다.
- X_test & y_test: 모델의 성능을 테스트하는 데 사용됩니다.
- test_size=0.20: 데이터의 20%가 테스트에 예약됩니다.
- random_state=1: 분할의 재현성을 보장합니다.
이제 선형 회귀 모델을 인스턴스화하고 훈련시켜봅시다.
12345678
# Initialize the Linear Regression modelmodel = LinearRegression() # Fit the model to the training datamodel.fit(X_train, y_train) # Output the model detailsprint(model)
출력:
1
LinearRegression()
예측 수행
훈련된 모델을 사용하여 테스트 세트에 대한 예측을 수행할 수 있습니다.
12345
# Make predictions on the test datay_pred = model.predict(X_test) # Display the predicted valuesprint(y_pred)
출력:
123
[20349.94572643 18613.49135581 33373.35350612 29900.44476487 1248.94764955 2117.17483487 24691.081653 27295.76320894 38582.716618 22086.40009706]
이 값들은 테스트 세트의 입력 연도를 기반으로 한 모델의 1인당 소득 예측값을 나타냅니다.
실제 결과와 예측 결과 비교
모델의 성능을 평가하기 위해 실제 값(y_test
)과 예측 값(y_pred
)을 비교하겠습니다.
1234567
# Create a DataFrame to compare actual and predicted valuescomparison = pd.DataFrame()comparison['Actual'] = y_testcomparison['Predicted'] = y_pred # Display the comparisonprint(comparison)
출력:
1234567891011
Actual Predicted24 15755.820270 20349.94572622 16412.083090 18613.49135639 32755.176820 33373.35350635 29198.055690 29900.4447652 4251.175484 1248.9476503 4804.463248 2117.17483529 17581.024140 24691.08165332 19232.175560 27295.76320945 35175.188980 38582.71661826 16699.826680 22086.400097
분석:
- 좋은 예측:
Actual
과 Predicted
값이 가까운 항목은 모델이 잘 작동하고 있음을 나타냅니다.
- 불일치: 상당한 차이는 모델의 개선이 필요하거나 관계가 완벽하게 선형적이지 않은 영역을 강조합니다.
예를 들어, 대부분의 예측값이 실제 값과 비교적 근접하지만, 실제 값이 4,251.18인 경우와 예측 값이 1,248.95인 경우와 같은 일부 불일치는 모델이 포착하지 못한 변동성을 시사합니다.
R-제곱으로 모델 평가
모델의 성능을 정량적으로 평가하기 위해 R-제곱(R²) 지표를 사용할 것입니다. R-제곱은 모델의 독립 변수(들)에 의해 설명되는 종속 변수의 분산 비율을 나타냅니다.
1234
# Calculate R-squared scorer2 = r2_score(y_test, y_pred) print(f"R-squared Score: {r2:.2f}")
출력:
1
R-squared Score: 0.80
해석:
- 0.80의 R-제곱 값은 연도에 의해 1인당 소득의 분산의 80%가 설명됨을 나타냅니다.
- 80%는 좋은 적합도를 강하게 나타내지만, 분산의 20%는 모델에서 고려되지 않은 다른 요인이나 데이터 고유의 변동성으로 인해 설명되지 않았음을 의미합니다.
R-제곱 값 이해하기:
- 1: 완벽한 적합도. 모델이 모든 변동성을 설명합니다.
- 0: 설명력이 없음. 모델이 어떤 변동성도 설명하지 못합니다.
- 음수 값: 모델이 수평선(타겟 변수의 평균)보다 더 나쁜 성능을 보임을 나타냅니다.
결론
이 가이드에서는 Python에서 선형 회귀 모델을 성공적으로 구현하여 여러 해에 걸친 캐나다의 1인당 소득을 예측했습니다. 다음 단계를 따르면, 당신은:
- 데이터 로드 및 탐색: 데이터셋의 구조와 초기 추세를 이해합니다.
- 관계 시각화: 산점도를 사용하여 잠재적인 선형 관계를 식별합니다.
- 데이터 준비: 데이터를 훈련 세트와 테스트 세트로 분할하여 편향 없는 평가를 수행합니다.
- 모델 구축 및 훈련: scikit-learn의
LinearRegression
을 사용하여 모델을 적합시킵니다.
- 예측 수행: 훈련된 모델을 사용하여 예측을 생성합니다.
- 결과 비교: 예측된 값이 실제 데이터와 얼마나 잘 일치하는지 분석합니다.
- 성능 평가: R-제곱을 사용하여 모델의 설명력을 정량화합니다.
모델은 우수한 R-제곱 값을 보여주지만, 개선의 여지가 있습니다. 추가적인 특성을 탐색하거나, 변수를 변환하거나, 더 복잡한 알고리즘을 사용하면 예측 성능을 향상시킬 수 있습니다.
추가 읽을 거리
이 선형 회귀 여정을 시작함으로써 다양한 데이터 기반 도메인에서 적용 가능한 기본 기술을 갖추게 됩니다. 다양한 데이터셋으로 계속 연습하여 머신러닝에 대한 이해와 숙련도를 높이세요.
#LinearRegression #Python #MachineLearning #DataScience #ScikitLearn #R2Score #DataVisualization #PredictiveModeling #PythonTutorial