혼공머_5_1 로지스틱 회귀로 와인 분류하기 & 결정 트리
Jul 18, 2021
»
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. 이해하기 쉬운 결정트리 모델