#4 모델링

    1. 베이스 라인 모델 (p211)

    뼈대가 되는 가장 기본적인 모델로, 

     

    2. 모델 평가시 피처 엔지니어링에서 데이터

    데이터를 변환하는게 피처 엔지니어링인데, 이 때 훈련 데이터와 테스트 데이터에 공통으로 반영해야하기 때문에,

    피처 엔지니어링 전에 두 데이터를 합쳤다가 다 끝나면 도로 나누는 과정 필요

    (212p - 그림)

     

    p216 합쳤다가 피쳐엔지니어링하고 다시 나누기까지

    import pandas as pd
    from datetime import datetime
    
    data_path = "/kaggle/input/bike-sharing-demand/"
    
    train = pd.read_csv(data_path + "train.csv")
    test = pd.read_csv(data_path + "test.csv")
    submission = pd.read_csv(data_path + "sampleSubmission.csv")
    
    #이상치 제거
    train = train[train['weather'] != 4]
    
    #데이터 합치기
    all_data = pd.concat([train, test], ignore_index = True)
    
    #피쳐 엔지니어링
    all_data['date'] = all_data['datetime'].apply(lambda x: x.split()[0])
    
    all_data["year"] = all_data['datetime'].apply(lambda x: x.split()[0].split("-")[0])
    all_data["month"] = all_data['datetime'].apply(lambda x: x.split()[0].split("-")[1])
    all_data["hour"] = all_data['datetime'].apply(lambda x: x.split()[1].split(":")[0])
    
    all_data['weekday'] = all_data['date'].apply(
        lambda dateString:
        datetime.strptime(dateString, "%Y-%m-%d").weekday()
    )
    
    #pd.to_datetime() 으로 변환하는게 더 빠르긴 함.
    
    drop_features = ['casual', 'registered', 'datetime', 'date', 'month', 'windspeed']
    
    all_data = all_data.drop(drop_features, axis = 1)
    #all_data
    
    #다시 데이터 훈련용과 테스트용으로 나누기
    X_train = all_data[~pd.isnull(all_data['count'])]
    X_test = all_data[pd.isnull(all_data['count'])]
    
    # 타깃값 count 제거
    X_train = X_train.drop(['count'], axis = 1)
    X_test = X_test.drop(['count'], axis = 1)
    
    #타깃값 저장
    y = train['count']

    타깃값이 있으면 훈련 데이터고, 없으면 테스트 데이터이다.

     

    3. 평가지표 계산 함수 작성 ( 217p )

    RMSLE 함수

    import numpy as np
    
    def rmsle(y_true, y_pred, convertExp=True):
        #지수 변환
        if convertExp:
            y_true = np.exp(y_true)
            y_pred = np.exp(y_pred)
        
        #로그변환 후 결측값을 0으로 변환
        log_true = np.nan_to_num(np.log(y_true + 1))
        log_pred = np.nan_to_num(np.log(y_pred + 1))
        
        #RMSLE 계산
        output = np.sqrt(np.mean((log_true - log_pred)**2))
        return output

     

    4. 모델 훈련하기

    선형 회귀 모델을 훈련한다는 것은 독립변수(피쳐)인 X_train과 종속변수(타깃값)인 log_y에 대해응하는 최적의 선형 회귀 계수를 구한다는 의미이다. 선형 회귀 식은 따라서 x1, x2, x3 에 각각 가중치 세타를 곱해서 더한 식과 같다.( p219 )

     

    검증할 타깃값을 x가 로그변환 한 것처럼 로그변환하고 학습시켜보면 다음과 같다.

     

    from sklearn.linear_model import LinearRegression
    import numpy as np
    
    linear_reg_model = LinearRegression()
    
    #위에 계산해둔 y값
    log_y = np.log(y)
    linear_reg_model.fit(X_train, log_y)

     

     

    5. 모델 성능 검증하기

    #모델 성능 검증
    preds = linear_reg_model.predict(X_train)
    
    print(f'선형회귀의 RMSLE 값: {rmsle(log_y, preds, True):.4f}')

    단! 지금처럼 성능 검증시 학습 데이터를 사용하면 안됨. 이건 예시를 위해서 사용.

     

    6. 예측 및 결과 제출

    주의사항

    1) 테스트 데이터로 예측한 결과를 사용해야 함.

    2) 예측한 값에 지수변환을 해줘야 함. 현재 예측값인 log(count)로 되어있음.

    linear_reg_preds = linear_reg_model.predict(X_test)
    
    submission['count'] = np.exp(linear_reg_preds)
    submission.to_csv('submission.csv', index=False)

     

    제출해서 바보 점수 받음

    • 네이버 블러그 공유하기
    • 네이버 밴드에 공유하기
    • 페이스북 공유하기
    • 카카오스토리 공유하기