Python/실습

130. [Python] [Linear Regression] : 예측 모델 실습( 자동차 연비)

천재단미 2025. 1. 28. 17:25
728x90
반응형

DALL·E 2025-01-28 16

 

 

목차 ▽열기

 

1. 예측 모델 

 

auto-mpg.csv 데이터를 통해, mpg (mile per gallern, 자동차 연비) 를 예측하는 모델을 만드세요.

 

컬럼 정보

 

 

MPG (miles per gallon - 연비),

cylinders (실린더 갯수)

engine displacement (inches 배기량),

horsepower (마력),

vehicle weight (lbs. 무게),

time to accelerate from O to 60 mph (sec. 60mph까지 걸리는 시간),

model year ,

origin of car (1. American, 2. European, 3. Japanese).

Also provided are the car labels (types)

 

 

 

 

2. 실습 목표

"주어진 데이터를 바탕으로, X(특징 변수)와 Y(목표 변수)의 관계를 선형 회귀 모델을 통해 학습하고, 새로운 데이터를 기반으로 Y 값을 예측합니다."

 

  • *선형 회귀(Linear Regression)**의 기본 개념 이해.
  • 데이터를 사용하여 회귀 모델을 학습하고 예측하는 과정 실습.
  • 모델 평가를 통해 예측 성능을 확인하는 방법 학습.

 

 

 

 

3. 코드 및 풀이

3-1. 필요 라이브러리 불러오기

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

 

 

 

 

 

3-2. 데이터 로드

  • 첨부된 데이터셋을 불러옵니다.
# 데이터 불러오기
df = pd.read_csv('../data/auto-mpg.csv') # 파일명에 맞게 변경
df

스크린샷 2025-01-28 오후 5

 

 

 

출력

스크린샷 2025-01-28 오후 5

 

 

 

 

 

 

 

3-3. 데이터 전처리

  • 결측치 확인 및 처리.
  • 필요 없는 열 제거.
# 결측치 확인
df.isna().sum()

스크린샷 2025-01-28 오후 5

 

 

 

 

3-4.  Feature와 Target 분리

# 필요한 열만 선택
X = df.loc[ : ,'cyl' : 'origin']  # 독립 변수
y = df['mpg']  # 종속 변수

X['origin'].unique()

스크린샷 2025-01-28 오후 5
스크린샷 2025-01-28 오후 5

 

 

 

 

 

3-5. 카테고리형 데이터를 숫자로 변환

from sklearn.preprocessing import OneHotEncoder
from sklearn.compose import ColumnTransformer


ct = ColumnTransformer(  [ ( 'encoder',OneHotEncoder(), [ 6 ] )],remainder = 'passthrough')

X = ct.fit_transform(X)

X

스크린샷 2025-01-28 오후 5

 

출력

스크린샷 2025-01-28 오후 5

 

 

 

  TIP💡 

 

class 'numpy.ndarray' pandas 변환하는 방법

import pandas as pd

X = pd.DataFrame(X)
X = X.reset_index(drop=True)
type(X)

 

 

 

 

 

 

3-6. 데이터 분리

  • 데이터를 학습용과 테스트용으로 나눕니다.
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 27)

스크린샷 2025-01-28 오후 5

 

 

 

 

 

 

3-7-1. 모델 학습( LinearRegression )

  • 선형 회귀 모델 생성 및 학습.
from sklearn.linear_model import LinearRegression

# 모델 생성
regressor1 = LinearRegression ()

# 모델 학습
regressor1.fit(X_train, y_train)

스크린샷 2025-01-28 오후 5
스크린샷 2025-01-28 오후 5

 

 


3-7-2. 모델 학습
( RandomForestRegressor )

from sklearn.ensemble import RandomForestRegressor

regressor2  = RandomForestRegressor(random_state = 27 ,n_estimators = 500)
regressor2.fit(X_train, y_train)

스크린샷 2025-01-28 오후 5
스크린샷 2025-01-28 오후 5

 

 

 

 

 

 

 

3-8. 예측

  • 학습된 모델로 테스트 데이터를 예측.
# 예측
y_pred1 = regressor1.predict(X_test)

스크린샷 2025-01-28 오후 5
스크린샷 2025-01-28 오후 5

 

 

 

 

y_pred2 = regressor2.predict(X_test)

스크린샷 2025-01-28 오후 5

 

 

 

 

 

 

 

 

 

3-9. 모델 평가

  • 평가 지표: MSE(Mean Squared Error), R²(결정 계수).
from sklearn.metrics import mean_squared_error, r2_score, mean_absolute_error


mean_squared_error(y_test, y_pred1)


r2_score(y_test, y_pred1)

스크린샷 2025-01-28 오후 5

출력

10.546527160278124
0.8427812773020084

 

 

 

 

 

mean_squared_error(y_test,y_pred2)

r2_score(y_test, y_pred2)

 

스크린샷 2025-01-28 오후 5

 

 

 

출력

5.722837561012684
0.914688769309842

 

 

 

 

 

 

 

4. 결과 시각화

  • 실제 값과 예측 값 비교.
df_y['y_pred'] = y_pred
df_y['y_pred2'] = y_pred2
df_y

스크린샷 2025-01-28 오후 5

 

df_y = df_y.reset_index(drop = True)
df_y.iloc[0 : 9 , ].plot(kind = 'bar')
plt.show()

스크린샷 2025-01-28 오후 5

 

스크린샷 2025-01-28 오후 5

 

 

 

 

 

 

 

 

 

5. 추가 문제 

# 배기량 301, 마력 113, 실린더 8개 가지고 무게 2900 엑셀 10.7, 81년식, 유럽차의 
# 연비를 예측하세요 

 

 

풀이 5. 

regressor2

스크린샷 2025-01-28 오후 5

 

X[0, ]
array([1.000e+00, 0.000e+00, 0.000e+00, 8.000e+00, 3.070e+02, 1.300e+02,
       3.504e+03, 1.200e+01, 7.000e+01])

스크린샷 2025-01-28 오후 5

np.array([[0,1,0 ,8, 301, 133, 2900, 10.7, 81]])
new_data = np.array([[0,1,0 ,8, 301, 133, 2900, 10.7, 81]])
new_data.shape

#(1, 9)

new_data
array([[0.00e+00, 1.00e+00, 0.00e+00, 8.00e+00, 3.01e+02, 1.33e+02,
        2.90e+03, 1.07e+01, 8.10e+01]])

스크린샷 2025-01-28 오후 5

regressor2.predict(new_data)

 

출력

array([23.1934])

스크린샷 2025-01-28 오후 5

728x90
반응형
home
}