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 |