선형 회귀는 두 변수 사이에 양의 관계가 있는지 또는 음의 관계가 있는지 나타내는 기계 학습의 가장 간단한 표준 도구 중 하나입니다.
선형 회귀는 빠른 예측 분석을 위한 몇 안 되는 좋은 도구 중 하나입니다. 이 섹션에서는 python pandas 패키지를 사용하여 데이터를 로드한 다음 선형 회귀 모델을 추정, 해석 및 시각화할 것입니다.
더 아래로 내려가기 전에 먼저 회귀가 무엇인지 논의해 볼까요?
회귀란 무엇입니까?
회귀는 종속 변수와 독립 변수 간의 관계를 생성하는 데 도움이 되는 예측 모델링 기법의 한 형태입니다.
회귀 유형
- 선형 회귀
- 로지스틱 회귀
- 다항식 회귀
- 단계적 회귀
선형 회귀는 어디에 사용됩니까?
- 추세 및 판매 추정치 평가
- 가격 변동의 영향 분석
- 위험 평가
선형 회귀 모델을 구축하는 단계
-
먼저 설정을 빌드하고 데이터 세트와 jupyter를 다운로드할 것입니다.
-
필요한 패키지와 데이터세트를 가져옵니다.
-
데이터세트가 로드되면 데이터세트를 탐색하겠습니다.
-
데이터 세트로 선형 회귀를 수행합니다.
-
그런 다음 변수와 시간 간의 관계를 살펴보겠습니다.
-
요약.
설정
아래 링크에서 데이터세트를 다운로드할 수 있습니다.
https://en.openei.org/datasets/dataset/649aa6d3-2832-4978-bc6e-fa563568398e/resource/b710e97d-29c9-4ca5-8137-63b7cf447317/csv/building1resource
설명 변수로 OAT(Outdoor Air Temperature)를 사용하여 건물의 전력을 모델링하는 데 사용할 것입니다.
jupyter 또는 IDE가 설치된 동일한 폴더에 csv 파일을 저장합니다.
필수 라이브러리 및 데이터세트 가져오기
먼저 필요한 라이브러리를 가져온 다음 pandas python 라이브러리를 사용하여 데이터 세트를 읽을 것입니다.
# Importing Necessary Libraries import pandas as pd #Required for numerical functions import numpy as np from scipy import stats from datetime import datetime from sklearn import preprocessing from sklearn.model_selection import KFold from sklearn.linear_model import LinearRegression #For plotting the graph import matplotlib.pyplot as plt %matplotlib inline # Reading Data df = pd.read_csv('building1retail.csv', index_col=[0], date_parser=lambda x: datetime.strptime(x, "%m/%d/%Y %H:%M")) df.head()
출력
데이터세트 탐색
먼저 pandas로 데이터 세트를 플로팅하여 시각화해 보겠습니다.
df.plot(figsize=(22,6))
출력
따라서 x축은 2010년 1월부터 2011년 1월까지의 데이터를 보여줍니다.
위의 출력을 보면 플롯에 두 가지 이상한 점이 있음을 알 수 있습니다.
-
누락된 데이터가 없는 것 같습니다. 확인하려면 다음을 실행하세요.
df.isnull().values.any()
출력
False
잘못된 결과는 데이터 프레임에 null 값이 없다는 것을 알려줍니다.
-
데이터에 일부 이상이 있는 것 같습니다(긴 하향 스파이크)
이상치 또는 '이상치'는 일반적으로 실험 오류의 결과이거나 실제 값일 수 있습니다. 두 경우 모두 회귀선의 기울기에 심각한 영향을 미치므로 폐기합니다.
'이상치'를 버리기 전에 먼저 데이터가 어떤 종류의 분포를 나타내는지 확인하겠습니다.
df.hist()
출력
위의 히스토그램에서 그래프가 대략 정규 분포를 따르는 데이터를 표시하고 있음을 알 수 있습니다.
따라서 평균에서 3 표준 편차보다 큰 값을 모두 삭제하고 새 데이터 프레임을 플로팅합니다.
std_dev = 3 df = df[(np.abs(stats.zscore(df)) < float(std_dev)).all(axis=1)] df.plot(figsize=(22, 6))
출력
따라서 위의 출력에서 볼 수 있듯이 스파이크를 어느 정도 제거하고 데이터를 정리했습니다.
선형 관계 검증
OAT와 검정력 사이에 선형 관계가 있는지 알아보기 위해 간단한 산점도를 그려 보겠습니다.
plt.scatter(df['OAT (F)'], df['Power (kW)'])
출력
선형 회귀
모델을 실행하고 성능을 평가하기 위해 Scikit-learn 모듈도 사용하고 k-fold 교차 검증(k=3)을 사용하여 모델의 성능을 평가할 것입니다.
X = pd.DataFrame(df['OAT (F)']) y = pd.DataFrame(df['Power (kW)']) model = LinearRegression() scores = [] kfold = KFold(n_splits=3, shuffle=True, random_state=42) for i, (train, test) in enumerate(kfold.split(X, y)): model.fit(X.iloc[train,:], y.iloc[train,:]) score = model.score(X.iloc[test,:], y.iloc[test,:]) scores.append(score) print(scores)
출력
[0.38768927735902703, 0.3852220878090444, 0.38451654781487116]
위의 프로그램에서 model =LinearRegression()은 선형 회귀 모델을 만들고 for 루프는 데이터 세트를 세 겹으로 나눕니다. 그런 다음 루프 내부에서 데이터를 맞춘 다음 목록에 점수를 추가하여 성능을 평가합니다.
하지만 결과가 좋지 않아 성능을 개선할 수 있습니다.
시간
전력(변수)은 하루 중 시간에 크게 의존합니다. 이 정보를 사용하여 원-핫 인코딩을 사용하여 회귀 모델에 통합해 보겠습니다.
model = LinearRegression() scores = [] kfold = KFold(n_splits=3, shuffle=True, random_state=42) for i, (train, test) in enumerate(kfold.split(X, y)): model.fit(X.iloc[train,:], y.iloc[train,:]) scores.append(model.score(X.iloc[test,:], y.iloc[test,:])) print(scores)
출력
[0.8074246958895391, 0.8139449185141592, 0.8111379602960773]
이것이 우리 모델의 큰 차이점입니다.
요약
이 섹션에서는 데이터 세트를 탐색하고 회귀 모델에 맞게 준비하는 기본 사항을 배웠습니다. 우리는 성능을 평가하고 단점을 발견하고 수정했습니다.