머신러닝

[ML]12. 로지스틱 회귀모델

CodeJaram 2023. 9. 1. 15:00

머신러닝_12_로지스틱 회귀모델 

 

  1. 로지스틱 회귀모델: 선형모델 방식을 기반으로 이진분류(0,1)를 수행하는 모델
  • 간단한 함수식을 사용하기 때문에 학습 및 예측 속도가 빠름
  • 대량의 데이터셋에서 잘 동작함
  • 특성이 많을수록 모델 성능이 좋음, 특성이 적은 경우 다른 모델이 더 우수한 편

 

선형분류모델은 값이 커질수록 직선이 늘어나 값의 좌표가 달라지면서 0과 1 사이의 범위를 벗어나  구분선 위에 위치할지 아래에 위치할지 모르기 때문에 합불 여부가 불확실해짐

 

로지스틱 회귀모델: Sigmoid 함수를 사용하면 아무리 작은 수여도 0에 가깝게, 아무리 큰 수여도 1에 가깝게 조정하여 값을 0과 1사이의 확률정보로 표시. 값이 커지거나 작아져도 기준선에 따라 합불 여부를 판단할 수 있음



2. 데이터 스케일링: 데이터 특성(feature)들의 값의 범위를 일정한 수준으로 맞추는 작업

  • 사용이유: 거리, 수치기반 모델의 경우 특성마다 다른 범위를 가진 편차가 큰 데이터는 모델의 결과가 잘못 나올 수 있음(KNN, 선형회귀, 로지스틱 회귀 등)

예)신체검사 데이터에서 시력과 키 특성 학습

→키의 데이터범위가 시력에 비해 크기 때문에 시력의 중요도가 떨어짐 

 

1)Standard Scaler

  • 변수의 평균, 분산을 이용해 정규분포 형태로 변환(평균 0, 분산 1)
  • 최소값과 최대값을 설정하지 않음

→이상치에 민감하지 않은 모델일 때 데이터의 분포 확인하는 용도

  • 이상치가 있으면 평균과 분산에 영향을 미쳐  데이터의 분포가 달라질 수 있음
  • 기준선을 기준으로 합불 여부를 판단할 때→분류모델에 더 많이 사용

 

2)MinMax Scaler

  • 데이터를 0과 1 사이의 값으로 변환(-값이 있으면 -1~1 사이의 값으로 변환)
  • 이상치에 민감한 모델일 때 이상치를 0~1 사이의 값으로 변환하여 이상치 제거→회귀모델에 주로 사용됨 

예)이미지 데이터 분류

 

[손글씨 데이터 분류 실습]

  1. 문제정의

-손글씨 숫자(0~9)를 분류하는 실습

-이미지 데이터의 형태 이해(0~255)

 

import pandas as pd

import numpy as np

import matplotlib.pyplot as plt

 

 

2. 데이터 불러오기

digit=pd.read_csv('/content/drive/MyDrive/실습파일/머신러닝 실습/Data/digit_train.csv')

 

#문제데이터의 범위 0~255

#이미지 크기: 28*28 픽셀(784)

#이미지는 행과 열로 구성됨

 

digit.label.unique()

 

#정답데이터의 범위 0~9

 

 

3. 탐색적 데이터 분석(EDA)

  • 문제데이터(픽셀) 이미지로 변환하기

 

#문제 데이터

img0=digit.iloc[0,1: ]

s

#문제 데이터 최대값, 최소값 구하기

#픽셀 데이터의 범위: 0~255

 

img0.max()

img0.min()

 

#이미지 출력

#행으로 구성된 픽셀을 행과 열로 구성하여 이미지로 출력

 

plt.imshow(img0.values.reshape(28,28),cmap='gray')

 

plt.show()

 

  • 문제/답지 데이터 분할

 

#문제 데이터 추출

X=digit.iloc[ :5000, 1: ]

y=digit.iloc[ : 5000, 0]

 

 

  • 학습용/평가용 데이터 분할

 

from sklearn.model_selection import train_test_split

 

#학습용/평가용 데이터 분할

X_train, X_test, y_train, y_test=train_test_split(X, y, test_size=0.3, random_state=10)

 

 

4. 로지스틱 회귀모델

 

# 로지스틱 회귀 모델 불러오기

from sklearn.linear_model import LogisticRegression

 

# 모델 생성

logi_model= LogisticRegression()

 

# 모델 학습

logi_model.fit(X_train, y_train)

 

