[230316] 멋쟁이사자처럼 AI SCHOOL 8기 3월 셋째주 WIL

조세연·2023년 3월 16일
0

멋사 AI SCHOOL 8기

목록 보기
33/35

🐸 이번주 학습 내용

  • 3월 13일 : RandomForest 모델, train_test_split()으로 학습&예측 데이터셋 만들기, pd.get_dummies()를 활용한 one-hot-encoding
  • 3월 14일 : ExtraTreesClassifier, cross validation(교차검증), Binary encoding, OneHotEncoder를 활용한 one-hot-encoding
  • 3월 14일 : ExtraTreesRegressor, 회귀예측 결과 평가 지표, Ordinal encoding, Kaggle Competition 참여 방법, label smoothing, GradientBoostingRegressor, GridSearchCV

🐸 이번주 핵심 포인트

1. 머신러닝 학습 및 예측의 큰 흐름

1) 데이터 가져오기
2) 전처리
: 결측치 처리, 데이터 타입 변경 등
3) 문제(feature)와 답안(label) 나누기
4) train, test 데이터셋 나누기 (X_train, y_train, X_test, y_test)
5) encoding 하기
6) 머신러닝 알고리즘 가져오기
7) cross validation으로 현재 feature, parameter, model의 성능 검증하기
8) 정확도 및 평가지표로 모델 성능 평가하기
9) 머신러닝 모델로 학습(fit)과 예측(predict)하기
10) 피처 중요도 구하기

.

2. 지금까지 배운 머신러닝 모델 총정리

🔸 DecisionTree Model

  • 데이터 특징에서 추론된 간단한 의사 결정 규칙을 학습하여 목표 변수의 값을 예측하는 모델
  • 마치 스무고개처럼 데이터를 분석하여 Yes/No로 답하는 과정을 거침

🔸 RandomForest Model

  • 다수의 결정 트리들을 학습하는 앙상블 방법
  • 트리의 개수가 너무 적으면 underfitting, 너무 많으면 overfitting

🔸 ExtraTrees Model

  • 포레스트 트리의 각 후보 특성을 무작위로 분할하는 식으로 무작위성을 증가하는 앙상블 러닝 모델
  • Decision Tree, RandomForest보다 전반적으로 특성의 중요도를 더 높게, 더 고르게 평가

🔸 GradientBoosting Model

  • 샘플의 가중치를 수정하는 대신 이전 모델이 만든 잔여 오차에 대해 새로운 모델을 학습 (마치 오답노트를 공부하는 것처럼 틀린 것만 다시 학습해서 새로운 트리를 계속해서 업데이트)

.

3. train, test data를 만드는 여러가지 방법

1) 직접 슬라이싱해서 만들기

split_count = int(df.shape[0] * 0.8)
X_train = X.loc[:split_count]
X_test = X.loc[split_count:]
y_train = y[:split_count]
y_test = y[split_count:]

2) sklearn의 train_test_split()으로 만들기

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, stratify=y, test_size=0.2, random_state=42)

.

4. Encoding을 하는 여러가지 방법

1) pd.get_dummies() 활용

pd.get_dummies(X_raw)

2) Binary encoding

# nunique값이 2인 컬럼만 가져오기
nuni = df.drop(columns=label_name).nunique()
bicols = nuni[nuni == 2].index

# bicols에 속한 컬럼 중 이미 숫자형으로 인코딩이 되어있는 SeniorCitizen을 제외하고
# 나머지 컬럼들을 T/F 값으로 만들기
df["gender_bi"] = df["gender"] == "Male"
for yes_col in ['Partner', 'Dependents', 'PhoneService', 'PaperlessBilling']:
    df[f"{yes_col}_bi"] = (df[yes_col] == "Yes").copy()

3) One-hot-Encoding

# one-hot-encoding할 컬럼 추출
# binary encoding한 컬럼, 숫자형 컬럼을 제외한 모든 문자형 컬럼들
col_ohe = X_train.select_dtypes(include="object").drop(columns=['gender', 'Partner', 'Dependents', 'PhoneService',
       'PaperlessBilling']).columns

# sklearn의 OneHotEncoder를 사용해 one-hot-encoding하기
from sklearn.preprocessing import OneHotEncoder
ohe = OneHotEncoder(handle_unknown='ignore')
X_train_ohe = ohe.fit_transform(X_train[col_ohe])
X_test_ohe = ohe.transform(X_test[col_ohe])

# X_train ohe를 데이터 프레임으로 만들기
df_train_ohe = pd.DataFrame(X_train_ohe.toarray(), columns=ohe.get_feature_names_out())

# X_train 과 index(CustomerID) 똑같이 만들기
df_train_ohe.index = X_train.index

# X_train에서 숫자형과 논리형 데이터만 가져오기 (Ohe 적용하지 않은 데이터들)
X_train_num = X_train.select_dtypes(exclude="object")

# Ohe을 적용 안 한 데이터와 적용한 데이터를 병합하기
X_train_enc = X_train_num.join(df_train_ohe)

# X_test도 같은 방식으로 진행

4) Ordinal Encoding

train["YME"] = train["YM"].astype("category").cat.codes

.

5. 분류 모델의 정확도를 측정하는 방법

# 방법1
(y_test == y_predict).mean()

# 방법2
from sklearn.metrics import accuracy_score
accuracy_score(y_test, y_predict)

.

6. 회귀 모델의 평가 지표

🔸 R-squared(결정계수)

  • R-squared가 높을수록(1에 가까울수록) 모델의 성능이 좋다고 판단
from sklearn.metrics import r2_score
r2_score(y_train, y_valid_predict)

🔸 MAE(Mean Absolute Error)

  • 오차의 절대값의 평균
  • 틀린 값에 대해 절댓값만 볼 때 사용
