모도리는 공부중

21.01.11. 머신러닝 - lasso, ridge, 선형 분류 모델 본문

K-디지털 빅데이터 분석서비스 개발자과정 20.11.02~21.04.12/PYTHON(웹크롤링, 머신·딥러닝)

21.01.11. 머신러닝 - lasso, ridge, 선형 분류 모델

공부하는 모도리 2021. 1. 11. 12:59
728x90
반응형

어제 수업에 이어서 -

 

  규제 강화 (alpha)
Lasso 일부특성 사용x
Ridge 모든특성 사용

이러한 이유로 모든 특성을 사용하는 Ridge모델이 일반적으로 점수를 더 잘 내는 특징을 가지고 있다.

 

# alpha = 1
ridge = Ridge(alpha = 1)
ridge.fit(extend_X_train, y_train)
print('train score : ',ridge.score(extend_X_train,y_train))
print('test score : ',ridge.score(extend_X_test,y_test))

# 사용한 특성의 개수
print('사용한 특성의 개수 : ',np.sum(ridge.coef_!=0))

out :

train score : 0.9187927699238897

test score : 0.9121389207829017

사용한 특성의 개수 : 182

→ 규제를 1로 준 것이 가장 일반화가 잘된 상태임을 알 수 있다.

 

# alpha = 100
ridge = Ridge(alpha = 100)
ridge.fit(extend_X_train, y_train)
print('train score : ',ridge.score(extend_X_train,y_train))
print('test score : ',ridge.score(extend_X_test,y_test))

# 사용한 특성의 개수
print('사용한 특성의 개수 : ',np.sum(ridge.coef_!=0))

out :

train score : 0.8980910657371644

test score : 0.9046632523652257 ← 찍은 것 중에 맞힌게 더 많은 상황. 과소적합.

사용한 특성의 개수 : 182

 

# alpha = 0.001
ridge = Ridge(alpha = 0.001)
ridge.fit(extend_X_train, y_train)
print('train score : ',ridge.score(extend_X_train,y_train))
print('test score : ',ridge.score(extend_X_test,y_test))

# 사용한 특성의 개수
print('사용한 특성의 개수 : ',np.sum(ridge.coef_!=0))

out :

train score : 0.9280749930098602

test score : 0.8959170601911298

사용한 특성의 개수 : 182

→ train에 너무 많은 학습을 시켜 과대적합 발생

 

 

 

 


 

선형 분류 모델

 

 

분류용 선형 모델

  • y = 𝒘𝟏𝒙𝟏 + 𝒘𝟐𝒙𝟐 + 𝒘𝟑𝒙𝟑 + ⋯ + 𝒘𝒑𝒙𝒑 + 𝒃 >  𝟎
  • 특성들의 가중치 합이 0보다 크면 class+1 (양성클래스)
  • 0보다 작다면 클래스를 -1 (음성클래스)분류한다.
  • 분류용 선형모델은 결정 경계가 입력의 선형함수
  • 일대다 방법을 통해 다중 클래스 분류

 

Logistic Regression (분류모델)

  • 회귀공식을 사용해서 Regression이라는 이름이 붙음
  • 결정 경계가 선형이기 때문에 선형 모델
  • 새로운 관측치가 왔을 때 기존 범주중 하나로 예측할 때 사용
  • 시그모이드 함수의 최적선을 찾고 반환값을 확률로 간주
  • 비용함수로 시그모이드 함수 채택
  • 선형 함수의 결과 값을 Sigmoid Function(Logistic Function)을 이용해 0과 1로 변환한다.

 

주요 매개변수(Hyperparameter)

  • 선형 분류 모델 : C (값이 클수록 규제가 약해진다.)
  • 기본적으로 L2규제를 사용, 하지만 중요한 특성이 몇 개 없다면 L1규제를 사용해도 무방 (주요 특성을 알고 싶을 때 L1 규제를 사용하기도 한다.)

 

 

규제가 강해지면 특성이 작아지고 ( c = 0.010000 )

규제가 약해지면 특성이 많아진다 ( c = 1000.000000 )

 

 

