Scikit-learn 선형 회귀

scikit-learnBeginner
지금 연습하기

소개

이 랩에서는 가장 인기 있는 Python 라이브러리 중 하나인 scikit-learn을 사용하여 머신러닝 모델을 구축하는 기본 사항을 배우게 됩니다. 가격이나 온도와 같은 연속적인 값을 예측하는 데 사용되는 기본적이면서도 강력한 알고리즘인 선형 회귀 (Linear Regression) 에 초점을 맞출 것입니다.

우리의 목표는 캘리포니아 지역의 중간 주택 가격을 예측할 수 있는 모델을 구축하는 것입니다. scikit-learn에 편리하게 포함된 캘리포니아 주택 데이터셋 (California housing dataset) 을 사용할 것입니다.

이 랩을 통해 다음을 배우게 됩니다:

  • scikit-learn에서 데이터셋 로드하기
  • 훈련 및 테스트를 위한 데이터 준비 및 분할하기
  • 선형 회귀 모델 생성 및 훈련하기
  • 훈련된 모델을 사용하여 예측하기

모든 작업은 WebIDE 내에서 수행합니다. 시작해 봅시다!

이것은 가이드 실험입니다. 학습과 실습을 돕기 위한 단계별 지침을 제공합니다.각 단계를 완료하고 실무 경험을 쌓기 위해 지침을 주의 깊게 따르세요. 과거 데이터에 따르면, 이것은 중급 레벨의 실험이며 완료율은 59%입니다.학습자들로부터 92%의 긍정적인 리뷰율을 받았습니다.

datasets.fetch_california_housing() 로 캘리포니아 주택 데이터셋 로드하기

이 단계에서는 모델 구축을 위한 데이터셋 로드부터 시작합니다. scikit-learn에는 학습 및 연습에 유용한 여러 내장 데이터셋이 포함되어 있습니다. 캘리포니아 주택 데이터셋을 사용할 것입니다.

먼저 Python 스크립트를 생성해야 합니다. ~/project 디렉토리에 main.py라는 파일이 이미 생성되어 있습니다. WebIDE 왼쪽의 파일 탐색기에서 찾을 수 있습니다.

main.py를 열고 다음 코드를 추가합니다. 이 코드는 필요한 라이브러리 (sklearn.datasetsfetch_california_housingpandas) 를 가져오고 데이터셋을 로드합니다. pandas를 사용하여 데이터를 DataFrame 으로 변환할 것입니다. DataFrame 은 보거나 조작하기 쉬운 표 형식의 데이터 구조입니다.

다음 코드를 main.py에 추가하세요:

import pandas as pd
from sklearn.datasets import fetch_california_housing

## 캘리포니아 주택 데이터셋 로드
california = fetch_california_housing()

## DataFrame 생성
california_df = pd.DataFrame(california.data, columns=california.feature_names)
california_df['MedHouseVal'] = california.target

## DataFrame 의 첫 5 개 행 출력
print("California Housing Dataset:")
print(california_df.head())

이제 스크립트를 실행하여 출력을 확인해 봅시다. WebIDE 에서 터미널을 열고 ( "Terminal" -> "New Terminal" 메뉴 사용 가능) 다음 명령을 실행합니다:

python3 main.py

콘솔에 데이터셋의 처음 다섯 개 행이 출력되는 것을 볼 수 있습니다. MedHouseVal 열은 우리의 목표 변수이며, 캘리포니아 지역의 중간 주택 가치를 나타냅니다. 이 값은 10 만 달러 단위로 표현됩니다 (100,000 달러).

California Housing Dataset:
   MedInc  HouseAge  AveRooms  AveBedrms  Population  AveOccup  Latitude  Longitude  MedHouseVal
0  8.3252      41.0  6.984127   1.023810       322.0  2.555556     37.88    -122.23        4.526
1  8.3014      21.0  6.238137   0.971880      2401.0  2.109842     37.86    -122.22        3.585
2  7.2574      52.0  8.288136   1.073446       496.0  2.802260     37.85    -122.24        3.521
3  5.6431      52.0  5.817352   1.073059       558.0  2.547945     37.85    -122.25        3.413
4  3.8462      52.0  6.281853   1.081081       565.0  2.181467     37.85    -122.25        3.422

sklearn.model_selection 의 train_test_split 을 사용하여 데이터를 학습 및 테스트 세트로 분할

이 단계에서는 훈련 프로세스를 위해 데이터를 준비합니다. 머신러닝의 중요한 부분은 모델이 이전에 본 적 없는 데이터로 평가하는 것입니다. 이를 위해 데이터셋을 두 부분, 즉 훈련 세트 (training set) 와 테스트 세트 (testing set) 로 분할합니다. 모델은 훈련 세트에서 학습하고, 테스트 세트를 사용하여 성능이 얼마나 좋은지 확인할 것입니다.

