Language/Python

[Python] 4-2) 머신러닝 - 지도학습 알고리즘

생각하는 감쟈🥔 2023. 4. 13. 10:16

 

 

 

 

 19일차 (23.04.06)

 

 

✔ 2DAY

K-NN 알고리즘

K-NEIGHBORS REGRESSION 알고리즘

선형모델

릿지회귀

라쏘

분류용 선형모델

 


딥러닝 머신러닝 차이점

특징점을 사람이하느냐 스스로 하느냐 차이

 

k-최근접 이웃 회귀

mglearn.plots.plot_knn_regression(n_neighbors=1)
 
mglearn.plots.plot_knn_regression(n_neighbors=3)
 
from sklearn.neighbors import KNeighborsRegressor
X,y = mglearn.datasets.make_wave(n_samples=40)

X_train, X_test,y_train,y_test = train_test_split(X,y,random_state=0)
reg = KNeighborsRegressor(n_neighbors=3)
reg.fit(X_train, y_train)
 
print("테스트 세트 예측:\n", reg.predict(X_test))
print("테스트 세트 R^2: {:.2f}".format(reg.score(X_test, y_test)))
 
테스트 세트 예측:
 [-0.05396539  0.35686046  1.13671923 -1.89415682 -1.13881398 -1.63113382
  0.35686046  0.91241374 -0.44680446 -1.13881398]

테스트 세트 R^2: 0.83
 

K-NEIGHBORS REGRESSION 분석

fig,axes = plt.subplots(1,3,figsize=(15,4))
line = np.linspace(-3,3,1000).reshape(-1,1)

for n_neighbors, ax in zip([1,3,9], axes):
    reg=KNeighborsRegressor(n_neighbors=n_neighbors)
    reg.fit(X_train, y_train)
    ax.plot(line, reg.predict(line))
    ax.plot(X_train, y_train,'^',c=mglearn.cm2(0),markersize=8)
    ax.plot(X_test, y_test,'v',c=mglearn.cm2(1),markersize=8)
    
    ax.set_title(
        "{} 이웃의 훈련 스코어: {:.2f} 테스트 스코어 : {:.2f}".format(
        n_neighbors, reg.score(X_train, y_train),
        reg.score(X_test,y_test)))
    ax.set_xlabel("특성")
    ax.set_ylabel("타깃")
axes[0].legend(["모델 예측","훈련데이터/타깃","테스트 데이터/타깃"],loc="best")

 

 


선형모델

  • 최근 폭 넓게 연구되고 현재도 널리 쓰이는 모델
  • 입력 특성에 대한 선형 함수를 만들어 에측을 수행하는 방식

 

회귀의 선형 모델의 일반적 예측 함수

x[0] 부터 x[p]까지

  • 하나의 데이터 포인드에 대한 특성을 나타냄

 

특성의 개수 : p+1

w,b : 모델의 학습할 파라미터

y : 모델이 만들어낸 예측값

 

특성이 하나인 데인터 값(위 식 단순화)

 

직선의 방정식

w[0] : 기울기

b는 y축과 만나는절편

 

특성이 많아지면 w는 각 특성에 해당하는 기울기를 모두 가짐

  • 예측값은 입력 특성에 w의 각 가중치를 겁해서 더한 가중치의 합
  • 가중치는 음수일 수 있음

 

mglearn.plots.plot_linear_regression_wave()
 

 

선형 모델(최소제곱법)

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("lr.coef_:", lr.coef_)
print("lr.intercept_:", lr.intercept_)
 
lr.coef_: [0.39390555]
lr.intercept_: -0.031804343026759746
 
print("훈련 세트 점수 :{:.2f}".format(lr.score(X_train, y_train)))
print("테스트 세트 점수 :{:.2f}".format(lr.score(X_test, y_test)))
 
훈련 세트 점수 :0.67
테스트 세트 점수 :0.66
 
X,y = mglearn.datasets.load_extended_boston()

X_train, X_test,y_train,y_test = train_test_split(X,y,random_state=0)
lr=LinearRegression().fit(X_train,y_train)
 
print("set:{:.2f}".format(lr.score(X_train,y_train)))
print("dataset:{:.2f}".format(lr.score(X_test,y_test)))
 
