티스토리 뷰

반응형

데이터 생성 > 모델 훈련 > 회귀선 그래프 확인 순서로 진행

 

선형 회귀 모델

https://www.kaggle.com/werooring/ch5-linear-regression

import numpy as np
import matplotlib.pyplot as plt

np.random.seed(0) # 시드값 고정

w0 = 5 # y절편
w1 = 2 # 회귀계수
noise = np.random.randn(100, 1) # 노이즈 ①

x = 4 * np.random.rand(100, 1) # 0~4 사이 실숫값 100개 생성 (x값) ②
y = w1*x + w0 + noise # y값

plt.scatter(x, y);

 

np.random.randn(100, 1)은 표준 정규분포를 따르는 데이터 100개를 생성하는 코드

 

np.random.rand(100, 1)은 0~1 사이의 무작위 값을 100개 생성. 독립변수 x값 100개를 만드는 코드

 

w1이 높아지면 높아질수록 그래프가 선으로 모이게 된다. 왜냐하면 스케일이 커지기 때문.

 

모델 훈련

from sklearn.linear_model import LinearRegression

linear_reg_model = LinearRegression() # 선형 회귀 모델
linear_reg_model.fit(x, y) # 모델 훈련

print('y절편(w0):', linear_reg_model.intercept_ ) # ①
print('회귀계수(w1):', linear_reg_model.coef_ ) # ②

y절편(w0): [5.09772262]
회귀계수(w1): [[1.9808382]]

 

y절편 값은 intercept_에, 회귀계수 값은 coef에 저장되어 있다.

 

예측 모델의 y절편은 5.0977이고 회귀계수는 1.9808로 예측되었다.

.fit()으로 훈련시킨다.

 

회귀선 확인

회귀선 확인은 .predict로 (이게 intercept와 coef 값)

y_pred = linear_reg_model.predict(x) # 모델의 예측

plt.scatter(x, y)
plt.plot(x, y_pred); # 선형 회귀선 그리기

 

로지스틱 회귀 모델

 

선형 회귀 방식을 응용해 분류에 적용한 모델.

이진 분류 문제에 로지스틱 회귀를 사용할 수 있다.

 

시그모이드 함수 사용

P= 1/ (1+e^(-x))

 

x가 0에 가까울수록 y는 0.5에 가깝고, x가 양수로 커질수록 1, x가 음수로 작아질수록 0에 가까워진다.

표준 정규분포 함수의 양쪽을 0과 1로 가깝도록 바꾼것이라 보면 된다.

 

예측도 간단. p<0.5일 때 0, p>= 0.5 일때 1.

 

sklearn에서 제공하는 회귀 모델은 LogisticRegression

다른 것과 마찬가지로 predict 함수로 예측하고, predict_proba() 함수로 타깃값일 확률을 예측.

 

결정 트리

데이터를 대분류로 구분해서 따라 내려가는 트리.

 

1. 데이터를 가장 잘 구분하는 조건을 정한다.

2. 조건을 기준으로 데이터를 두 범주로 나눈다.

3.나뉜 각 범주의 데이터를 또 구분하는 조건을 정해 나눈다..

4. 계속 분할해서 최종 결정 값을 구한다.

 

뿌리 노드(root node) - 맨 위의 노드

중간 노드 - 중간 층의 노드

말단 노드(leaf node) - 마지막 결정 값이 담긴 노드

 

트리 그림이 잎사귀가 뻗어나간다고 생각하면 편할것이다.

 

결정 트리 분할 방식

분할 할때는 분할 조건이 중요하다.

어떤 조건으로 분할하는지에 따라 트리 모양과 효율이 달라진다.

 

노드 내 데이터의 불순도를 최소화하는 방향으로 분할.

불순도 : 분리 되었을 때 다른 범주가 얼마나 섞여있는지에 대한 정도

 

불순도 지표로는 엔트로피와 지니 불순도.

 

엔트로피 - 한 종류만 있다면 0, 서로 다른 데이터의 비율이 비등해질수록 엔트로피는 1.(바둑돌이 50:50비율)