먼저 특성 (features, 입력 변수, X) 과 목표 (target, 예측하려는 값, y) 를 분리해야 합니다. 이 경우 XMedHouseVal을 제외한 모든 열이 되고, yMedHouseVal 열이 됩니다.

그런 다음 sklearn.model_selectiontrain_test_split 함수를 사용하여 분할을 수행합니다.

다음 코드를 main.py 파일에 추가하세요.

from sklearn.model_selection import train_test_split

## 데이터 준비
X = california_df.drop('MedHouseVal', axis=1)  ## 특성 (입력 변수)
y = california_df['MedHouseVal']  ## 목표 변수 (예측하려는 것)

## 데이터를 훈련 및 테스트 세트로 분할
## test_size=0.2: 데이터의 20% 를 테스트용으로, 80% 를 훈련용으로 예약
## random_state=42: 재현 가능한 분할을 보장합니다 (실행할 때마다 동일한 결과)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

## 새로 생성된 데이터셋의 형태를 출력하여 분할 확인
print("\n--- 데이터 분할 ---")
print("X_train 형태:", X_train.shape)  ## 훈련 특성
print("X_test 형태:", X_test.shape)    ## 테스트 특성
print("y_train 형태:", y_train.shape)  ## 훈련 목표 값
print("y_test 형태:", y_test.shape)    ## 테스트 목표 값

이제 터미널에서 스크립트를 다시 실행합니다:

python3 main.py

DataFrame 아래에 새로 생성된 훈련 및 테스트 세트의 형태가 출력되는 것을 볼 수 있습니다. 이는 데이터가 올바르게 분할되었음을 확인시켜 줍니다.

--- 데이터 분할 ---
X_train 형태: (16512, 8)
X_test 형태: (4128, 8)
y_train 형태: (16512,)
y_test 형태: (4128,)

sklearn.linear_model 에서 LinearRegression 모델 초기화

이 단계에서는 선형 회귀 모델을 생성합니다. scikit-learn은 이 과정을 매우 간단하게 만들어 줍니다. sklearn.linear_model 모듈에서 LinearRegression 클래스를 가져온 다음, 해당 클래스의 인스턴스를 생성하기만 하면 됩니다.

이 인스턴스는 선형 회귀 알고리즘을 포함하는 객체입니다. 선형 회귀는 데이터 포인트들을 통과하는 최적의 직선을 찾으며, y = mx + b 공식을 사용합니다. 여기서 m은 각 특성에 대한 계수 (가중치) 이고, b는 절편입니다. 여기서는 대부분의 기본적인 경우에 잘 작동하는 기본 매개변수를 사용합니다.

Linear Regression Formula
그림 1: 선형 회귀 공식 y = mx + b, 여기서 m 은 기울기이고 b 는 절편입니다.

다음 코드를 main.py 파일에 추가하세요. 이 코드는 LinearRegression 클래스를 가져오고 모델 객체를 생성합니다.

from sklearn.linear_model import LinearRegression

## 선형 회귀 모델 초기화
model = LinearRegression()

## 모델을 출력하여 생성되었는지 확인
print("\n--- Model Initialized ---")
print(model)

터미널에서 main.py 스크립트를 다시 실행하세요:

python3 main.py

출력에는 이제 LinearRegression 객체를 보여주는 줄이 포함됩니다. 이는 모델이 성공적으로 초기화되었음을 확인시켜 줍니다.

--- Model Initialized ---
LinearRegression()

model.fit(X_train, y_train) 으로 모델 학습

이 단계에서는 모델을 학습시킵니다. 이 과정을 종종 데이터를 사용하여 모델을 "학습시킨다 (fitting)"고 합니다. 학습 중에 모델은 특성 (X_train) 과 목표 변수 (y_train) 간의 관계를 학습합니다. 선형 회귀의 경우, 이는 목표를 가장 잘 예측하기 위해 각 특성에 대한 최적의 계수를 찾는 것을 의미합니다.

모델 객체의 fit() 메서드를 사용하고 훈련 데이터를 인수로 전달할 것입니다.

다음 코드를 main.py 파일에 추가하세요.

## 훈련 데이터로 모델 학습 (fit)
## fit() 메서드는 특성 (X_train) 과 목표 (y_train) 간의 관계를 학습합니다.
## 최소 제곱법 (least squares optimization) 을 사용하여 각 특성에 대한 최적의 계수와 절편을 계산합니다.
model.fit(X_train, y_train)

## 학습 후, 모델은 계수와 절편을 학습했습니다.
## 절편은 모든 특성 값이 0 일 때의 예측 값을 나타냅니다.
print("\n--- 모델 학습 완료 ---")
print("절편:", model.intercept_)