set:0.95
dataset:0.61
 

리지 회귀

릿지도 화귀를 위한 선형 모델

  • 최소적합법에서 사용한 것과 같은 예측 함수를 사용
  • 가중치의 선택
    • 훈련 데이터를 잘 예측하기 위한 목적
    • 추가 제약 조건을 만족 시키기 위한 목적
  • L2규제
    • 과대적합이 되지 않도록 모델을 강제로 제한
    • 가중치의 절대값을 가능한 한 작게 만드는 것
    • w의 모근 원소가 0에 가깝게 하기
    • 모든 특성이 출력에 주는 영향을 최소화

 

from sklearn.linear_model import Ridge

ridge = Ridge().fit(X_train,y_train)
print("set score :{:.2f}".format(ridge.score(X_train,y_train)))
print("test score :{:.2f}".format(ridge.score(X_test,y_test)))
 
set score :0.89
test score :0.75
 
ridge10=Ridge(alpha=10).fit(X_train, y_train)
print("set score :{:.2f}".format(ridge10.score(X_train,y_train)))
print("test score :{:.2f}".format(ridge10.score(X_test,y_test)))
 
set score :0.79
test score :0.64
 
ridge01=Ridge(alpha=0.1).fit(X_train, y_train)
print("set score :{:.2f}".format(ridge01.score(X_train,y_train)))
print("test score :{:.2f}".format(ridge01.score(X_test,y_test)))
 
set score :0.93
test score :0.77
 
plt.plot(ridge10.coef_,'^',label="Ridge alpha=10")
plt.plot(ridge.coef_,'s',label="Ridge alpha=1")
plt.plot(ridge01.coef_,'v',label="Ridge alpha=0.1")

plt.plot(lr.coef_,'o',label="LinearRegression")
plt.xlabel("계수목록")
plt.ylabel("계수크기")
xlims=plt.xlim()
plt.hlines(0,xlims[0],xlims[1])
plt.xlim(xlims)
plt.ylim(-25,25)
plt.legend()
 

규제 효과의 이해

  • alpha 값을 고정하고 훈련 데이터의 크기 조절
mglearn.plots.plot_ridge_n_samples()
 

학습 곡선

데이터 셋 크기에 따른 모델의 성능 변화 그래프

  • 둘다 훈련 세트의 점수가 데스트 세트의 점수 보다 높음
  • 규제가 적용돤 릿지
    • 훈련 데이터 점ㅎ수가 선형 회귀의 훈련 데이터 보다 점수가 맞음
    • 데스트 데이터에서는 릿지 점수가 높음
    • 데이터 셋이 적을 경우 차이는 더 크게 나타남

 

선형회귀는 데이터셋이 작을 경우 릿지보다 학습 성능이 낮음

  • 데이터셋 크기가 400미만에서 어떤한 것도 학습하지 못합
  • 두 모델 모두 데이터가 많을 수록 성능이 좋아짐
  • 데이털가 충분하게 되면 ㄹ릿지 회귀와 선형 회귀의 성능은 같아 짐
    • 상대적으로 규제 항은 덜 중요해지기 때문

라소

L1 규제의 라쏘

  • 선형 회귀와 같이 계수를 적용하는 또 다른 방법
  • 릿지 회귀와 같이 걔수를 0에 가깝게 해서 규제하는 방식
  • 계수가 0이 되는 특성
    • 모델에서 완전히 제외 됨
    • 자동으로 특성이 선택된다고 볼 수 있음
  • 일부 계수를 0을 만들면 이해하기 쉬워짐
    • 이 모델의 가장 중요한 특성의 파악이 용이함

 

 

과소접합

from sklearn.linear_model import Lasso

lasso = Lasso().fit(X_train,y_train)
print("set score :{:.2f}".format(lasso.score(X_train,y_train)))
print("test score :{:.2f}".format(lasso.score(X_test,y_test)))
print("num :",np.sum(lasso.coef_ !=0))
 
set score :0.29
test score :0.21
num : 4
 

alpha 값 줄여 보기

  • 과소적합을 줄이기 위한 목적
  • max_intr 값 늘리기
