[빅분기] 빅데이터 분석기사 2유형 템플릿

주어진 데이터

train, test

 

 

데이터 수집 →데이터 전처리 → 데이터 분리 → 모델링 → 평가 

1. EDA

1) shape 확인 # 행, 열 개수

2) 데이터 확인 # head()

3) 데이터 타입 확인 # info(), dtypes()

4) 결측치 확인(수치형) # isnull().sum() , id는 고려x

 

2. 전처리

  • 정석: 1 - 2 - 3 - 4
  • 시간없으면: 1 - 2 - 5만 해도 가능

1) X_train, X_test, y  # ID나 name은 삭제

X_train = train.drop(["회원ID", "성별"], axis=1) # 독립변수(설명변수)
y = train["성별"] # 종속변수 
X_test = test.drop(["회원ID"], axis=1)

print(X_train.shape, y.shape, X_test.shape)
print(X_test.head())

2) 결측치 처리 .fillna()

X_train["환불금액"] = X_train["환불금액"].fillna(0)
X_test["환불금액"] = X_test["환불금액"].fillna(0)

print(X_train.isna().sum())
print(X_test.isna().sum())

 

 

3) 수치형 변수 스케일링(minmax, standard) 

fit_transform(X_train) → transform(X_test)

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()

# 수치형 데이터만 뽑기
num_columns = X_train.select_dtypes(exclude="object").columns
X_train[num_columns] = scaler.fit_transform(X_train[num_columns])
X_test[num_columns] = scaler.transform(X_test[num_columns])

4) 범주형 변수 인코딩(one-hot, label)

fit_transform(X_train) → transform(X_test)

# test데이터에 학습할때 없는 데이터가 있으면(컬럼 불일치) error
print(set(X_test["주구매상품"]) - set(X_train["주구매상품"]))
print(set(X_test["주구매지점"]) - set(X_train["주구매지점"]))

 

encoder = OneHotEncoder(handle_unknown ="ignore")

handle_unknown = "ignore" 옵션을 사용하면 x_train에 들어있지 않은 범주형 데이터를 전부 0으로 처리해줌

칼럼 일치시켜줌

from sklearn.preprocessing import LabelEncoder # 원핫인코딩/라벨인코딩 중 선택, 원핫인코딩이 더 잘나오긴 함(랜덤포레스트에는 상관없음)
encoder = LabelEncoder()

# fit_transform-> transform (o)
# train: A B C D -> 0 1 2 3
# test: A B D E -> 0 1 3 x

# fit_transform-> fit-transform (x)
# train: A B C D -> 0 1 2 3
# test: A B D E -> 0 1 2 3

X_train["주구매상품"] = encoder.fit_transform(X_train["주구매상품"]) 
X_test["주구매상품"] = encoder.transform(X_test["주구매상품"]) 
X_train["주구매지점"] = encoder.fit_transform(X_train["주구매지점"]) 
X_test["주구매지점"] = encoder.transform(X_test["주구매지점"])

 

5) get_dummies 사용 (3,4번 pass 가능)

RandomForest 모델은 스케일링의 영향을 많이 받지 않기 때문에 수치형 변수 스케일링 skip하고 변수형만 원핫인코딩으로 변환함.

단, 범주형 데이터가 train과 test에서 컬럼수가 같다면 가능. 명목형 변수들을 수치형으로 변환해줌

x_full = pd.concat(x_train, x_test, axis=0)
print(x_full.shape)

# 결측치 처리
x_full["환불금액"]= x_full["환불금액"].fillna(0)

# 수치형 변수 스케일링 skip -> randomforest는 스케일링의 영향을 크게 받지 x

# 범주형 변수 인코딩(원-핫인코딩)
x_full = pd.get_dummies(x_full)

print(x_full) # 고유 columns이 더 생김
pirnt(x_full.shape)

# 데이터 분리
x_train = x_full[:x_train.shape[0]]
x_test = x_full[x_train.shape[0]:]
print(x_train.shape, x_test.shape)

 

 

3. 데이터 분리

from sklearn.model_selection import train_test_split
# random_state 파라미터 확인(train_test_split)
X_train, X_val, y_train, y_val = train_test_split(X_train, y, test_size=0.2, stratify=y) #stratify 남자 여자 비율 동일하게 뽑기 위해 층화추출
print(X_train.shape, X_val.shape, y_train.shape, y_val.shape)

 

4. 분석모델

  • 분류 RandomForestClassifier
  • 회귀 RandomForestRegressor
from sklearn.ensemble import RandomForestClassifier # 분류 <-> 회귀 RandomForestRegressor
model = RandomForestClassifier()
model.fit(X_train, y_train)
y_val_pred = model.predict(X_val)

5. 평가

from sklearn.metrics import roc_auc_score, accuracy_score # 분류 <-> 회귀 root_mean_squared_error, accuracy_score
auc_score = roc_auc_score(y_val, y_val_pred)
acc = accuracy_score(y_val, y_val_pred)
print(auc_score, acc)

 

# 정확도 (accuracy) , f1_score , recall , precision -> model.predict로 결과뽑기
# auc , 확률이라는 표현있으면 model.predict_proba로 결과뽑고 첫번째 행의 값을 가져오기 model.predict_proba()[:,1]

 

6. CSV

y_pred = model.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) # 컬럼 개수 확인