[Python/pandas/scikit-learn] 빅데이터 분석기사 실기 유형2 풀이 샘플

2023. 7. 17. 04:32Tip

728x90

코드 전문

더보기
import pandas as pd
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import cross_val_score


def load_data():
    ws = "data/big-data-analytics-certification-kr-2023/"
    trn = pd.read_csv(ws + "train.csv")
    tst = pd.read_csv(ws + "test.csv")
    sample_submit = pd.read_csv(ws + "sample_submission.csv")
    print(sample_submit)
    return trn, tst


def EDA(trn, tst):
    df = pd.concat([trn, tst], axis="rows")
    for key in df.keys():
        ls = df[key].unique()
    if len(ls) < 30: print(f"{key}:{len(ls)} {ls}")
    # print(df.info())
    print(df[:3].T)
    pass


def preprocessing(trn, tst, target):
    df = pd.concat([trn, tst], axis="rows").reset_index()
    df['model'] = df['model'].apply(lambda x: x.strip())

    # result from EDA
    nums = ['year', 'mileage', 'tax', 'engineSize', 'mpg']
    cats = ['model', 'transmission', 'fuelType']

    # one-hot-encoding
    for key in cats:
        dum = pd.get_dummies(df[key], prefix=key)
    df = pd.concat([df, dum], axis='columns')
    df.pop(key)

    # normalize
    for key in nums:
        mn, mx = df[key].min(), df[key].max()
    df[key].apply(lambda x: (x - mn) / (mx - mn))

    return df[:trn.shape[0]], df[trn.shape[0]:], target


def modeling(train, target):
    model = RandomForestRegressor(
        random_state=0,
        max_depth=15,
        n_estimators=500
    )
    scores = cross_val_score(model, train, target, scoring="neg_root_mean_squared_error", cv=5)
    # print(sklearn.metrics.get_scorer_names())
    print(scores)
    print(scores.mean())

    model.fit(train, target)
    return model

#####################


raw_train, raw_test = load_data()

target_key = 'price'
target = raw_train.pop(target_key)

EDA(raw_train, raw_test)

train, test, target = preprocessing(raw_train, raw_test, target)
print(train.shape)
print(test.shape)

model = modeling(train, target)

pred = model.predict(test)
submit = pd.DataFrame({
    'id': range(len(pred)),
    target_key: pred
})
print(submit)
submit.to_csv("submit.csv", index=False)

기본 틀

1️⃣ 데이터 불러오기

  • 함수 load_data()로 추상화
  • pd.read_csv를 통한 수정 없는 데이터 탑재

2️⃣ 목적(독립)변수 설정

  • target_key와 key를 사용하여 target 열 정보 저장
  • pop 메소드를 사용하여 raw_train과 raw_test 형태를 동일하게 만든다.

3️⃣ EDA(Exploratory Data Analysis; 탐색적 데이터 분석)

  • 이후 진행할 전처리 작업을 정의한다.
  • 학습 데이터의 양이 모집단의 성격을 완전히 반영하지 못하는 경우를 고려해야 한다.
    때문에 train과 test를 이어 붙였다. (범주형 변수 one-hot-encoding 과정에 유리)
  • unique 연산을 했다. 독립적인 값만 나오기 때문에, 많은 정보들을 속성을 쉽고 빠르게 파악할 수 있다.
  • 이 과정을 통해 수치/범주형 변수의 구분, 결측치 처리, 변수 속성 판단, 문자열 공백 제거 또는 대소문자 통일 등 전처리 작업을 정의한다. (이상치 식별은 통계량 계산을 활용하고, 식별한 경우에도 출처가 test라면 제거할 수 없다.)

4️⃣ 전처리

  • EDA에서 정의한 내용을 바탕으로 raw_data를 data로 변환한다.
  • 1️⃣ 숫자/범주형 변수 정의
  • 2️⃣ 범주형 변수 one-hot-encoding
  • 3️⃣ 수치형 변수 normalize (min-max 등)
  • native Python으로 처리해도 되고, 패키지 내장 함수를 사용해도 된다.
    자신에게 맞는 방법을 선택하고, 반복 숙달하는 것이 핵심

5️⃣ 모델링

  • 매우 유연하고 무난한 성능을 가진 랜덤 포레스트 모델로 진행
  • 주어진 scoring 측도에 대한 모델 적합성을 판별하기 위한 validation 진행
    (단, valid 데이터를 별도로 구분하지 않으면 학습률 정도만 판단 가능)
    (k-fold cross validation은 주어지는 데이터 양이 많지 않아 일반적으로 생략)

6️⃣ 예측

7️⃣ 제출 형식 갖추기

  • unique key의 컬럼명과 target의 칼럼명 주의

8️⃣ 내보내기

  • 진행한 6회 실기 포함, 기출 문제들은 index=False 옵션 설정하도록 제출 형식이 통일되어 있음
728x90