지도학습_k-최근접 이웃 , 선형모델(로지스틱,svm) , 나이브 베이즈 분류기

2018. 1. 3. 22:20ML(머신러닝)/BASIC

기준 scikit-learn package


나는 멀 해도 안먹히지만 Matplotlib에서한글 깨질 때 유용한 사이트 

-->  https://ansuchan.com/matplotlib-with-korean/


# 지도학습


# 입력과 출력 샘플이 있는 것

# 분류  /  회귀

# 분류 - 이진 분류, 다중 분류 

# 회귀 - 부동수소점수(실수)를 예측 


# k-최근접 이웃

# 가장 간단한 머신러닝 

# 장단점

# 2개의 중요한 매개변수 

# 1. 데이터 포인트 사의의 거리를 재는 방법

# 2. 이웃의 수 

# 다양한 거리를 재는 방식이 나와 있음

# 장점 : 1. 이해하기 쉬운 모델 

# 단점 : 전처리가 중요하다. , 예측이 느리고 특성 처리 부족 

# 이러한 단점 해결 모델 -> 선형 모델




## 선형 모델


# 모델 파라미터 w 와 b 를 학습하는 방법과 모델의 복잡도 제어하는 방법 차이가 난다.

# 선형 회귀 (최소제곱법)

# 평균제곱오차(mse) 최소화 하는 parameter W,b 찾기 

# 예측값과 타겟값의 차이를 제곱하여 더한후 샘플의 개수로 나눈다. 

# 장점 : 매개변수 없는 것이 장점 // 단점 : 그래서 모델의 복잡도 제어할 방법 x

# 모델이 적합하지 않을 경우 주로 복잡하지 않기 때문에 과소적합 잘 발생


from sklearn.linear_model import LinearRegression
X, y = mglearn.datasets.make_wave(n_samples=60)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)

lr = LinearRegression().fit(X_train, y_train)
print("훈련 세트 점수: {:.2f}".format(lr.score(X_train, y_train)))
print("테스트 세트 점수: {:.2f}".format(lr.score(X_test, y_test)))
훈련 세트 점수: 0.67
테스트 세트 점수: 0.66

# Ridge

# alpha 값에 따라 모델의 coef_ 속성이 어떻게 달라지는 조사해보면 

# 높은 alpha 의 경우 제약이 더 많은 모델이라서 작은 alpha 보다 coef_ 의 절대값의 크기가 더 작을 것 예상

# 데이터만 많이주면 ridge 와 선형 회귀 성능이 같아 진다.

# 데이터 많이 질수록 훈련 데이터 성능 감소 -> 데이터 증가 -> 모델이 데이터 기억 or 과대적합하기 어려워지기 때문


from sklearn.linear_model import Ridge

ridge = Ridge().fit(X_train, y_train)
print("훈련 세트 점수: {:.2f}".format(ridge.score(X_train, y_train)))
print("테스트 세트 점수: {:.2f}".format(ridge.score(X_test, y_test)))
훈련 세트 점수: 0.89
테스트 세트 점수: 0.75

https://nbviewer.jupyter.org/github/rickiepark/introduction_to_ml_with_python/blob/master/02-supervised-learning.ipynb




# Lasso


# 선형 회귀에 규제를 적용하는 데 Ridge의 대안책 -> Lasso

# Lasso 역시 계수를 0에 가깝게 하지만 방식은 다름 - L1 Norm penalty == 계수의 절대값의 합##

# L1 규제의 결과로 라쏘를 사용 할때 어떤 계수 정말로 " 0 " 이 된다.

# 완전히 제외한다는 특성이 생긴다 (Ridge 와의 차이점)

# 특성 선택(feature selection) 자동으로 이뤄진다와 같은 뜻이 될 수 있음

# 모델의 가장 중요한 특성이 먼지 드러내준다.

# 과소적합 되면 alpha를 줄여나가야 한다.  또 너무 낮추면 과대적합 된다.

# alpha 를 크게 하면 패널티 효과 커진다(가중치 감소) 작게하면 반대


from sklearn.linear_model import Lasso

lasso = Lasso().fit(X_train, y_train)
print("훈련 세트 점수: {:.2f}".format(lasso.score(X_train, y_train)))
print("테스트 세트 점수: {:.2f}".format(lasso.score(X_test, y_test)))
print("사용한 특성의 개수: {}".format(np.sum(lasso.coef_ != 0)))
훈련 세트 점수: 0.29
테스트 세트 점수: 0.21
사용한 특성의 개수: 4

https://nbviewer.jupyter.org/github/rickiepark/introduction_to_ml_with_python/blob/master/02-supervised-learning.ipynb


# scikit-learn 에서는 Ridge , Lasso , elastic-net(최상 하지만 제어해야하는 것이 L1, L2 둘다 조정해줘야함)





## 분류용 선형 모델 


# 방정식은 선형 회귀와 비슷하지만 가중치의 합을 그냥 사용하는 대신 예측값을 0과 비교

# 0보다 작으면 -1 크면 +1 

# 결정 경계가 입력의 선형 함수 입니다 = 선 평면, 초평면을 사용하여 두개의 클래스 구분

# 방법은 다양 

# 예) 1- 특정 계수와 절편의 조합이 훈련 데이터와 얼마나 적합한지 측정

# 2- 사용할 수 있는 규제가 있는지, 있다는 어떤 방식인지

# 선형 분류 대표 2가지

# 1. 로지스틱 회귀 / 2. 서포터 벡터 머신

# 기본적으로 2개는 Ridge - L2 규제를 사용한다.

# 규제 강도 결정하는 매개변수 C  / C 증가 -> 규제 감소 / C 감소 -> 가중치(W) 0에 가깝게

