PYTHON/machine_learning

선형회귀 _ bike-sharing-demand

죠으니 2022. 1. 30. 00:42

import pandas as pd
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import seaborn as sns

# 노트북 안에 그래프를 그리기 위해
%matplotlib inline

# 그래프에서 격자로 숫자 범위가 눈에 잘 띄도록 ggplot 스타일 사용
plt.style.use('ggplot')

# 그래프에서 마이너스 폰트 깨지는 문제에 대한 대처
mpl.rcParams['axes.unicode_minus'] = False

import warnings  
warnings.filterwarnings('ignore')

 

□ Feature Engineering

 

▶컬럼 중에서 머신러닝의 피처로 사용되는게 존재(쓸떼없는 건 없애기. 아이디 등은 예측에 도움되지 않음)

 

▶피처 = 독립변수 = 속성 = 특성 → 근거(원인) → Feature Engineering(가공)
   종속변수를 예측. 전처리하는 거랑 비슷

 

▶간혹 범주형 피쳐들의 경우 원핫인코딩(해당되는건 1로 표시, 안되는건 0으로 표시)을 해주면 점수가 높아지는데

   도움 이 되기도 하는데  원핫인코딩을 해봐도 점수 상승에 도움이 되지 않는 경우에는 원핫인코딩을 하지는 않았다.

   범주형 feature의 type을 category로 변경 해 준다.
categorical_feature_names = ["season","holiday","workingday","weather", "dayofweek","month","year","hour"]

for var in categorical_feature_names:
    train[var] = train[var].astype("category")
    test[var] = test[var].astype("category")
 #train해줬으면 test도 바꿔줘야됨
 #category는 숫자가 있어도 우열을 가리지 않음. 그래서 타입을 category로 바꾼다.

 

□ Feature Selection

▶ 회귀에 중요하다고 생각되는 columns만 넣어서 새로 데이터 프레임을 만들기

feature_names =

            ["season", "weather", "temp", "atemp", "humidity", "year", "hour", "dayofweek", "holiday","workingday"

X_train = train[feature_names]

X_test = test[feature_names]

 

 참고) np.exp() 밑이 자연상수 e인 지수함수로 변환해줌

        (로그 씌웠던 것을 다시 원래형태로 되돌릴때 사용 )

       np.exp(0)  # e^0과 동일 → 1.0

       np.exp(1)  # e^1과 동일 → 2.718281828459045

        np.log() 로그를 씌어줌

        np.square() 제곱을 해준다

        np.sqrt()   루트를 씌운다

        np.log1p()    0이 되지 않도록 1을 더해주는 로그

 

□ 선형회귀 모델

 

▶ 선형회귀 또는 최소제곱법은 가장 간단하고 오래된 회귀용 선형 알고리즘

 

예측과 훈련 세트에 있는 타깃 y사이의 평균제곱오차(MSE)를 최소화하는 파라미터 w와 b를 찾는다.

 

▶ 매개변수가 없는 것이 장점이지만, 모델의 복잡도를 제어할 수 없다는 단점이 있다.

 

▶rfModel.feature_importances_    각 컬럼의 중요도를 뽑아온 것. 중요도가 0인 컬럼은 빼도 상관없다. 내장함수다.

importance = pd.DataFrame(rfModel.feature_importances_, index = feature_names, columns=['Imp'])

importance.sort_values(by='Imp', ascending=False)