엔트로피가 클수록 불순도가 높고, 작을수록 불순도도 낮다.

1에서 엔트로피를 뺀 수치를 정보 이득이라고 하는데, 결정 트리는 정보 이득을 최대화하는 방향(엔트로피를 최소화하는 방향)으로 노드를 분할한다.

 

지니 불순도 - 엔트로피와 비슷한 개념

 

결정 트리 구현

사이킷런으로 결정 트리를 구현할 수 있습니다.

분류용 모델은 DecisionTreeClassifier, 회귀용 모델은 DecisionTreeRegressor입니다.

 

  • criterion : 분할 시 사용할 불순도 측정 지표
    • ‘gini’를 전달하면 지니 불순도를 활용해 분할
    • ‘entropy’를 전달하면 정보 이득 방법으로 분할
    • 기본값 = ‘gini’
  • max_depth : 트리의 최대 깊이
    • max_depth를 규정하지 않으면 모든 말단 노드의 불순도가 0이 되거나 노드에 있는 데이터 수가 min_samples_split보다 작을 때까지 트리 깊이가 깊어짐
    • 기본값 = None
  • min_samples_split : 노드 분할을 위한 최소 데이터 개수
    • 노드 내 데이터 개수가 이 값보다 작으면 더 이상 분할하지 않음
    • 정수형으로 전달하면 최소 데이터 개수를 의미함
    • 실수형으로 전달하면 전체 데이터 개수 중 최소 데이터 개수 비율을 의미. 예를 들어, 전체 데이터 개수가 100개인데 min_samples_split을 0.1로 지정했다면 10개가 노드 분할을 위한 최소 데이터 개수가 됨
    • 기본값 = 2
  • min_samples_leaf : 말단 노드가 되기 위한 최소 데이터 개수
    • 분할 후 노드 내 데이터 개수가 이 값보다 작으면 더 이상 분할하지 않음
    • 정수형으로 전달하면 최소 데이터 개수를 의미
    • 실수형으로 전달하면 전체 데이터 개수 중 최소 데이터 개수 비율을 의미
    • 기본값 = 1
  • max_features : 분할에 사용할 피처 개수
    • 정수형으로 전달하면 피처 개수를 의미
    • 실수형으로 전달하면 전체 피처 개수 중 분할에 사용될 피처 개수 비율을 의미
    • ‘auto’나 ‘sqrt’를 전달하면 sqrt(전체 피처 개수)가 분할에 사용될 피처 개수임
    • ‘log2’를 전달하면 log₂(전체 피처 개수)가 분할에 사용될 피처 개수임
    • None을 전달하면 전체 피처를 분할에 사용
    • 기본값 = None

 

결정 트리에 조건이 많을수록 분할이 많고 트리가 길어진다.

분할을 지나치게 많이 하면 과대적합될 우려가 있다.

max_depth, min_samples_split, min_samples_leaf가 결정 트리의 과대적합을 제어하는 파라미터.

 

https://www.kaggle.com/werooring/ch5-decision-tree

from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_breast_cancer

# 유방암 데이터셋 불러오기
cancer_data = load_breast_cancer()

# 훈련, 테스트 데이터로 분리
X_train, X_test, y_train, y_test = train_test_split(cancer_data['data'], 
                                                    cancer_data['target'], 
                                                    stratify=cancer_data['target'], 
                                                    test_size=0.4, 
                                                    random_state=42)

decisiontree = DecisionTreeClassifier(random_state=42) # 결정 트리 정의
decisiontree.fit(X_train, y_train) # 모델 훈련
accuracy = decisiontree.score(X_test, y_test) # 정확도 측정
# 테스트 데이터를 활용하여 결정 트리 모델 정확도 출력
print(f'결정 트리 정확도: {accuracy:.3f}')

결정 트리 정확도: 0.930

 

유방암 데이터셋으로 결정 트리 모델의 정확도를 측정하는 코드

 

출처 :머신러닝 딥러닝 문제해결 전략

https://wikidocs.net/book/13313

반응형