from sklearn.metrics import mean_absolute_error
mean_absolute_error(y_train, y_valid_predict)

🔸 MSE(Mean Squared Error)

  • 오차의 제곱의 평균 -> 오차에 대해 큰 패널티 부여
  • 많이 틀릴 수록 패널티를 줄 때 → why? 오차를 제곱하기 때문에
from sklearn.metrics import mean_squared_error
mean_squared_error(y_train, y_valid_predict)

🔸 RMSE(Root Mean Squared Error)

  • 오차의 제곱의 평균의 제곱근 -> 오차에 대해 큰 패널티 부여
  • 틀린 값에 대한 편차를 볼 때
mean_squared_error(y_train, y_valid_predict)**0.5

🔸 RMSLE(Root Mean Squared Logarithmic Error)

  • 로그1p(1을 더해 로그를 취해줌)를 취한 오차의 차의 제곱의 평균에 제곱근을 취한 값
  • 이상치에 덜 민감함
  • 적게 틀린 것에 더 패널티를 주고 아주 많이 틀린것에 좀 더 적게 패널티를 줄 때 → why? log를 사용하기 때문에
from sklearn.metrics import mean_squared_log_error
np.sqrt(mean_squared_log_error(y_train, y_valid_predict))

.

7. label smoothing을 적용하는 방법

🔸 label smoothing

  • 딥러닝에서 오버피팅을 방지하고 모델 성능을 개선하기 위해 정답값(label)을 부드럽게 만들어주는 기법
  • 첨도, 왜도 감소
train["count_log1p"] = np.log1p(train["count"])
# 다시 되돌릴 땐
# train["count_expm1"] = np.expm1(train["count_log1p"]) - 1

.

8. GridSearchCV를 사용하는 방법

🔸 GridSearchCV → 하이퍼 파라미터 튜닝 자동화

  • 하이퍼파라미터를 순차적으로 입력해 학습을 하고 측정을 하면서 가장 좋은 파라미터를 알려줌
parameters = {"n_estimators": (200, 300, 400),
             "learning_rate":(0.05, 0.1, 0.2)}

import sklearn
sklearn.metrics.SCORERS.keys()

from sklearn.model_selection import GridSearchCV
reg = GridSearchCV(model, parameters, n_jobs=-1, cv=3, verbose=2,
                   scoring="neg_root_mean_squared_error")
reg.fit(X_train, y_train)

.

🐸 칭찬

험난한 일주일이었다.
현학적인 용어와 추상적인 개념 때문에
수업 내용을 이해하는데 상당히 힘들었다.

하지만!
나는 예전처럼 숨이 턱턱 막히거나
스트레스를 너무 받아 편두통을 느끼지 않았다.

그저 낯설어서 더 어렵게 느껴지는 것이고
반복해서 보다보면 익숙해지는 날이 올거라고 생각했다.
나는 꾸준한 노력을 꽤 잘하는 사람이니
분명 이 역경(?)을 잘 헤쳐나갈 것이다.

원래 모든 일은 유창해져야 즐겁고,
그전까지는 울면서 하는 구간이라고 한다.
(내가 존경하는 유튜버 이연님이 해주신 말씀이다.)

지금은 울더라도 언젠가
멋있게 머신러닝을 활용하는 내 모습을 상상하며
오늘도 부지런히 공부해야지!

..라는 생각을 매일 했다.
이렇게 긍정적으로 생각하는 나 자신을 칭찬하고 싶었다.
잘 하고 있어 세연아!!!

.

🐸 반성

바쁘다는 핑계로 식사를 대충하고 하루를 급하게 마무리하는 날이 많았다.
내가 나에 대해 생각하고 고민하는 시간이 너무 줄었다.

아버지가 항상 말씀하셨듯
마음의 여유를 가지기 위해 일상의 틈을 만들자.
의식적으로 차분히 스스로를 돌아볼 수 있는 시간을 만들어야 한다.

나는 나를 너무 함부로 대하는 경향이 있다.
이 세상에서 나를 가장 잘 챙길 수 있는 사람은
나 자신이라는 것을 잊지 말자.

.

🐸 다음주 계획

🧐 지난 계획을 얼마나 잘 지켰나?

피드백은 말만 하는 게 아니라 지키라고 있는 것.
과거 조세연은 이런 목표를 세웠다. 👉 3월 첫째주 계획 바로가기

  1. 매일 seaborn tutorial 스터디 인증하기
    : ❌ 현재 진행하고 있는 일이 많다보니 우선순위에 밀리는 seaborn.. 매일 하지 못하고 일주일에 3~4번 정도 업로드 했다.
  2. 백준 파이썬 문제 하루에 하나씩 풀고 깃헙 커밋하기
    : ⭕ 거의 매일 하고 있다. 함께 루틴을 만든 수강생분과 서로 인증하면서 진행하는 것이 도움이 많이 된다.
  3. 프로그래머스 SQL 문제 하루에 하나씩 풀기
    : ⭕ SQL도 매일 하고 있다. 개인적으로 SQL을 좋아해서 그런지 파이썬 문제를 풀 때보다 더 재미있다.

.

✨ 이번주 새로운 계획 3가지

  1. 태블로 퍼플릭에 대시보드 1개 업로드 (태블로 포트폴리오 시작!)
  2. 취업용 노션 포트폴리오 만들기
  3. KMOOC 머신러닝 강의 완강하기

내 책상에서 가장 잘 보이는 곳에 메모 완료..!
이번주도 목표달성 해보자!

.

🐸 나에게 한마디!

만나는 사람마다 네가 모르는 전투를 치르고 있다.
친절하라, 그 어느 때라도

profile
HR Analyst가 되고 싶은

0개의 댓글