AI

Multiple Linear Regression 실습

Beomsu Koh 2023. 7. 6.

Multiple Linear Regression 실습

필요한 패키지 다운로드

import piplite
await piplite.install(['pandas'])
await piplite.install(['matplotlib'])
await piplite.install(['numpy'])
await piplite.install(['scikit-learn'])

import matplotlib.pyplot as plt
import pandas as pd
import pylab as pl
import numpy as np
%matplotlib inline
  • Matplotlib
  • SciKit Learn
# matplotlib.pyplot은 데이터를 차트나 플롯으로 시각화하는 패키지입니다.
# 이를 plt라는 이름으로 가져옵니다.
import matplotlib.pyplot as plt

# pandas는 데이터 분석과 조작을 위한 Python 라이브러리입니다. 
# 이를 pd라는 이름으로 가져옵니다.
import pandas as pd

# pylab은 matplotlib의 pyplot 모듈과 numpy 모듈을 한꺼번에 import하는 모듈입니다. 
# 이를 pl이라는 이름으로 가져옵니다.
import pylab as pl

# numpy는 Python에서 과학적 계산을 위한 핵심 라이브러리입니다. 
# 이를 np라는 이름으로 가져옵니다.
import numpy as np

# %matplotlib inline은 Jupyter Notebook에서 matplotlib의 시각화를 바로 확인할 수 있게 해주는 매직 커맨드입니다.
%matplotlib inline

Data 다운로드

# 'https://cf-courses-data.s3.us.cloud-object-storage.appdomain.cloud/IBMDeveloperSkillsNetwork-ML0101EN-SkillsNetwork/labs/Module%202/data/FuelConsumptionCo2.csv'
# 위 URL의 데이터 파일 경로를 'path'라는 변수에 저장합니다.
path='https://cf-courses-data.s3.us.cloud-object-storage.appdomain.cloud/IBMDeveloperSkillsNetwork-ML0101EN-SkillsNetwork/labs/Module%202/data/FuelConsumptionCo2.csv'

# pyodide.http 모듈의 pyfetch 함수를 가져옵니다.
# 이 함수는 비동기 방식으로 URL에서 데이터를 가져오는 데 사용됩니다.
from pyodide.http import pyfetch

# 비동기 함수 'download'를 정의합니다.
# 이 함수는 주어진 'url'에서 데이터를 가져와서 'filename'으로 지정된 파일에 저장합니다.
async def download(url, filename):
    # 주어진 URL에서 데이터를 가져옵니다.
    # 이 작업은 비동기로 진행되므로 'await' 키워드를 사용하여 완료를 기다립니다.
    response = await pyfetch(url)
    
    # 응답의 상태 코드가 200(정상)인 경우에만 다음 작업을 진행합니다.
    if response.status == 200:
        # 'filename'으로 지정된 파일을 바이너리 쓰기 모드(wb)로 엽니다.
        with open(filename, "wb") as f:
            # 응답에서 바이트 데이터를 읽어 파일에 씁니다.
            # 이 작업도 비동기로 진행되므로 'await' 키워드를 사용하여 완료를 기다립니다.
            f.write(await response.bytes())

Understanding the Data

이 데이터는 캐나다에서 판매되는 신형 경량차량의 모델별 연료 소비 등급과 예상 이산화탄소 배출량에 대한 정보를 포함하고 있는 FuelConsumption.csv 데이터셋에 대한 설명입니다.

  • 파라미터
    • MODELYEAR: 모델의 생산 연도 (예: 2014)
    • MAKE: 제조사 (예: Acura)
    • MODEL: 차량 모델 (예: ILX)
    • VEHICLE CLASS: 차량 분류 (예: SUV)
    • ENGINE SIZE: 엔진 크기 (예: 4.7)
    • CYLINDERS: 실린더 수 (예: 6)
    • TRANSMISSION: 변속기 유형 (예: A6)
    • FUELTYPE: 연료 유형 (예: z)
    • FUEL CONSUMPTION in CITY(L/100 km): 도시에서의 연료 소비량 (예: 9.9 L/100km)
    • FUEL CONSUMPTION in HWY (L/100 km): 고속도로에서의 연료 소비량 (예: 8.9 L/100km)
    • FUEL CONSUMPTION COMB (L/100 km): 복합 연료 소비량 (예: 9.2 L/100km)
    • CO2 EMISSIONS (g/km): 이산화탄소 배출량 (예: 182g/km --> low --> 0)

