자격증/빅데이터 분석기사
빅데이터 분석기사 실기 2유형
구대연
2024. 6. 25. 15:20
유형2를 푸는 나만의 흐름 만들기!
- 문제를 꼼꼼히 읽고 문제를 정확하게 이해하기 (문제가 원하는 그대로 해야함)
- 분류, 회귀 판단하기
- 결측치, 이상치 파악 (1유형에서 주로 하지만 혹시나 모르니 확인하기)
관련성 없는 column삭제 (연관성분석으로 관련성 확인)- 수치형, 범주형 column분류 (수치형 → 스케일링, 범주형 → 원핫인코딩 하기 위해)
- 스케일링, 원핫인코딩
- train, validation 분리 (validatoin을 답안으로 제출금지!)
- 모델선정 (RandomForest만 사용해도 충분함. 분류 → RandomForestClassifier, 회귀 → RandomForestRegressor)
- 문제에서 원하는 판별법으로 판단 (ROC, Accuracy) (시험에 제출하는 것 아님 그냥 정확도 확인용)
- test데이터로 prediction
- 결과값 제출 predict_test.to_csv(’수험번호.csv’ , index=False)
- read_csv로 제출한 답안 다시 확인해보기 </aside>
분류 문제
# 제공된 3개 데이터 (y_test데이터 활용X)
X_train.shape, X_test.shape, y_train.shape
##EDA
#
print(X_train.head())
print(y_train.head())
print(X_test.head())
#결측치 확인, column 유형확인
print(X_train.info())
print(y_train.info())
print(X_test.info())
#범주형 컬럼 개수 파악
print(len(X_train['Warehouse_block'].unique()))
print(len(X_test['Warehouse_block'].unique()))
print(len(X_train['Mode_of_Shipment'].unique()))
print(len(X_test['Mode_of_Shipment'].unique()))
print(len(X_train['Product_importance'].unique()))
print(len(X_test['Product_importance'].unique()))
print(len(X_train['Gender'].unique()))
print(len(X_test['Gender'].unique()))
#수치형, 범주형 column 분류
#범주형 컬럼 중 value의 개수가 3개 이하와 3개 초과로 나눔
col_num = ['Customer_care_calls','Customer_rating','Cost_of_the_Product','Prior_purchases','Discount_offered','Weight_in_gms']
col_cat1 = ['Mode_of_Shipment','Product_importance','Gender']
col_cat2 = 'Warehouse_block'
#범주형 원핫인코딩
from pandas import get_dummies
X_train = pd.get_dummies(X_train, columns=col_cat1 , drop_first=True)
X_test = pd.get_dummies(X_test, columns=col_cat1 , drop_first=True)
#라벨인코딩
## 범주형 컬럼의 개수가 같을 때
from sklearn.preprocessing import LabelEncoder
for i in col_cat :
le = LabelEncoder()
le.fit(X_train[i])
X_train[i] = le.transform(X_train[i])
X_test[i] = le.transform(X_test[i])
print(X_train)
## 범주형 컬럼의 개수가 다를 때
from sklearn.preprocessing import LabelEncoder
all_df = pd.concat([X_train.assign(ind="train"), X_test.assign(ind="test")])
le = LabelEncoder()
all_df[col_cat] = all_df[col_cat].apply(le.fit_transform)
X_train = all_df[all_df['ind'] == 'train']
X_train = X_train.drop('ind',axis=1)
print(X_train)
X_test = all_df[all_df['ind'] == 'test']
X_test = X_test.drop('ind',axis=1)
print(X_test)
# 결측값 대체
from sklearn.impute import SimpleImputer
## 연속형 변수의 결측값 대체
numeric_imputer = SimpleImputer(strategy='mean')
X_train_numeric = numeric_imputer.fit_transform(X_train_numeric)
X_test_numeric = numeric_imputer.transform(X_test_numeric)
## 범주형 변수의 결측값 대체
categorical_imputer = SimpleImputer(strategy='most_frequent')
X_train_categorical = categorical_imputer.fit_transform(X_train_categorical)
X_test_categorical = categorical_imputer.transform(X_test_categorical)
#수치형에 MinMax스케일링 적용
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
scaler.fit(X_train[col_num])
X_train[col_num] = scaler.transform(X_train[col_num])
X_test[col_num] = scaler.transform(X_test[col_num])
print(X_train) #스케일링이 잘 되었는지 확인
#ID컬럼 제외
X_train_id = X_train.pop('ID')
X_test_id = X_test.pop('ID')
print(X_train) #스케일링이 잘 되었는지 확인
#train과 validation데이터로 분리
from sklearn.model_selection import train_test_split
X_tr, X_val, y_tr, y_val = train_test_split(X_train, y_train['Reached.on.Time_Y.N'], test_size=0.3, random_state=42)
## 모델학습
# 1. RandomForest
# 모델 학습
from sklearn.ensemble import RandomForestClassifier
model1=RandomForestClassifier()
model1.fit(X_tr, y_tr)
model1_val_pred = model1.predict_proba(X_val)
print(model1_val_pred)
# 모델평가
# 1. ROC-AUC score
from sklearn.metrics import roc_auc_score
roc_score1 = roc_auc_score(y_val, model1_val_pred[:,1])
print(roc_score1)
# 2. accuracy_score - proba인 경우 사용 불가능
from sklearn.metrics import accuracy_score
roc_score2 = accuracy_score(y_val, model1_val_pred[:,1])
print(roc_score2)
# 2. xgboost
# 모델 학습
from xgboost import XGBClassifier
model2 = XGBClassifier()
model2.fit(X_tr, y_tr)
model2_val_pred = model2.predict_proba(X_val)
# 모델평가
# 1. ROC-AUC score
from sklearn.metrics import roc_auc_score
roc_score1 = roc_auc_score(y_val, model2_val_pred[:,1])
print(roc_score1)
# 2. Accuracy_score - proba인 경우 사용 불가능
from sklearn.metrics import accuracy_score
roc_score2 = accuracy_score(y_val, model2_val_pred[:,1])
print(roc_score2)
##test데이터 예측
model1_pred = model1.predict_proba(X_test)
print(model1_pred)
##데이터 내보내기
pd.DataFrame({'ID' : X_test_id, 'Reached.on.Time_Y.N' : model1_pred[:,1]}).to_csv('1234.csv',index=False)
##제출할 데이터 확인
df = pd.read_csv('1234.csv')
print(df)
회귀 문제
# 제공된 3개 데이터 (y_test데이터 활용X)
X_train.shape, X_test.shape, y_train.shape
##EDA
#
print(X_train.head())
print(Y_train.head())
print(X_test.head())
#결측치 확인, column 유형확인
print(X_train.info())
print(Y_train.info())
print(X_test.info())
# 결측값 대체
#범주형 컬럼 개수 파악
print(len(X_train['Warehouse_block'].unique()))
print(len(X_train['Mode_of_Shipment'].unique()))
print(len(X_train['Product_importance'].unique()))
print(len(X_train['Gender'].unique()))
#수치형, 범주형 column 분류
#범주형 컬럼 중 value의 개수가 3개 이하롸 3개 초과로 나눔
col_num = ['Customer_care_calls','Customer_rating','Cost_of_the_Product','Prior_purchases','Discount_offered','Weight_in_gms']
col_cat1 = ['Mode_of_Shipment','Product_importance','Gender']
col_cat2 = ['Warehouse_block']
#범주형에 원핫인코딩 적용 - value 3개 이하
from pandas import get_dummies
X_train = pd.get_dummies(X_train, columns=col_cat1 , drop_first=True)
X_test = pd.get_dummies(X_test, columns=col_cat1 , drop_first=True)
#라벨인코딩
## 범주형 컬럼의 개수가 같을 때
from sklearn.preprocessing import LabelEncoder
for i in col_cat :
le = LabelEncoder()
le.fit(X_train[i])
X_train[i] = le.transform(X_train[i])
X_test[i] = le.transform(X_test[i])
print(X_train)
## 범주형 컬럼의 개수가 다를 때
from sklearn.preprocessing import LabelEncoder
all_df = pd.concat([X_train.assign(ind="train"), X_test.assign(ind="test")])
le = LabelEncoder()
all_df[col_cat] = all_df[col_cat].apply(le.fit_transform)
X_train = all_df[all_df['ind'] == 'train']
X_train = X_train.drop('ind',axis=1)
print(X_train)
X_test = all_df[all_df['ind'] == 'test']
X_test = X_test.drop('ind',axis=1)
print(X_test)
# 결측값 대체
from sklearn.impute import SimpleImputer
## 연속형 변수의 결측값 대체
numeric_imputer = SimpleImputer(strategy='mean')
X_train_numeric = numeric_imputer.fit_transform(X_train_numeric)
X_test_numeric = numeric_imputer.transform(X_test_numeric)
## 범주형 변수의 결측값 대체
categorical_imputer = SimpleImputer(strategy='most_frequent')
X_train_categorical = categorical_imputer.fit_transform(X_train_categorical)
X_test_categorical = categorical_imputer.transform(X_test_categorical)
#수치형에 MinMax스케일링 적용
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
scaler.fit(X_train[col_num])
X_train[col_num] = scaler.transform(X_train[col_num])
X_test[col_num] = scaler.transform(X_test[col_num])
print(X_train) #스케일링이 잘 되었는지 확인
#ID컬럼 제외
X_train_id = X_train.pop('ID')
X_test_id = X_test.pop('ID')
print(X_train) #스케일링이 잘 되었는지 확인
#train과 validation데이터로 분리
from sklearn.model_selection import train_test_split
X_tr, X_val, y_tr, y_val = train_test_split(X_train, y_train['Reached.on.Time_Y.N'], test_size=0.3, random_state=42)
##모델학습
#1. RandomForest
# 모델 학습
from sklearn.ensemble import RandomForestRegressor
model1=RandomForestRegressor()
model1.fit(X_tr, y_tr)
model1_val_pred = model1.predict(X_val)
print(model1_val_pred)
#모델평가
#1. MSE
from sklearn.metrics import mean_squared_error
MSE1 = mean_squared_error(y_val, model1_val_pred)
#2. R2
from sklearn.metrics import r2_score
r2_1 = r2_score(y_val, model1_val_pred)
# 2.XGboost
# 모델 학습
from xgboost import XGBRegressor
model2 = XGBRegressor()
model2.fit(X_tr, y_tr)
model2_val_pred = model2.predict(X_val)
#모델평가
#1. MSE
from sklearn.metrics import mean_squared_error
MSE2 = mean_squared_error(y_val, model2_val_pred)
#2. R2
from sklearn.metrics import r2_score
r2_2 = r2_score(y_val, model2_val_pred)
##test데이터 예측 (랜덤포레스트와 xgboost중 RMSE가 작은 모델로 적합)
model1_pred = model1.predict_proba(X_test)
print(model1_pred)
##데이터 내보내기
pd.DataFrame({'ID' : X_test_id, 'Reached.on.Time_Y.N' : model1_pred[:,1]}).to_csv('1234.csv',index=False)
##제출할 데이터 확인
df = pd.read_csv('1234.csv')
print(df)