Support Vector Machine (SVM)

  • 회귀 선형 모델 : alpha (값이 클수록 규제가 강해진다.)
  • 선형 분류 모델 : C (값이 클수록 규제가 약해진다.)
  • 기본적으로 L2규제를 사용, 하지만 중요한 특성이 몇 개 없다면 L1규제를 사용해도 무방. (주요 특성을 알고 싶을 때 L1 규제를 사용하기도 한다.)

 

  • 선형 모델은 학습 속도가 빠르고 예측도 빠르다.
  • 매우 큰 데이터 세트와 희소 (sparse)한 데이터 세트에서도 동작한다.
  • 특성이 많을 수록 더욱 잘 동작한다.
  • 저차원(특성이 적은)데이터에서는 다른 모델이 더 좋은 경우가  많다.

 


 

독버섯 데이터 분류 실습

import pandas as pd
data = pd.read_csv('mushroom.csv')
data.head()

버섯의 특징을 활용해 독 / 식용 버섯을 분류

# 결측치 확인
data.info()
# 학습용 데이터이기 때문에 결측치는 x.
# 하지만 바로 사용할 수 없음. why? - Dtype
# type이 object로, 전체 다 수치형이 아닐 가능성이 높음.
# 원핫 인코딩을 통해 수치화 필요.

데이터 셋 분리

X = data.drop('poisonous',axis=1)
y = data['poisonous']
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X,y,
                                                    random_state=3,
                                                    test_size=0.3)
# 원핫인코딩
X_train_onehot = pd.get_dummies(X_train)
X_test_onehot = pd.get_dummies(X_test)
X_train_onehot.shape,X_test_onehot.shape

out : ((5686, 117), (2438, 116))

 

train과 test를 봐서 없는 컬럼 찾기

# train에는 있고 test에는 없는 컬럼
set(X_train_onehot) - set(X_test_onehot)

out : {'cap-shape_c'}

# test에는 있고 train에는 없는 컬럼
set(X_test_onehot)-set(X_train_onehot)

out : set()

# 없는 컬럼 생성
# 어차피 없는 값이기 때문에 0으로 값을 채워도 무방.
X_test_onehot['cap-shape_c'] = 0
# 특성의 순서 맞추기
# sort_index()
X_train_onehot = X_train_onehot.sort_index(axis=1)
X_test_onehot = X_test_onehot.sort_index(axis=1)

모델링

from sklearn.linear_model import LogisticRegression
from sklearn.svm import LinearSVC	#linear support vector machine에서 분류모델을 가져온 것.
logi_model = LogisticRegression()
svc_model = LinearSVC()

 


 

분류 평가 지표

 

Confusion_matrix

 

N과 P는 예측, T는 True, F는 False.

 

  • 정확도(Accuracy) : 전체 중에 정확히 맞힌 비율

 

100명 중 암 환자는 5명

 

  • 재현율(Recall) : 실제 양성 중에 예측 양성 비율

100명 중 암 환자는 5명

 

  • 정밀도(Precision) : 예측 양성 중에 실제 양성 비율

  • F1 - score : 정밀도와 재현율의 조화평균

 

 

  • 낮은 재현율보다 높은 정밀도를 선호하는 경우 - 실제 N을 P라고 판단하면 안되는 경우
    • 어린아이에게 안전한 동영상(양성)을 걸러내는 분류기를  훈련시킬 경우 좋은 동영상이 많이 제외되더라도(낮은 재현율안전한 것들만 노출시키는(높은 정밀도) 분류기가 좋다.
  • 낮은 정밀도보다 높은 재현율을 선호하는 경우 - 실제 P를 N이라고 판단하면 안되는 경우
    • 감시 카메라로 좀도둑(양성)을 잡아내는 분류기를 훈련시킬 경우 경비원이 잘못된 호출을 종종 받지만(낮은 정밀도) 거의 모든 좀도둑을 잡는(높은 재현율) 분류기가 더 좋다.

ROC curve

 

최적의 규제값(C) 찾기

logi_model = LogisticRegression(C = 10)
logi_model.fit(X_train_onehot,y_train)
print(logi_model.score(X_train_onehot,y_train))
print(logi_model.score(X_test_onehot,y_test))

out :

svc_model = LinearSVC(C = 0.1)
svc_model.fit(X_train_onehot,y_train)
print(svc_model.score(X_train_onehot,y_train))
print(svc_model.score(X_test_onehot,y_test))

out : 1.0 1.0

from sklearn import metrics

# 예측값
# predict

pre = svc_model.predict(X_test_onehot)

print(metrics.classification_report(pre,y_test))
# micro avg : 정답에 대해 빈도로 평균 구함(micro와 macro 같을 경우 안 나오는 경우도 있음)
# macro avg : 정답에 대해 비율로 평균 구함

out : 

 

728x90
반응형
Comments