lasso001 = Lasso(alpha=0.01,max_iter=50000).fit(X_train,y_train)
print("set score :{:.2f}".format(lasso001.score(X_train,y_train)))
print("test score :{:.2f}".format(lasso001.score(X_test,y_test)))
print("num :",np.sum(lasso001.coef_ !=0))
 
set score :0.90
test score :0.77
num : 33
 

alpha 값을 너무 낮추면 규제의 효과가 없음

  • 규제가 지나치게 낮으면 효과가 없어져 과대적합
lasso0001 = Lasso(alpha=0.0001,max_iter=50000).fit(X_train,y_train)
print("set score :{:.2f}".format(lasso0001.score(X_train,y_train)))
print("test score :{:.2f}".format(lasso0001.score(X_test,y_test)))
print("num :",np.sum(lasso0001.coef_ !=0))
 
set score :0.95
test score :0.64
num : 96
 

alpha 값이 다른 모델을의 계수

plt.plot(lasso.coef_,'^',label="Ridge alpha=1")
plt.plot(lasso001.coef_,'s',label="Ridge alpha=0.01")
plt.plot(lasso0001.coef_,'v',label="Ridge alpha=0.0001")

plt.plot(ridge.coef_,'o',label="Ridge alpha=0.1")
plt.legend(ncol=2,loc=(0,1.05))
plt.ylim(-25, 25)
plt.xlabel("계수목록")
plt.ylabel("계수크기")
 

 

라쏘 vs 릿지

alpha = 1 : 걔수 대부분이 0, 나머지 계수들도 작음

alpha = 0.01 : 줄이면 대부분의 특성이 0이 되는 분포

alpha = 0.0001 : 계수 대부분이 0이아니고, 값도 켜져 규제없는 모델

alpha = 0.1 : Ridge모델은 alpha=0.01인 라쏘 모델과 비슷한 성능

Ridge를 사용하면 어떤 계수도 0이 되지 않음

 

일반적으로 라쏘보다 릿지 회귀 선호

  • 특성이 많고 그 중 일부분만 중요한 경우 라쏘 사용
    • 특성을 줄이고 중요한 특성을 파악할 수 있음
    • 분석하기 쉬운 모델
  • scikit-lean
    • Lasso와 Ridge의 페널티를 결합한 ElasticNet제공
    • 실제 최상의 성능 발휘
    • L1 규제, L2 규제를 위한 매게변수 2개를 조정해야 함

 

from sklearn.linear_model import QuantileRegressor
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)

pred_up =QuantileRegressor(quantile=0.9, alpha=0.01).fit(X_train,y_train).predict(X_test)
pred_med =QuantileRegressor(quantile=0.5, alpha=0.01).fit(X_train,y_train).predict(X_test)
pred_low =QuantileRegressor(quantile=0.1, alpha=0.01).fit(X_train,y_train).predict(X_test)

plt.scatter(X_train, y_train, label="data")
plt.scatter(X_test, y_test, label="test data")

plt.plot(X_test, pred_up, label='백분위:0.9')
plt.plot(X_test, pred_med, label='백분위:0.5')
plt.plot(X_test, pred_low, label='백분위:0.1')
plt.legend()
plt.show()
 

 


분류용 선형 모델

이진분류

  • 분류에 널리 사용되는 선형모델
    • 분류에 널리 사용되는 선형모델
    • 선, 평면,초평면을 사용해서 두개의 클래스를 구분하는 분류기
  • 이진 분류 예측방정식
    • 선형 회귀와 유사
    • 특성들의 합을 그냥 사용하지 않고 예측한 값을 임계치 0과 비교
    • 함수에서 계산한 값
    • 모든 분류용 선형모델에서 동일한 규칙

 

두 가지 형태의 학습 알고리즘

  • 성능 측정 방법
    • 특정 계수와 절편의 조합이 훈련 데이토에 얼마나 잘 맞는지 측정
  • 사용 가능한 규제 방식
    • 규제를 통한 과대 적합 방식

 

가장 널리 알려진 2개 알고리즘

  • 로지스틱 회귀
    • inear_model.LogisticRegressiom에 구현
    • 이름에 회귀가 있지만 회귀 알고리즘이 아니라 분류알고리즘- LInearRegression 혼동 주의
  • 서포트 백터 머산
    • svm.LinearSVC에 구현된 선향 알고리즘

 