데이터 분석 준비

# pyfetch를 이용해 데이터셋을 다운로드
await download(path, "FuelConsumption.csv")
# 다운로드한 파일의 경로를 지정
path="FuelConsumption.csv"

# pandas를 사용하여 CSV 파일을 읽어 DataFrame으로 변환
df = pd.read_csv(path)

# 데이터셋의 처음 5개 행을 출력
df.head()

# 'ENGINESIZE','CYLINDERS','FUELCONSUMPTION_CITY','FUELCONSUMPTION_HWY','FUELCONSUMPTION_COMB','CO2EMISSIONS' 컬럼만 선택하여 새로운 DataFrame 생성
cdf = df[['ENGINESIZE','CYLINDERS','FUELCONSUMPTION_CITY','FUELCONSUMPTION_HWY','FUELCONSUMPTION_COMB','CO2EMISSIONS']]

# 새로 생성된 DataFrame의 처음 9개 행을 출력
cdf.head(9)

새로 생성된 Dataframe은 아래와 같다

훈련/테스트 데이터 생성

데이터 셋은 훈련 테스트 분할(Train Test Split)에 따라 분할 한다.

# np.random.rand(len(df))는 df의 길이만큼의 랜덤한 수들을 생성합니다.
# 이 랜덤한 수들이 0.8보다 작은지 확인하여 Boolean mask를 생성합니다. 이 mask는 약 80%의 True와 20%의 False 값을 가집니다.
msk = np.random.rand(len(df)) < 0.8 

# True인 경우에 해당하는 데이터만 선택하여 훈련 데이터로 사용합니다.
train = cdf[msk] 

# False인 경우에 해당하는 데이터만 선택하여 테스트 데이터로 사용합니다.
test = cdf[~msk]

훈련 데이터 분포

# matplotlib의 scatter 함수를 사용하여 훈련 데이터의 엔진 크기 대비 CO2 배출량을 파란색 산점도로 표현합니다.
plt.scatter(train.ENGINESIZE, train.CO2EMISSIONS,  color='blue')

# x축의 라벨을 "Engine size"로 설정합니다.
plt.xlabel("Engine size")

# y축의 라벨을 "Emission"으로 설정합니다.
plt.ylabel("Emission")

# 그래프를 화면에 출력합니다.
plt.show()
  • x 축과 y축을 설정하고 그래프에 출력한다.

Multiple Linear Regression Model

이전 단계에서는 선형 회귀 모델로 데이터를 보았습니다.
하지만, 실제 CO2 배출량에 영향을 미치는 변수는 여러 개입니다.

독립 변수가 여러 개 있는 다중 선형 회귀인것 이죠

from sklearn import linear_model  # sklearn 패키지에서 linear_model 모듈을 가져옵니다.

regr = linear_model.LinearRegression()  # LinearRegression 모델 객체를 생성합니다.

x = np.asanyarray(train[['ENGINESIZE','CYLINDERS','FUELCONSUMPTION_COMB']])  # 훈련 데이터의 독립 변수들을 NumPy 배열로 변환합니다.
y = np.asanyarray(train[['CO2EMISSIONS']])  # 훈련 데이터의 종속 변수를 NumPy 배열로 변환합니다.
regr.fit (x, y)  # 위에서 생성한 LinearRegression 모델에 x와 y를 사용하여 학습을 진행합니다.
# The coefficients
print ('Coefficients: ', regr.coef_)  # 학습된 모델의 계수(기울기)를 출력합니다.