이제 터미널에서 스크립트를 실행합니다:

python3 main.py

스크립트 실행 후, 출력에 선형 회귀 모델의 절편을 보여주는 새로운 섹션이 표시됩니다. 절편은 모든 특성 값이 0 일 때의 예측 값입니다. 여기에 숫자 값이 표시되는 것은 모델이 데이터에 대해 성공적으로 학습되었음을 확인시켜 줍니다.

--- 모델 학습 완료 ---
절편: -37.023277706064185

model.predict(X_test) 로 테스트 데이터 예측

이 마지막 단계에서는 학습된 모델을 사용하여 예측을 수행합니다. 이것이 예측 모델 구축의 궁극적인 목표입니다. 학습 중에 모델이 보지 못했던 테스트 데이터 (X_test) 를 사용하여 성능을 평가할 것입니다.

학습된 모델 객체의 predict() 메서드를 사용하고 테스트 특성 (X_test) 을 인수로 전달할 것입니다. 이 메서드는 목표 변수에 대한 예측 값들의 배열을 반환합니다.

다음 코드를 main.py 파일에 추가하세요.

## 테스트 데이터에 대한 예측 수행
## predict() 메서드는 학습된 계수와 절편을 사용하여 예측을 계산합니다.
## 공식: 예측값 = 절편 + (계수 1 * 특성 1) + (계수 2 * 특성 2) + ...
predictions = model.predict(X_test)

## 첫 5 개 예측값 출력 (값은 10 만 달러 단위입니다)
print("\n--- 예측 결과 ---")
print(predictions[:5])

이제 전체 스크립트를 마지막으로 터미널에서 실행합니다:

python3 main.py

출력에는 이제 테스트 세트에 대한 처음 다섯 개의 예측된 주택 가격이 포함됩니다. 이 값들은 X_test의 특성을 기반으로 모델이 생각하는 중간 주택 가치입니다. 모델의 정확도를 측정하기 위해 이러한 예측값을 y_test의 실제 값과 개념적으로 비교할 수 있습니다.

--- 예측 결과 ---
[0.71912284 1.76401657 2.70965883 2.83892593 2.60465725]

축하합니다! scikit-learn을 사용하여 선형 회귀 모델을 성공적으로 구축, 학습 및 사용했습니다.

요약

이 실습에서는 scikit-learn을 사용하여 기본적인 머신러닝 모델을 구축하는 전체 워크플로우를 완료했습니다.

캘리포니아 주택 데이터셋을 로드하고 pandas를 사용하여 준비하는 것으로 시작했습니다. 그런 다음 데이터를 훈련 세트와 테스트 세트로 분할하는 것의 중요성을 배우고 train_test_split을 사용하여 분할을 수행했습니다.

이어서 LinearRegression 모델을 초기화하고, fit() 메서드를 사용하여 훈련 데이터로 학습시킨 후, 마지막으로 학습된 모델을 사용하여 보지 못한 테스트 데이터에 대해 predict() 메서드로 예측을 수행했습니다.

이 실습은 scikit-learn에 대한 견고한 기초를 제공합니다. 여기에서 다음과 같은 고급 주제를 탐색할 수 있습니다.

  • 모델 평가: 평균 제곱 오차 (MSE) 또는 R-제곱과 같은 지표를 계산하여 모델 정확도 측정
  • 특성 스케일링: 더 나은 성능을 위해 특성 표준화 또는 정규화
  • 정규화 (Regularization): 과적합 방지를 위해 Ridge 또는 Lasso 회귀 사용
  • 교차 검증 (Cross-validation): k-폴드 교차 검증을 사용한 더 강력한 평가
  • 기타 알고리즘: Random Forest, Support Vector Machines 또는 Neural Networks 시도

Summary

In this lab, you have completed the entire workflow for building a basic machine learning model using scikit-learn.

You started by loading the California housing dataset and preparing it using pandas. Then, you learned the importance of splitting your data into training and testing sets and performed the split using train_test_split.

Following that, you initialized a LinearRegression model, trained it on your training data using the fit() method, used the trained model to make predictions on unseen test data with the predict() method, and finally visualized the results to understand your model's performance.

This lab provides a solid foundation in scikit-learn. From here, you can explore more advanced topics such as:

  • Model evaluation: Calculate metrics like Mean Squared Error (MSE) or R-squared to measure model accuracy
  • Data visualization: Create more advanced plots like residual plots, feature importance charts, or correlation matrices
  • Feature scaling: Standardize or normalize features for better performance
  • Regularization: Use Ridge or Lasso regression to prevent overfitting
  • Cross-validation: More robust evaluation using k-fold cross-validation
  • Other algorithms: Try Random Forest, Support Vector Machines, or Neural Networks