from sklearn.linear_model import LogisticRegression
from sklearn.svm import LinearSVC
X,y = mglearn.datasets.make_forge()

fig, axes = plt.subplots(1, 2, figsize=(10, 3))

for model, ax in zip([LinearSVC(), LogisticRegression()], axes):
    clf = model.fit(X, y)

    mglearn.plots.plot_2d_separator(clf, X, fill=False, eps=0.5,
                                    ax=ax, alpha=.7)
    mglearn.discrete_scatter(X[:, 0], X[:, 1], y, ax=ax)
    ax.set_title("{}".format(clf.__class__.__name__))
    ax.set_xlabel("특성 0")
    ax.set_xlabel("특성 1")
axes[0].legend()

 
mglearn.plots.plot_linear_svc_regularization()
 
  • 아주 작은 C : 많은 규제 적용
  • 클래스 0의 대부분은 아래에, 클래수 1의 대부분은 위애 있음
  • 비교적 수평에 가까운 결정 경계생성
  • 잘못 분류한 데이터 포인트
  • 조금 큰 C : 적어진 규제 적용
  • 잘못 분류한 두 샘플에 민감
    • 결정 경계까 기울어잠
  • 아주 큰 C : 규제가 없어진 모델
  • 결정 경계는 더 기울고, 클래스 0의 모든 데이터 포인트를 올바로 분류
  • 모든 포인트를 직선으로는 완벽히 분류할 수 없음
  • 정확하게 분류하려고 했으나 전체 배치 파악 실패
  •  

낮은 차원의 데이터에 대한 결정 경계

  • 직선이거나 평면으로 매우 제한적이 것 처럼 보임
  • 고차원에서는 매우 강력해짐
  • 단, 특성이 많아지면 과대적합 되지 않도록 하는 것이 매우 중요

C값 규제 관계 그래프

C값이 높아지면 규제가 감소!!!! <-> 규제를 높일려면 C값 낮추기!!

 

높은 정확도 출력

  • 기본값이 C=1이 훈련 세트와 테스트 세트 양쪽 95% 성능
  • 훈련 세트와 데스트 세트의 성능이 매우 비슷함
    • 제약이 너무 높아 과소적합 됨

 

 

유방암 데이터

from sklearn.datasets import load_breast_cancer
cancer = load_breast_cancer()
X_train, X_test, y_train, y_test = train_test_split(
 cancer.data, cancer.target, stratify=cancer.target, random_state=42)
logreg = LogisticRegression().fit(X_train, y_train)
print("훈련 세트 점수: {:.3f}".format(logreg.score(X_train, y_train)))
print("테스트 세트 점수: {:.3f}".format(logreg.score(X_test, y_test)))
 
훈련 세트 점수: 0.946
테스트 세트 점수: 0.965
 
logreg100 = LogisticRegression(C=100, max_iter=5000).fit(X_train, y_train)
print("훈련 세트 점수: {:.3f}".format(logreg100.score(X_train, y_train)))
print("테스트 세트 점수: {:.3f}".format(logreg100.score(X_test, y_test)))
 
훈련 세트 점수: 0.951
테스트 세트 점수: 0.958
 
logreg001 = LogisticRegression(C=0.01, max_iter=5000).fit(X_train, y_train)
print("훈련 세트 점수: {:.3f}".format(logreg001.score(X_train, y_train)))
print("테스트 세트 점수: {:.3f}".format(logreg001.score(X_test, y_test)))
 
훈련 세트 점수: 0.937
테스트 세트 점수: 0.930
 
plt.plot(logreg100.coef_.T, '^', label="C=100")
plt.plot(logreg.coef_.T, 'o', label="C=1")
plt.plot(logreg001.coef_.T, 'v', label="C=0.001")
plt.xticks(range(cancer.data.shape[1]), cancer.feature_names, rotation=90)
xlims = plt.xlim()
plt.hlines(0, xlims[0], xlims[1])
plt.xlim(xlims)
plt.ylim(-5, 5)
plt.xlabel("특성")
plt.ylabel("계수 크기")
plt.legend()
 
