머신러닝_12_로지스틱 회귀모델
- 로지스틱 회귀모델: 선형모델 방식을 기반으로 이진분류(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 사이의 값으로 변환하여 이상치 제거→회귀모델에 주로 사용됨
예)이미지 데이터 분류
[손글씨 데이터 분류 실습]
- 문제정의
-손글씨 숫자(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 |