:: 1. Library/Data 불러오기 + EDA
- 파일이 3개 주어질 경우 (X_train, X_test, y_train)
- 데이터 샘플 확인 : head(), tail(), sample()
- 데이터 크기 : shape
- 데이터 타입 : info()
- 통계값 확인 (수치형 / 범주형 칼럼) : describe()
- 결측치 확인 : isnull().sum()
- y데이터의 target별 개수 확인 : value_counts()
- 상관관계 : corr()
# 수치형 칼럼
X_train.describe()
# 범주형 칼럼
X_train.describe(include='O')
X_train.describe(include='object')
- 파일이 2개 주어질 경우 (train, test)
- 예측해야할 target 칼럼이 데이터셋에 포함되어 있음
- 최근 시험 경향은 2개 파일로 제공되는 경우가 많음
- EDA는 더 편리함 → 조건 지정해서 확인 가능하기 때문
ex) ‘남성' 중 ‘소득’(=예측값)이 낮은 사람의 수(비율)
:: 2. 데이터 전처리
#결측치 처리
**’X_train’뿐만 아니라 ‘X_test’ 데이터셋도 결측치 처리 까먹지 말기!
**결측치 대체하기 애매한 ‘칼럼’은 drop하고 모델링 진행해도 됨 (행은 임의로 삭제 x)
[범주형 변수 결측치]
1. 삭제
- 특정 칼럼의 결측치만 삭제 : dropna(subset=[ ])
df = X_train.dropna(subset=['country', 'workclass'])
- 중복값 제거 : drop_duplicates()
df = X_train.drop_duplicates()
# df.drop_duplicates(subset=['A', 'B'], keep='last')
# 중복값을 제거할 경우 기본적으로 먼저 나온 값을 남겨두나, keep='last'설정 시 뒤의 값을 살림
2. 채우기
- 최빈값으로 대체
m = X_train['workclass'].mode()[0]
X_train['workclass'] = X_train['workclass'].fillna(m)
- 다른 값으로 채움
X_train['occupation'] = X_train['occupation'].fillna('X') # 결측치를 'X'라는 문자로 대체
[수치형 변수 결측치]
: 평균값, 중앙값, 최대값, 최소값, 그룹별 00 값…
#이상치 처리
# X_train 통계 확인
X_train.describe()
# age가 음수인 데이터들 확인
X_train[X_train['age'] <= 0]
# age가 1이상인 데이터만 살림
print(X_train.shape)
X_train = X_train[X_train['age'] > 0]
print(X_train.shape)
:: 3. 피처 엔지니어링
데이터 전처리 이후 수치형 데이터, 범주형 데이터 분리작업 실행: select_dtypes(exclude or include)
# 수치형 칼럼만 저장
n_train = X_train.select_dtypes(exclude='object').copy()
n_test = X_test.select_dtypes(exclude='object').copy()
# 범주형 칼럼만 저장
c_train = X_train.select_dtypes(include='object').copy()
c_test = X_test.select_dtypes(include='object').copy()
#스케일링
⭐️ fit이 학습, transform이 변환
→ train데이터에만 fit_transform(학습+변환) 적용 / test데이터엔 transform만 적용
1. MinMaxScaler() : 최대값1, 최소값0에 맞춰 변환
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
n_train[cols] = scaler.fit_transform(n_train[cols])
n_test[cols] = scaler.fit(n_test[cols])
2. StandardScaler() : 표준화(Z-score) → 평균 0, 표준편차 1인 표준정규분포 형식으로 변환
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
n_train[cols] = scaler.fit_transform(n_train[cols])
n_test[cols] = scaler.transform(n_test[cols])
3. RovustScaler() : 중앙값, 사분위수를 활용해 위 2개 방식 대비 이상치 영향을 최소화할 수 있음
from sklearn.preprocessing import RobustScaler
scaler = RobustScaler()
n_train[cols] = scaler.fit_transform(n_train[cols])
n_test[cols] = scaler.transform(n_test[cols])
#인코딩
1. 라벨(label) 인코딩
from sklearn.preprocessing import LabelEncoder
for col in cols: # 여러 칼럼 인코딩 진행 시 반복문 사용
le = LabelEncoder()
c_train[col] = le.fit_transform(c_train[col])
c_test[col] = le.transform(c_test[col])
2. 원핫(one-hot) 인코딩
- 별도 패키지 import 없이 판다스에서 제공하는 함수 사용
- 칼럼 내 고유값이 많은 경우 라벨인코딩 진행
cols = ['A', 'B', 'C']
c_train = pd.get_dummies(c_train, columns=cols)
c_test = pd.get_dummies(c_test, columns=cols)
**인코딩 완료 후 데이터를 합치게 된다면 train과 test 데이터 내 고유값이 정확히 일치하지 않을 경우 오류 발생 ⇒ 데이터를 합쳐서 인코딩 실행 후 재분리
cols = list(X_train.columns[X_train.dtypes == object]) # object 타입 칼럼명 불러옴
all_df = pd.concat([X_train, X_test]) # 데이터 위아래로 합침
all_df = pd.get_dummies(all_df[cols]) # 원핫 인코딩 실행
# train, test 재분리
line = int(X_train.shape[0])
X_train = all_df.iloc[:line,:].copy() # train 데이터의 shape만큼만 잘라냄
X_test = all_df.iloc[line:,:].copy() # train 데이터 이후 행들만 test 데이터로 분리
:: 4. 모델링
- 모델링은 3단계만 잘 실행하면 됨
- import한 모델 불러옴
- 모델.fit() → 모델 트레이닝
- 모델.predict() → 모델 예측
#분류 (Classifier)
# 랜덤포레스트
from sklearn.ensemble import RandomForestClassifier
rf = RandomForestClassifier() # 모델 불러옴
rf.fit(X_train[cols], y) # 학습
pred = rf.predict(X_test[cols]) # 예측결과 저장
# 로지스틱회귀
from sklearn.linear_model import LogisticRegression
model = LogisticRegression()
model.fit(X_train, y_train)
pred = model.predict(X_test)
- 검증용 데이터 분리
: y_test에 대한 평가 점수는 수험자가 알 수 없기 때문에, 정확도 확인을 위해 검증용 데이터를 분리해서 모델을 선택해야 함
# 학습용 데이터와 검증용 데이터로 구분
X_tr, X_val, y_tr, y_val = train_test_split(X_train, y, test_size = 0.1, random_state=42)
# XGBoost
from xgboost import XGBClassifier
xgb = XGBClassifier() # 모델 생성
xgb.fit(X_tr[cols], y_tr) # 학습 데이터에 훈련
pred = xgb.predict_proba(X_val[cols]) # 예측 (정확한 값이 아닌 확률값을 예측할 때 predict_proba 사용)
pred[:, 1] # y의 target값을 1로 예측한 확률만 확인
from sklearn.metrics import roc_auc_score
roc_auc_score(y_val,pred[:,1]) # 점수 확인
# csv 파일 생성
pred = xgb.predict_proba(X_test[cols]) # 점수가 가장 높은 xgb 모델을 이용하여 X_test 데이터 예측
submit = pd.DataFrame({
'id':X_test['id'],
'income':pred[:,1] # target값이 1인 칼럼에 대해서만 확률값 추출
})
submit.to_csv("result.csv", index=False)
#회귀 (Regression)
- object 칼럼만 선택해서 원핫인코딩
# object 컬럼명 선택
cols = train.select_dtypes(include='object').columns
# 원핫 인코딩
train = pd.get_dummies(train, columns=cols)
test = pd.get_dummies(test, columns=cols)
- 스케일링
→ 모델 평가 후 성능 향상을 위해 최적화하는 과정에서 진행 가능
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
cols = ['age', 'bmi']
train[cols] = scaler.fit_transform(train[cols])
test[cols] = scaler.transform(test[cols])
- 검증 데이터 분리
: 데이터셋이 2개만 주어진 경우 train 데이터 내에 target값(아래 코드의 경우 'charges'칼럼)이 포함되어 있으므로 해당 칼럼만 분리하여 y값으로 지정
from sklearn.model_selection import train_test_split
X_tr, X_val, y_tr, y_val = train_test_split(train.drop('charges',axis=1),
train['charges'],
test_size=0.15,
random_state=2022)
- 모델링
- 에러값 가장 작은 모델 선택하여 model 예측, 데이터프레임 생성 후 csv로 내보내기
from sklearn.linear_model import LinearRegression
from sklearn.ensemble import RandomForestRegressor
from xgboost import XGBRegressor # xgb는 파라미터 지정 필요
**최적화: 시간적 여유가 있다면 하이퍼 파라미터 튜닝 진행
1. 랜덤포레스트
- max_depth : 3~12
- n_estimators : 100 200 400 800 1000
2. XGBoost
- max_depth : 3~12
- n_estimators : 100~1000
- learning_rate : 0.01~0.1 (n_estimators 값을 올리면 learning_rate 값은 줄여줘야 함)
**lightgbm 모델⭐️
- 범주형 데이터 인코딩 처리 없이 데이터타입만 ‘category’로 바꿔서 사용 가능한 모델
- 하이퍼파라미터 튜닝은 xgboost와 동일
- 결측치 처리 안 해도 돌아감
(간단하게 사용 가능하고 성능도 좋아서, 저는 시험에서 랜덤포레스트와 해당 모델 사용해 에러값 비교했습니다!)
####### 분류 #######
import lightgbm as lgb
model = lgb.LGBMClassifier()
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
####### 회귀 #######
import lightgbm as lgb
model = lgb.LGBMRegressor()
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
:: 5. 평가지표
**만약 제시된 평가지표에 대한 작성법을 모를 경우, 해당 모델에 적합한 다른 방법으로 평가 후 제출해도 됨
- 이진분류
- f1-score, 정확도, recall등 평가지표 → predict
- roc_auc → predict_proba
- 다중분류
- f1-score : average 속성값 지정 필요 (micro, macro, weighted)
- 회귀
- MSE
- MAE
- 결정계수 (R-squared)
- RMSE
*해당 내용은 인프런 '퇴근후딴짓' 강의 수강 및 개인공부를 통해 개별적으로 정리한 내용입니다.
'Study' 카테고리의 다른 글
[자격증] 빅데이터분석기사 실기 요약정리(작업형3) (1) | 2024.09.14 |
---|---|
[자격증] 빅데이터분석기사 실기 요약정리(작업형1) (0) | 2024.07.07 |
[자격증] 빅데이터분석기사 8회 실기 합격 후기 | 준비기간, 퇴근후딴짓 강의, 꿀팁 (0) | 2024.07.02 |
[자격증] (✨요약정리 공유) 빅데이터분석기사 8회 필기 합격 후기 | 비전공자 공부방법, 준비기간 (14) | 2024.06.29 |