for C, marker in zip([0.001, 1, 100], ['o', '^', 'v']):
    lr_l1 = LogisticRegression(solver='liblinear',C=C, penalty="l1",max_iter=1000).fit(X_train, y_train)
    print("C={:.3f} 인 l1 로지스틱 회귀의 훈련 정확도: {:.2f}".format(
        C, lr_l1.score(X_train, y_train)))
    print("C={:.3f} 인 l1 로지스틱 회귀의 테스트 정확도: {:.2f}".format(
        C, lr_l1.score(X_test, y_test)))
    plt.plot(lr_l1.coef_.T, marker, label="C={:.3f}".format(C))


plt.xticks(range(cancer.data.shape[1]), cancer.feature_names, rotation=90)
xlims = plt.xlim()
plt.hlines(0, xlims[0], xlims[1])
plt.xlim(xlims)
plt.xlabel("특성")
plt.ylabel("계수 크기")
plt.ylim(-5, 5)
plt.legend(loc=3)
 
C=0.001 인 l1 로지스틱 회귀의 훈련 정확도: 0.91
C=0.001 인 l1 로지스틱 회귀의 테스트 정확도: 0.92
C=1.000 인 l1 로지스틱 회귀의 훈련 정확도: 0.96
C=1.000 인 l1 로지스틱 회귀의 테스트 정확도: 0.96
C=100.000 인 l1 로지스틱 회귀의 훈련 정확도: 0.99
C=100.000 인 l1 로지스틱 회귀의 테스트 정확도: 0.98
 

이진 분류용 선형 모델

  • 회귀용 선형모델은 매우 유사함
  • 모델들의 주요 처이는 규제의 설정에 따름

 

penalt 매개변수

  • 규제에서 모든 특성을 이용하지 일부 특성을 사용할지 결정하는 매개변수

 


다중클래스 분류용 선형 모델

 

이진분류만 지원

  • 로지스틱 회귀만 제외하고 선형 분류 모델은 이진 분류만 지원
  • 다중 틀래스를 지원하지 않음

 

일대다 방식을 이용한 다중클래스 지원 가능

  • 이진 분류 알고리즘을 다중 클래스 분류 알고리즘으로 확장하는 보편적 기범
  • 각 클래스를 다른 모든 클래스와 구분하도록 이진 분류 모델 학습
  • 클래스의 수 만큼 이진 분류 모델 생성
  • 예측 시에는 모든 이진 분류기가 작동
    • 가장 높은 점수를 내는 분류기의 클래스 선택하는 방식

 

클래스별 이빈 분류기의 생성

  • 각 클래스가 계수 벡터(w)와 절편(b)를 하나씩 가짐
  • 분류 신로도를 나타내는 다음 공식의 결과 값
    • 가장 높은 클래스가 해당 데이터의 클래스 레이블로 할당

다중 클래스 로지스택 회귀

  • 일대다 방식과 다른 수학 방식 사용
  • 동일하게 클래스 마다 하나의 걔수 벡터와 절편 생성
  • 동일한 예측 방식

 

세 개의 클래스를 가진 간단한 데이터 셋에 일대다 방식 적용하기

  • 2차원 데이터 셋
  • 각 클래스의 데이터는 정규분포(가우시안 분포)를 따름

 

from sklearn.datasets import make_blobs
X, y = make_blobs(random_state=42)
mglearn.discrete_scatter(X[:, 0], X[:, 1], y)
plt.xlabel("특성 0")
plt.ylabel("특성 1")
plt.legend(["클래스 0", "클래스 1", "클래스 2"])
 
linear_svm = LinearSVC().fit(X, y)
print("계수 배열의 크기: ", linear_svm.coef_.shape)
print("절편 배열의 크기: ", linear_svm.intercept_.shape)
 
계수 배열의 크기:  (3, 2)
절편 배열의 크기:  (3,)
 
mglearn.discrete_scatter(X[:, 0], X[:, 1], y)
line = np.linspace(-15, 15)
for coef, intercept, color in zip(linear_svm.coef_, linear_svm.intercept_,
 mglearn.cm3.colors):
 plt.plot(line, -(line * coef[0] + intercept) / coef[1], c=color)
