TIL

내배캠 TIL 32일차

ColorConeHead 2024. 2. 1. 22:01
반응형

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_​



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