#교차검증

from sklearn.model_selection import cross_val_score

 

#cross_val_score(모델이름, 문제데이터, 정답데이터, cv(분할))

result=cross_val_score(logi_model, X_train, y_train, cv=5)

 

print('교차검증', result)

print('교차검증 평균', np.round(result.mean(), 2))

 

# 모델 평가

score=logi_model.score(X_test, y_test)

print('모델 평가 점수',np.round(score,2))

 

 

5. 데이터 스케일링

1)MinMaxScaler 모델 생성 및 학습

#MinMaxScaler 불러오기

from sklearn.preprocessing import MinMaxScaler, StandardScaler

 

#MinMaxScaler 모델 생성

mm_scaler=MinMaxScaler()

 

#스케일링 학습->이미지데이터의 범위 0~255가 0~1 사이의 값으로 압축

mm_scaler.fit(X_train)

 

  • 스케일링 변환

#스케일링 변환->transform()

 

X_train_scale=mm_scaler.transform(X_train) #train scale

X_test_scale=mm_scaler.transform(X_test) #test scale

 

#스케일링 확인->히스토그램

 

plt.hist(X_train_scale[0])

 

  • 스케일링 변환 데이터 학습 및 평가

#스케일링 적용한 데이터 모델 학습

logi_model.fit(X_train_scale, y_train)

 

#스케일링 적용 모델 교차검증

from sklearn.model_selection import cross_val_score

 

#cross_val_score(모델이름, 문제데이터, 정답데이터, cv(분할))

result=cross_val_score(logi_model, X_train_scale, y_train, cv=5)

 

print('스케일링 적용 교차검증', result)

print('스케일링 적용 교차검증 평균', np.round(result.mean(), 2) )

 

#모델 평가

scale_score=logi_model.score(X_test_scale, y_test)

print('모델 평가 점수',np.round(scale_score,2))

 

# 스케일링 적용 전

# 교차검증 평균 0.87

# 모델 평가 점수 0.86

# ->과대적합 0.1

 

# # 스케일링 적용 후

# 스케일링 적용 교차검증 평균 0.89

# 모델 평가 점수 0.89

 

 

2)StandardScaler 모델 생성 및 학습

#StandardScaler 불러오기

from sklearn.preprocessing import StandardScaler

 

# StandardScaler객체 생성

s_scaler=StandardScaler()

 

# StandardScaler 학습&스케일링 변환(0~1)

s_data=s_scaler.fit_transform(data)

 

 

6.  분류모델 예측의 불확실성 추정

predict_proba: 분류 모델이 각 클래스에 대한 확률 출력

예)클래스가 0일 확률

 

#KNN 모델 생성 및 학습

from sklearn.neighbors import KNeighborsClassifier

 

knn_model=KNeighborsClassifier()

 

knn_model.fit(X_train, y_train)

 

#predict_proba: 분류모델 예측 시 어떤 확률정보를 가지고 예측했는지 확인하는 함수

 

knn_model.predict_proba(X_test[10: 50])



7. SMOTE: 오버샘플링 기법

  • 오버샘플링

#SMOTE: 오버샘플링 기법

 

# sampling_strategy->편중된 데이터 샘플링하는 방식

# auto: 데이터 편중된 경우 가장 많이 나온 데이터로 샘플링

smote=SMOTE(sampling_strategy='auto', random_state=7)

 

#재샘플링->.fit_resample

X_resample, y_resample=smote.fit_resample(X_train_scale, y_train)

 

  • 원본데이터와 오버샘플링 결과 비교

#원본 데이터/오버샘플링 개수 비교

 

print('원래 클래스별 수', Counter(y_train))

print('오버샘플링 후 클래스별 수', Counter(y_resample))

 

#클래스 수  173->282개로 늘어남

 

  • 오버샘플링 후 학습 및 예측

#오버샘플링 후 로지스틱 회귀모델(분류) 학습 및 예측

logi_model=LogisticRegression()

logi_model.fit(X_resample, y_resample)

logi_pre=logi_model.predict(X_test_scale)

 


'머신러닝' 카테고리의 다른 글

[ML]13. 자연어 처리  (0) 2023.09.06
[ML]11. 모델 정규화  (0) 2023.08.31
[ML]10. 선형회귀모델  (0) 2023.08.30
[ML]9. 분류평가지표  (0) 2023.08.29
[ML]8. 타이타닉호 생존자 예측 모델  (0) 2023.08.25