plt.ylim(-10, 15)
plt.xlim(-10, 8)
plt.xlabel("특성 0")
plt.ylabel("특성 1")
plt.legend(['클래스 0', '클래스 1', '클래스 2', '클래스 0 경계', '클래스 1 경계',
 '클래스 2 경계'], loc=(1.01, 0.3))
 

실행결과 분석 )

실행결과 분석1 / 2

훈련 데이터의 클래스 0의 모든 포인트
  • 클래스 0을 구분하는 직선 위에 위치
    • 이진 분류기가 만든 클래스 0 지역


  • 클래스 2를 구분하는 직선 위
    • 클래스 2의 이진 분류기의 나머지 지역


  • 클래스 1을 구분하는 직선 왼쪽
    • 클래스 1의 이진 분류기의 나머지 지역


  • 이 영역의 어떤 포인트든 최종 분류기는 클래스 0으로 분류
    • 클래스 0분류 신뢰도 공식의 결과는 0보다 크다
      • 다른 두 클래스의 경우는 0보다 작다
중앙의 삼각형 영역


  • 세 분류기가 모두 나머지로 분류
  • 이 곳 데이터 포인트의 분류
    • 분류 공식의 결과가 가장 높은 클래스로 분류
    • 가장 가까운 직선의 클래스
mglearn.plots.plot_2d_classification(linear_svm, X, fill=True, alpha=.7)
mglearn.discrete_scatter(X[:, 0], X[:, 1], y)
line = np.linspace(-15, 15)
for coef, intercept, color in zip(linear_svm.coef_, linear_svm.intercept_,
 mglearn.cm3.colors):
 plt.plot(line, -(line * coef[0] + intercept) / coef[1], c=color)
plt.legend(['클래스 0', '클래스 1', '클래스 2', '클래스 0 경계', '클래스 1 경계',
 '클래스 2 경계'], loc=(1.01, 0.3))
plt.xlabel("특성 0")
plt.ylabel("특성 1")
 

3개의 일대다 분류기가 만든 다중 클래스 결정 경계

  • 공동 구역에 있는 포인트는 가까운 직선의 분류에 포함
  • 영역이 3개 클래스에 맞게 분류됨

 

 

선형 모델의 주요 매개변수

  • 회귀 모델의 주요 매개변수
    • alpha값이 클수록 단순화
    • alpha 값을 조정하는 일이 매우 중요
  • LinearSVC와 LInearRegression에서는 c
    • c값이 작을 수록 단순화
  • c와 alpha의 최적치 정하기
    • 보통 로그 스케일로 최적치 산출
    • 이후 L1 규제를 사용할지 L2 규제를 사용할지 결정
      • 기본적으로 l2규제 사용
    • L1 규제는 모델의 해석이 중요한 요소일 때도 사용 가능
      • 몇 가지 특성만으로 사용하므로 중요한 특성 파악 및 효과 이해 용이

 

빠른 학습 속도와 예측 속도

  • 매우 큰 테이터셋과 희소한 데이터셋에서도 잘 작동
  • 수십마에서 수백만개으 샘플로 이루어진 대용량 데이터셋
    • LInearRegression과 Ridge에 solver='sag' 옵션 사용하는 방법
      • 기본 설정 보다 빨리 처리 가능
    • 대용량 처리 버전의 선형 모델 사용하는 방법
      • SDGClassifier
      • SDGRegressor

 

선형 모델의 장 단점

  • 공식을 사용해 예측 과정을 비교적 쉽게 이해
    • 하지만 개수의 값들에 대해 이해할기 어려우 수 있음
    • 데이터 셋의 특성들 간에 연관이 있으 경우 분석의 어려움
  • 샘플에 비해 특성이 많을 때 적합한 모델
    • 다른 모델로 학습하기 어려운 매우 큰 데이터셋에도 선형 모델 다수 사용
    • 저차원의 데이터셋은 다른 모델의 일반화 성능이 더 좋음

 

 

 

 

#ABC부트캠프 #부트캠프 #유클리드소프트 #파이썬 #고용노동부 #한국산업인력공단 #청년친화형 #ESG지원사업 #대전 #서포터즈 #python #Ai #Bigdata #cloud #대외활동 #대학생 #daily