본문 바로가기
Data Engineering

[빅데이터분석기사 실기 10회] 테스트 체험 환경 제2유형 모델 학습 정답 및 해설

by jangThang 2025. 6. 15.
반응형

 빅데이터분석기사 실기 10회 제2유형 체험 환경 문제를 풀어보고, 예시 답안과 결과를 살펴봅니다.

 

[ Contents ]

     

     

    1. 문제 분석

     

    구름EDU - 모두를 위한 맞춤형 IT교육

    구름EDU는 모두를 위한 맞춤형 IT교육 플랫폼입니다. 개인/학교/기업 및 기관 별 최적화된 IT교육 솔루션을 경험해보세요. 기초부터 실무 프로그래밍 교육, 전국 초중고/대학교 온라인 강의, 기업/

    edu.goorm.io

     

     10회 실기시험 2유형 체험 문제는 '회귀'가 나왔습니다. 백화점 고객의 1년간 상품 구매 기록을 학습해서, 총구매액을 예측하는 모델을 만들어야 합니다. 평가 지표는 RMSE였습니다.

     

     

    2. 데이터 전처리

    import pandas as pd
    
    train = pd.read_csv("data/customer_train.csv")
    test = pd.read_csv("data/customer_test.csv")
    
    # 1. 데이터 전처리
    # print(train.info())	# 환불금액 1200개 (결측치 2300개)
    # print(train.describe())
    # print(test.info())	# 환불금액 867개 (결측치 1615개)
    
    x_train = train.drop(columns=['회원ID', '총구매액'])
    y = train['총구매액']
    x_test = test.drop(columns=['회원ID'])
    # print(x_train.shape, y.shape, x_test.shape) # (3500, 8) (3500,) (2482, 8)
    
    x_train['환불금액'] = x_train['환불금액'].fillna(0);
    x_test['환불금액'] = x_test['환불금액'].fillna(0);
    # print(x_train.isna().sum())
    # print(x_test.isna().sum())

     

     데이터 전처리 과정에서는 불필요한 칼럼 제거 및 결측치 처리를 해줍니다. 회원ID와 같은 고유값은 제거하여 불필요하게 복잡도를 높이지 않습니다. 물론 순차적으로 회원 ID가 쌓이고, ID 크기에 따라 회원 연수 관계가 드러나는 경우 유효한 데이터가 될 수도 있지만... 대체로 빼는 게 좋습니다.

     결측치는 환불금액에만 있었고, null 값은 환불이 없다는 것으로 추정하여 환불액을 0으로 대체했습니다.

     

    2023.06.16 - [Data Visualization/Python Lib] - [Pandas] 데이터셋의 결측치를 구하고 처리하는 방법 (isnull, dropna, fillna)

     

    [Pandas] 데이터셋의 결측치를 구하고 처리하는 방법 (isnull, dropna, fillna)

    판다스에서 데이터셋의 결측치를 구하고 이를 처리하는 방법을 알아봅니다. 또한 결측치란 무엇이고, 이에 대한 처리가 왜 중요한지도 알아봅니다. [ Contents ] 1. 결측치(missing value) 비어있거나

    star7sss.tistory.com

     

    반응형

     

    3. 라벨 인코딩

    # 2. 라벨 인코딩
    from sklearn.preprocessing import LabelEncoder
    le = LabelEncoder()
    
    x_train['주구매상품'] = le.fit_transform(x_train['주구매상품'])
    x_test['주구매상품'] = le.transform(x_test['주구매상품'])
    x_train['주구매지점'] = le.fit_transform(x_train['주구매지점'])
    x_test['주구매지점'] = le.transform(x_test['주구매지점'])

     

     랜덤포레스트 모델을 쓸 예정이기 때문에, 별도의 스케일링은 진행하지 않았습니다.

     범주형 데이터에 대해서만 라벨 인코딩을 해줍니다. get_dummies를 이용해서 간단히 원핫 인코딩을 해줘도 됩니다.

     

     

    4. 데이터 분리

    # 3. 데이터 분리
    from sklearn.model_selection import train_test_split
    x_train, x_val, y_train, y_val = train_test_split(x_train, y, test_size=0.1)
    # print(x_train.shape, x_val.shape, y_train.shape, y_val.shape)

     

     validation 테스트를 위해서 데이터를 9:1로 분리합니다.

     학습 데이터가 많지 않기 때문에, 테스트 생략하고 전부 학습시켜도 무방하지만... 그러면 잘못 학습된 경우를 잡아내지 못하므로 10% 정도만 할애합니다.

     

     

    5. 모델 학습 및 검증

    # 4. 모델 학습 및 검증
    from sklearn.ensemble import RandomForestRegressor
    rf = RandomForestRegressor()
    rf.fit(x_train, y_train)
    val_pred = rf.predict(x_val)

     

     모델학습은 회귀 문제이므로 RandomForestRegressor를 사용해줍니다.

     

     

    6. 평가

    # 5. 평가
    from sklearn.metrics import root_mean_squared_error, r2_score
    rmse = root_mean_squared_error(y_val, val_pred)
    r2 = r2_score(y_val, val_pred)
    print(rmse, r2)	# 642.0873784646759 0.8244547361779538

     

     평가는 문제에서 제시한 RMSE  지표를 사용하되, 직관적인 성능 파악을 위해 R2 스코어도 구해줍니다.

     RMSE는 오차제곱합의 근호를 씌운 지표로, 낮을 수록 성능이 좋습니다. 반대로 R2 스코어는 0과 1 사이를 가지며, 1에 가까울수록 좋은 성능입니다.

     

     

    7.  결과 제출 및 확인

    # 6. 결과 제출
    y_pred = rf.predict(x_test)
    result = pd.DataFrame(y_pred, columns=['pred'])
    result.to_csv('result.csv', index=False)
    
    # 7. 결과 확인
    result = pd.read_csv('result.csv')
    print(result)

     

     테스트 데이터를 학습된 모델로 예측하고, 그 결과를 저장합니다.

     

     

    8. 전체 코드

    import pandas as pd
    
    train = pd.read_csv("data/customer_train.csv")
    test = pd.read_csv("data/customer_test.csv")
    
    # 1. 데이터 전처리
    # print(train.info())	# 환불금액 1200개 (결측치 2300개)
    # print(train.describe())
    # print(test.info())	# 환불금액 867개 (결측치 1615개)
    
    x_train = train.drop(columns=['회원ID', '총구매액'])
    y = train['총구매액']
    x_test = test.drop(columns=['회원ID'])
    # print(x_train.shape, y.shape, x_test.shape) # (3500, 8) (3500,) (2482, 8)
    
    x_train['환불금액'] = x_train['환불금액'].fillna(0);
    x_test['환불금액'] = x_test['환불금액'].fillna(0);
    # print(x_train.isna().sum())
    # print(x_test.isna().sum())
    
    # 2. 라벨 인코딩
    from sklearn.preprocessing import LabelEncoder
    le = LabelEncoder()
    
    x_train['주구매상품'] = le.fit_transform(x_train['주구매상품'])
    x_test['주구매상품'] = le.transform(x_test['주구매상품'])
    x_train['주구매지점'] = le.fit_transform(x_train['주구매지점'])
    x_test['주구매지점'] = le.transform(x_test['주구매지점'])
    
    
    # 3. 데이터 분리
    from sklearn.model_selection import train_test_split
    x_train, x_val, y_train, y_val = train_test_split(x_train, y, test_size=0.1)
    # print(x_train.shape, x_val.shape, y_train.shape, y_val.shape)
    
    
    # 4. 모델 학습 및 검증
    from sklearn.ensemble import RandomForestRegressor
    rf = RandomForestRegressor()
    rf.fit(x_train, y_train)
    val_pred = rf.predict(x_val)
    
    
    # 5. 평가
    from sklearn.metrics import root_mean_squared_error, r2_score
    rmse = root_mean_squared_error(y_val, val_pred)
    r2 = r2_score(y_val, val_pred)
    print(rmse, r2)	# 642.0873784646759 0.8244547361779538
    
    
    # 6. 결과 제출
    y_pred = rf.predict(x_test)
    result = pd.DataFrame(y_pred, columns=['pred'])
    result.to_csv('result.csv', index=False)
    
    # 7. 결과 확인
    result = pd.read_csv('result.csv')
    print(result)

     

     

     

    star가 되고나서 Tistory

    반응형

    댓글