위의 코드는 3개의 파라미터로 이루어진 다중 선형 회귀 모델입니다.
각 파라미터는 선형 회귀 모델에서 기울기와 계수를 나타낸다.

SciKit Learn으로 모델을 만들고 OLS(Ordinary Least Squares)를 사용하여 데이터를 추정 한 것입니다.

Coefficients는 학습 된 모델의 파라미터들이 종속 변수에 얼마나 영향을 미치는지 나타내는 계수입니다

다중 선형 회귀 모델 평가

y_hat= regr.predict(test[['ENGINESIZE','CYLINDERS','FUELCONSUMPTION_COMB']])
x = np.asanyarray(test[['ENGINEFUELCONSUMPTION_CITYSIZE','CYLINDERS','FUELCONSUMPTION_COMB']])
y = np.asanyarray(test[['CO2EMISSIONS']])

# Calculating Residual Sum of Squares (RSS)
rss = np.mean((y_hat - y) ** 2)

# Calculating Explained Variance Score
variance_score = regr.score(x, y)

print("Residual sum of squares: %.2f" % rss)
print('Variance score: %.2f' % variance_score)
  • y_hat에는 모델이 테스트 데이터셋에 대해 예측한 종속 변수 값이 저장됩니다.

  • x에는 테스트 데이터셋의 독립 변수 값들이 저장됩니다.

  • y에는 테스트 데이터셋의 실제 종속 변수 값들이 저장됩니다.

  • rss 변수에는 잔차 제곱의 합(RSS; Residual Sum of Squares)을 계산하여 저장합니다. variance_score 변수에는 모델의 설명된 분산(Explained Variance) 점수를 계산하여 저장합니다.

Residual sum of squares: 486.22
Variance score: 0.87

rss는 모델의 예측 오차를 나타내고, variance_score는 모델이 데이터를 얼마나 잘 설명하는지를 나타냅니다

Practice

Try to use a multiple linear regression with the same dataset, 
but this time use FUELCONSUMPTION_CITY and FUELCONSUMPTION_HWY instead of FUELCONSUMPTION_COMB.
Does it result in better accuracy?
regr2 = linear_model.LinearRegression()  # LinearRegression 모델 객체를 생성합니다.
x = np.asanyarray(train[['ENGINESIZE','CYLINDERS','FUELCONSUMPTION_HWY','FUELCONSUMPTION_CITY']])  # 훈련 데이터의 독립 변수들을 NumPy 배열로 변환합니다.
y = np.asanyarray(train[['CO2EMISSIONS']])  # 훈련 데이터의 종속 변수를 NumPy 배열로 변환합니다.
regr2.fit(x,y)

print('기울기 : ',regr2.coef_)

y_hat= regr2.predict(test[['ENGINESIZE','CYLINDERS','FUELCONSUMPTION_HWY','FUELCONSUMPTION_CITY']])
x = np.asanyarray(test[['ENGINESIZE','CYLINDERS','FUELCONSUMPTION_HWY','FUELCONSUMPTION_CITY']])
y = np.asanyarray(test[['CO2EMISSIONS']])
# Calculating Residual Sum of Squares (RSS)
rss = np.mean((y_hat - y) ** 2)

# Calculating Explained Variance Score
variance_score = regr2.score(x, y)

print("Residual sum of squares: %.2f" % rss)
print('Variance score: %.2f' % variance_score)

부족한 점이나 잘못 된 점을 알려주시면 시정하겠습니다 :>

'AI' 카테고리의 다른 글

Polynomial Regression 실습  (0) 2023.07.06
Non-Linear Regression  (0) 2023.07.06
Multiple Linear Regression  (0) 2023.07.06
Simple Linear Regression 실습  (0) 2023.07.05
회귀 모델에서의 손실 함수  (0) 2023.07.05

댓글