# 다른 설명 - 알고리즘은 C 값이 낮아지면 데이터 포인트 중 다수에 맞추려고 노력

#           - C 값을 높이면 정확하게 맞추려고 노력한다.

 


https://nbviewer.jupyter.org/github/rickiepark/introduction_to_ml_with_python/blob/master/02-supervised-learning.ipynb


lr_l1 = LogisticRegression(C=C, penalty="l1").fit(X_train, y_train)





# 로지스틱 회귀는 L2 규제 ## Ridge 와 유사하다. 0과는 가깝게 그러나 0은 아님

# 해석에 항상 신경을 써야 한다.

# 어떤 것이 c 에 따라 양수와 음수가 되는데 -> 따라서 이 변수는 양성이거나 음성 신호 모두 가능

# 더 이해하기 쉬운 모델 만들기 위해서는 -> L1 규제 사용하면 됨 




## 다중 클래스 분류형 선형 모델(SOFTMAX)


# 보편적으로는 일대다 방법 : 각 클래스를 다른 모든 클래스와 구분하도록 이진 분류 모델을 학습시킨다.

# 예측 할 때 모든 이진 분류기가 작동하여 가장 높은 점수로 내는 분류기의 클래스를 예측값으로 선택

# 다중 클래서 로지스틱 회귀에도 클래스마다 계수 벡터와 절편이 있다.

# SVM도 가능 # COEF_ 행 : 클래스 열: 특성(변수개수) 

# 이 영역의 어떤 포인트든 최종 분류긴느 클래스 0으로 분류할 것(구분선 위에 모두 클래스0 무리들이 위치해 있음)

# = 클래스 0 분류 신뢰도 공식의 결과는 0보다 크고 다른 두 클래스의 경우는 0보다 작을 것이다

# 중앙의 삼각형 : 세 분류기가 모두 나머지로 분류한 곳 

# 어떤 클래스로 분류 될지? -> 분류 공식의 결과가 가장 높은 클래스 즉 가장 가까운 직선의 클래스가 된다.



# 결론 :

    # 회귀 : ALPHA  분류: C :

        # ALPHA 클수록 C 작을 수록 -> 모델 단순 (이 매개변수 조정이 중요하다)

        # 보통 로그 스케일로 최적화 (0.1,0.01,...)

        # 그리고 L1 L2 규제 중 어떤거 사용할 지 정해야함

        # L1 : 중요한 특성이 많지 않다고 생각 될 때, 해석이 중요 할 때 사용(설명하기 수윔)

        # L2 : 기본적으로는 L2


# 결론

# 선형 모델은 학습 속도 빠르고 예측도 빠름 -> 큰 데이터 셋 or 희소한 데이터 셋에 잘 작동 

# 대용량 일시 logisticregression 과 ridge 에 "" solver="sag"  "" 옵션 사용

# 다른 대안 : SGDClassifier 과 SGDRegressor 사용 할 수 있다. (대용량 처리 할 시)

# 2. 비교적 쉽게 이해 가능  but 계수의 값이 왜그런지 명확하지 않을 경우 존재

# 데이터 특성이 서로 연관 되어 잇을 때 그렇다 

# 저차원일 때도 잘 되지만 다른 알고리즘이 일반화 성능이 더 좋음




## 나이브 베이즈 분류기


# 선형 모델과 유사

# LogisticRegression , LinearSVC 보다 속도는 빠름 대신 일반화 성능 조금 떨어짐

# 효과적인 이유

# 1. 각 특성을 개별로 취급하여 파라미터 학습하고 각 특성에서 클래스별 통계를 단순하게 취합

# scikit-learn - GaussianNB , BernoulliNB , MultinomialNB 

# GaussianNB : 연속적인 어떤 데이터 //

# BernoulliNB : 이진 데이터 //  MultinomialNB : count data(정수 카운트 ex 단어 횟수)

# BernoulliNB , MultinomialNB  => 주로 text 데이터 처리

# BernoulliNB : 각 클래스 특성 중 0이 아닌 것이 몇개인지 셉니다. 

# MultinomialNB : 클래스 별로 평균을 계산

# GaussianNB : 클래스 별로 각 특성의 표준편차와 평균을 저장

# 선형 모델 형태와 같지만 나이브 모델 coef_ 는 기울기 w라는 의미는 아니다 

# BernoulliNB , MultinomialNB : coef_ : 특성 카운트 수를 로그 변환한 형태 intercept_ 는 클래스 카운터 수를 로그 변환


# 장단점과 매개변수 ##

# BernoulliNB , MultinomialNB  모델 복잡도 조절하는 alpha 하나 존재 

# alpha 주어지면 -> 모든 특성에 양의 값을 가진 가상의 데이터 포인트를 alpha 개수 만큼 추가

# 효과 -> 통계데이터를 완만하게 해주는 역할

# alpha 크면 더 완만 , 모델 복잡도 낮아진다 //  alpha 가 크게 성능향상에는 기여 x

# GaussianNB : 매우 고차원 데이터셋에 사용 / 다른 두 모델은 희소한 데이터 카운트(text)

# MultinomialNB 은 보통 0이 아닌 특성이 비교적 많은 곳에서 BernoulliNB 보다 성능 좋음

# 매개변수에 민감하지 않고 학습시간이 빨라 선형모델 이전에 종종 사용한다.

728x90

'ML(머신러닝) > BASIC' 카테고리의 다른 글

지도 학습 알고리즘별 간단한 사용법 정리  (0) 2018.01.06
지도학습_ 커널 서포트 벡터 머신, 신경망  (0) 2018.01.06
문제와 데이터 이해하기  (0) 2018.01.03
기계학습  (0) 2018.01.02
경사하강법  (0) 2018.01.02