본문 바로가기
TIL

내배캠 TIL 32일차

by ColorConeHead 2024. 2. 1.
반응형

1. 머신러닝 강의

1) 로지스틱 회귀분석


이전까지는 regression.
로직스틱은 분류. classification.

이를 시그모이드 함수라고 하고.
선형회귀식의 y에 로짓 함수를 대입한다.

 

 

2) 회귀분석의 절차


- 필요모듈.
# 회귀모형
from sklearn.linear_model import LogisticRegression
# 전처리
from sklearn.preprocessing import StandardScaler, MinMaxScaler, LabelEncoder, OneHotEncoder
# 데이터 분리
from sklearn.model_selection import train_test_split
# 평가
from sklearn.metrics import f1_score, accuracy_score

 


- 이상치.
# 이상치
# 1. ESD(정규분포라고 가정)
# 평균을 기점으로 3표준편차를 넘으면 이상치임
import numpy as np
mean = np.mean(data)
std = np.std(data)
upper = mean + 3*std
lower = mean - 3*std

# 2. IQR(4분위수 이용)
Q1 = df['data'].quantile(0.25)
Q3 = df['data'].quantile(0.75)
IQR = Q3 - Q1
upper = Q3 + 1.5*IQR
lower = Q1 - 1.5*IQR

# 3. 조건필터링을 통한 삭제(기준을 하이퍼파라미터로)
df[df['data'] > limit_value]​


- 결측치.
# 범주형 : 최빈값 대치
df.dropna(value)
df.fillna(value)

# 수치형 : EDA를 통해 전처리 방법을 고안할 것
sklearn.impute.SimpleImputer     : 통계량으로 대치
sklearn.impute.IterativeImputer  : 다변량대치(회귀 대치)
sklearn.impute.KNNImputer        : 최근접이웃 알고리즘 대치​


- 인코딩.
# 회귀식에 넣으려면 숫자여야 하니까 바꿔줘야 함.

# 1. 레이블 인코딩
# 아래와 같이 객체화하여 사용
encoder = sklearn.preprocessing.LabelEncoder()
# 메서드
fit(col)
transform(col)
fit_transform(col)
inverse_transform(col)

# 2. 원 핫 인코딩
# 해당하는 곳에만 불빛이 들어오는 거 같다 해서 원 핫!
pd.get_dummies() : 요거는 벡터가 아닌 칼럼을 많이 생성하는 것으로 알고 있음.
sklearn.preprocessing.OneHotEncoder() : 얘도 벡터가 아니라 칼럼 생성​


- 스캐일링.
# 3. 수치형 데이터 : 스캐일링
# 무대 스캐일이 크네 어쩌네 하는 바로 그 스캐일.
# 스캐일링 또한 객체화해서 사용한다
sklearn.preprocessing.StandardScaler() : 표준화(z)
sklearn.preprocessing.MinMaxScaler() : 정규화, 이상치의 영향 많이 받음.
sklearn.preprocessing.RobustScaler() : 로버스트라는 말답게 이상치에 강함.​


- 데이터 분리.
X_train, X_val, y_train, y_val
= sklearn.model_selection.train_test_split(X,           
                                           y,              
                                           test_size=0.2,    # 테스트 데이터 비율
                                           shuffle=True,     # 데이터 분리시 섞기
                                           random_state=42,  # 난수값. 같은 값 사용시 항상 같은 결과
                                           stratity=y)       # 데이터 분리시 정답오답 비율 설정


- 학습 및 평가.
logit = LogisticRegression()
logit.fit(X_train, y_train)

pred = logit.predict(X_val)

acc = accuracy_score(y_val, pred)
f1 = f1_score(y_val, pred)


- 교차 검증과 그리드 서치.

교차검증.
: train data를 k개의 하위 집합으로 나누어 모델을 학습시키고 최적화하는 것.
  데이터가 부족할 경우 유용(오버샘플링이 아님).
# 교차검증
from sklearn.model_selection import KFold
import numpy as np

# 하위 집합 생성
kfold = KFold(n_splits=5)
# 교차검증 점수 모음집
scores = []


# 교차검증 시행
# .split 메서드의 result가 튜플 형태로 나옴
for i, (train_index, val_index) in enumerate(kfold.split(X)):
  X_train, X_val = X.values[train_index], X.values[val_index]
  y_train, y_val = y.values[train_index], y.values[val_index]
  
  from sklearn.linear_model import LogisticRegression
  from sklearn.metrics import accuracy_score
  
  logit = LogisticRegression()
  logit.fit(X_train, y_train)
  y_pred = logit.predict(X.val)
  acc = accuracy_score(y_val, y_pred)
  
  print(f'{i}번째 교차검증 정확도는 {acc}'
  scores.append(acc)

# 평균 점수
print(np.mean(scores))​


- 그리드서치.
: 하이퍼 파라미터 최적화하기.
# 묘듈
from sklearn.model_selection imnport GridSearchCV
from sklearn.linear_model import LinearRegression

# 최적화를 원하는 하이퍼파라미터 설정하기
# param 내에서의 경우의 수를 모두 실행해준다
# solver에 3개, max_iter에 3개면 총 9개의 경우의 수
params = {'solver(최적화메서드)' : [리스트형태로 여러 메서드 넣어두기 뉴턴 랩슨이라든지],
          'max_iter' : [solver를 수렴을 위해 최대 몇번까지 사용하냐]}
         
logit = LinearRegression()

# scoring에는 평가할 점수, cv는 교차검증 수
grid_lor = GridSearchCV(logit, param_grid=params, scoring='accuray', cv=5)
grid_lor.fit(X_train, y_train)

gird_lor.best_params_
gird_lor.best_score_​



내일부터는 본격적으로 과제를 해야겠다.
반응형

'TIL' 카테고리의 다른 글

내배캠 TIL 34일차  (1) 2024.02.05
내배캠 TIL 33일차  (0) 2024.02.02
내배캠 TIL 31일차  (0) 2024.01.31
내배캠 TIL 30일차  (0) 2024.01.30
내배캠 TIL 29일차  (0) 2024.01.29