[Python/pandas/scikit-learn] 빅데이터 분석기사 실기 유형2 풀이 샘플
2023. 7. 17. 04:32ㆍTip
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
'Tip' 카테고리의 다른 글
[Python] BOJ 1874번: 스택 수열 (0) | 2023.07.21 |
---|---|
[JavaScript] IntersectionObserver API 활용 이벤트 처리 (0) | 2023.07.17 |
[Python] BOJ 10815번: 숫자 카드 (0) | 2023.07.16 |
[JavaScript] LocalStorage Basic (0) | 2023.07.13 |
[HTML/CSS] Flex, Grid를 활용한 레이아웃 생성 (0) | 2023.07.13 |