데이터 분석/자격증

빅데이터 분석기사 실기 작업형 2유형 흐름

쎄마비 2022. 7. 25. 16:00
728x90
반응형

안녕하세요 노션에 이전 빅데이터 분석기사 공부할 때 적었던 노트가 있어 공유합니다.
맨 처음 공부할 때 정리한거라 빠진 부분도 많지만 작업형 2유형의 전체적인 프로세스가 이런 식으로 흘러가는구나 하고 보시면 도움되는 부분이 있을 것 같습니다 :)
 
 

데이터 불러오기

pd.read_csv()

 
 

데이터 EDA

df.info()
df.describe()
df.unique()

 

결측치 처리

df.dropna()
df.index_reset(drop = True, inplace = True)

 
 

범주형 변수 처리

from sklearn.preprocessing import OneHotEncoder
ohe = OneHotEncoder()
X = pd.concat([X_train,X_test])
ohe.fit(X[COL_CAT])
X_train_res = ohe.transform(X_train[COL_CAT])
X_test_res = ohe.transform(X_test[COL_CAT])
X_train_ohe = pd.DataFrame(X_train_res.todense(), columns = ohe.get_feature_names())
X_test_ohe = pd.DataFrame(X_test_res.todense(), columns = ohe.get_feature_names())
X_train_fin = pd.concat([X_train[COL_NUM], X_train_ohe], axis = 1)
X_test_fin = pd.concat([X_test[COL_NUM], X_test_ohe], axis = 1)

 
 

테스트, 검증 데이터 분리

from sklearn.model_selection import test_train_split
X_tr, X_val, y_tr, y_val = train_test_split(X_train_fin, y_train, test_size = 0.3)

 
 

연속형 변수 스케일링

from sklearn.preprocessing import StandardScaler
또는 from sklearn.preprocessing import MinMaxScaler

scaler = StandardScaler() 또는 MinMaxScaler()

X_tr[COL_NUM] = scaler.fit_transform(X_tr[COL_NUM])
X_val[COL_NUM] = scaler.transform(X_val[COL_NUM])
X_test_fin[COL_NUM] = scaler.transform(X_test_fin[COL_NUM])

 
 

모델 적합

선형 회귀 모델 적합

from sklearn.linear_model import LinearRegression
modelLR = LinearRegression()
modelLR.fit(X_tr, y_tr)
y_val_pred = modelLR.predict(X_val)

 
 

KNN, 의사결정나무 모델 적합

from sklearn.neighbors import KNeighborsClassifier
modelKNN = KNeighborsClassifier(n_neighbors = 5, metric = 'euclidean')
modelKNN.fit(X_tr, y_tr.values.ravel())

from sklearn.tree import DecisionTreeClassifier
modelDT = DecisionTreeClassifier(max_depth = 10)
modelDT.fit(X_tr, y_tr)

y_val_pred = modelKNN.predict(X_val)
y_val_pred_probaKNN = modelKNN.predict_proba(X_val)
y_val_pred_probaDT = modelDT.predict_proba(X_val)

# 예측 확률 변수 저장
best_model = None best_score = 0
for i in range(2, 10):
	model = KNeighborsClassifier(n_neighbors = i, metric = 'euclidean')
    model.fit(X_tr, y_tr.values.ravel())
    y_val_pred_proba = model.predict_proba(X_val)
    score = roc_auc_score(y_val, y_val_pred_proba[:, 1])
    print(i,'개의 이웃 확인 : ',score)
    if best_score <= score: best_model = model # KNN에서 최적의 N의 수 확인

 
 

랜덤 포레스트 모델 적합

from sklearn.ensemble import RandomForestClassifier
model_rf = RandomForestClassifier()
model_rf.fit(X_tr, y_tr.values.ravel())

 
 

XGBoost 분류 모델 적합

from xgboost import XGBClassifier
model_xgb = XGBClassifier()
model_xgb.fit(X_tr, y_tr.values.ravel())

 
 

모델 평가

선형 회귀 모델의 RMSE

from sklearn.metrics import mean_squared_error, r2_score
mse = mean_squared_error(y_val, y_val_pred)
rmse = mean_squared_error(y_val, y_val_pred, squared = False)
print(rmse)

 

KNN, 의사결정나무 모델 평가

from sklearn.metrics import roc_auc_score
scoreKNN = roc_auc_score(y_val, y_val_pred_probaKNN[:, 1])
scoreDT = roc_auc_score(y_val, y_val_pred_probaDT[:, 1])
print(scoreKNN, scoreDT)

 
 

하이퍼파라미터 튜닝(코드 실행 시간 문제가 있어 우선순위 낮음)

의사결정나무

from sklearn.model_selection import GridSearchCV
grid_params = { 'n_estimators' : [50, 100, 200], 'max_depth' : [5, 10, 15], 'min_samples_split' : [2, 5, 10], 'min_samples_leaf' : [1, 2, 4] }
rf_cv = GridSearchCV(estimator = model.rf, param_grid = grid_params, cv = 5)
rf_cv.fit(X_train, y_train.values.ravel())
print(rf_cv.best_params_)

model_rf2 = RandomForestClassifier(n_estimators = 50, max_depth = 5, min_samples_split = 2, min_samples_leaf = 1)
model_rf2.fit(X_train, y_train.values.ravel())
y_pred_rf2 = model_rf2.predict_proba(X_val)
score_rf2 = roc_auc_score(y_val, y_pred_rf2[:, 1])
print(score_rf2) # GridSearchCV를 통해 최적의 값을 찾고 그 값을 모델에 넣어 학습시킨다

 
 

XGBoost 분류 모델

from sklearn.model_selection import GridSearchCV
grid_params = { 'max_depth' : [3, 5, 7], 'min_child_weight' : [1, 2], 'colsample_bytree' : [ 0.6, 0.8], 'subsample' : [0.6, 0.8] }
xgb_cv = GridSearchCV(estimator = model_xgb1, param_grid = grid_params, cv = 5)
xgb_cv.fit(X_tr, y_tr.values.ravel())
print(xgb_cv.best_params_)

params = {'max_depth' : 7, 'min_child_weight' : 1, 'colsample_bytree' : 0.6, 'subsample' : 0.8 }
model_xgb2 = XGBClassifier(n_estimators = 100, learning_rate = 0.05)
model_xgb2.set_params(**params)
model_xgb2.fit(X_tr, y_tr, early_stopping_rounds = 50, eval_metric = 'auc', eval_set = [(X_val, y_val)], verbose = 10)
print(model_xgb2.best_score)

 
 

결과 파일 내보내기

# 선형 회귀 모델인 경우 predict를 내보낸다
y_pred = modelLR.predict(X_test_fin)
pd.DataFrame(y_pred[:,0]).to_csv('1234.csv', index = False)
# KNN, XGBoost 모델인 경우 predict_proba를 내보낸다
pred = best_model.predict_proba(X_test)[:, 1]
pd.DataFrame({'isUSA': pred}).to_csv('123.csv', index = False)

 

728x90
반응형