알파카징징이 알파카징징이 코딩하는 알파카

혼공머_5_1 로지스틱 회귀로 와인 분류하기 & 결정 트리

» writing

혼자공부하는머신러닝+딥러닝 수업을 참고하여 작성하였습니다

5_1_로지스틱 회귀로 와인 분류하기 & 결정 트리

정의


로지스틱 회귀로 와인 분류하기 & 결정 트리

1. 로지스틱 회귀로 와인 분류하기
    - class 0 : 레드와인
    - class 1 : 화이트와인
import pandas as pd
wine = pd.read_csv('https://bit.ly/wine-date')
wine.head()

alcohol sugar pH class 0 9.4 1.9 3.51 0.0 1 9.8 2.6 3.20 0.0 2 9.8 2.3 3.26 0.0 3 9.8 1.9 3.16 0.0 4 9.4 1.9 3.51 0.0

2. 표준화
    - StandardScaler 클래스를 사용해 전처리 !
from sklearn.model_selection import train_test_split
train_input, test_input, train_target, test_target = train_test_split(data, target, test_size = 0.2, random_state = 42)
# test_size -> test의 사이즈 (20%)

from sklearn.preprocessing import StandardScaler
ss = StandardScaler()
ss.fit(train_input)
train_scaled = ss.transform(train_input)
test_scaled = ss.transform(test_input)
3. 로지스틱 회귀 훈련
    - 알코올과 당도가 높을수록 화이트 와인 가능성 높다
    - pH가 높을수록 레드 와인 가능성이 높다
from sklearn.linear_model import LogisticRegression

lr = LogisticRegression()
lr.fit(train_scaled, train_target)

print(lr.score(train_scaled, train_target))
print(lr.score(test_scaled, test_target))
print(lr.coef_, lr.intercept_)
# 0.7808350971714451
# 0.7776923076923077
# [[ 0.51270274  1.6733911  -0.68767781]] [1.81777902]
4. 결정트리
    - 스무고개
    - 데이터를 잘 나눌 수 있는 질문을 찾는다면 계속 질문을
        추가해서 분류 정확도를 높일 수 있다
    - 훈련세트 > 테스트 세트 : 과대적합된 모델
    - plot_tree() 함수를 사용해 결정 트리를 이해하기 
        쉬운 트리 그림으로 출력
    - 결정 트리 위 : 루트 노드
    - 맨 아래 끝 : 리프 코드
from sklearn.tree import DecisionTreeClassifier

dt = DecisionTreeClassifier(random_state = 42)
dt.fit(train_scaled, train_target)

print(dt.score(train_scaled, train_target))
print(dt.score(test_scaled, test_target))
# 0.996921300750433
# 0.8592307692307692

결정 트리

5. 결정 트리 분석
    - plot_tree() 함수에서 트리 깊이 제한해서 출력
    - max_depth = 1 : 루트 노드 제외하고 하나 노드 더확장
    - filled : 클래스에 맞게 노드의 색 칠하기
    - feature_names : 특성의 이름 전달
plt.figure(figsize=(10,7))
plot_tree(dt, max_depth=1, filled = True, feature_names=['alcohol', 'sugar', 'pH'])
plt.show()

6. 지니 불순도
    - criterion : 노드에서 데이터를 분할할 기준을 정하는 것
    - gini
    - 클래스의 비율을 제곱해서 더한 다음 1에서 빼기
    - 지니 불순도 = 1 - (음성 클래스 비율^2 + 양성 클래스 비율^2)
    - 결정트리모델은 부모노드, 자식노드의 불순도 차이가 가능한
        크도록 트리를 성장
    - 부모노드 & 자식노드의 불순도 차이 계산 방법
        : 자식 노드의 불순도를 샘플 개수에 비례하여 모두 더하고
        부모 노드의 불순도에서 뺀다
    - 정보이득 : 부모와 지식 노드 사이의 불순도

7. 엔트로피 불순도
    - 제곱이 아니라 밑이 2인 로그 사용
    - 엔트로피 불순도 = -음성클래스비율 * log2(음성클래스비율)
                        -양성클래스비율 * log2(양성클래스비율)
    - 불순도 기준을 사용해 정보이득이 최대가 되도록 노드 분할
    - 노드를 순수하게 나눌수록 정보이득 커진다

8. 가지치기
    - 자라날 수 있는 트리의 최대 깊이를 지정
    - 결정트리는 표준화 전처리 과정이 필요 없다
dt = DecisionTreeClassifier(max_depth=3, random_state=42)
dt.fit(train_scaled, train_target)

print(dt.score(train_scaled, train_target))
print(dt.score(test_scaled, test_target))
# 0.8454877814123533
# 0.8415384615384616
plt.figure(figsize=(20,15))
plot_tree(dt, filled = True, feature_names=['alcohol', 'sugar', 'pH'])
plt.show()

9. 스케일 조정하지 않은 특성 사용하기
    - 특성값의 스케일은 결정트리에 영향 미치지 없다
    - 표준화 전처리 할 필요가 없다
    - 스케일과 스케일 하지 않은 특성과 값 똑같다
dt = DecisionTreeClassifier(max_depth=3, random_state=42)
dt.fit(train_scaled, train_target)

print(dt.score(train_scaled, train_target))
print(dt.score(test_scaled, test_target))
# 0.8454877814123533
# 0.8415384615384616
10.  결정트리
    - 결정트리는 어떤 특성이 가장 유용한지 나타내는 특성 중요도 계산해줌
    - feature_importatnce_ : 결정트리의 특성 중요도
                           : 각 노드의 정보이득과 전체 샘플에 대한
                           비율을 곱한 후 특성별로 더하서 계산 
print(dt.feature_importances_)
# [0.12345626 0.86862934 0.0079144 ]
11. 이해하기 쉬운 결정트리 모델