2021. 6. 24. 22:11ㆍICT 멘토링/혼자 공부하는 머신러닝+딥러닝
11강 - 로지스틱 회귀로 와인 분류하기 & 결정 트리
지난 시간에
레드 와인과 화이트 와인
알코올, 당도, pH에 따라 레드 와인, 화이트 와인 분류.
화이트 와인을 양성 클래스 (1) 로 세팅 됨.
데이터 준비하기
wine.info()
# //<class 'pandas.core.frame.DataFrame'>
# //RangeIndex: 6497 entries, 0 to 6496
# //Data columns (total 4 columns):
# // # Column Non-Null Count Dtype
# //--- ------ -------------- -----
# // 0 alcohol 6497 non-null float64
# // 1 sugar 6497 non-null float64
# // 2 pH 6497 non-null float64
# // 3 class 6497 non-null float64
# //dtypes: float64(4)
# //memory usage: 203.2 KB
wine - 데이터프레임
info - 정보를 보여줌. 타입, 메모리 사용량, 누락 유무 확인 가능.
누락 값이 있으면 평균을 내어 평균값, 중간값 등으로 대체. 혹은 행 자체를 삭제하는 방법 사용 가능.
범주형의 경우 빈도가 높은 값을 사용하여 대체하기도 함.
wine.describe()
평균, 표준편차, 최소, 최대, 각 지표 값 확인 가능.
데이터 스케일 다른 것 확인 가능.
다르면 스케일 통일시켜줘야 함.
로지스틱 회귀
from sklearn.linear_model import LogisticRegression
lr = LogisticRegression()
lr.fit(train_scaled, train_target)
print(lr.score(train_scaled, train_target))
# //0.7808350971714451
print(lr.score(test_scaled, test_target))
# //0.7776923076923077
print(lr.coef_, lr.intercept_)
# //[[ 0.51270274 1.6733911 -0.68767781]] [1.81777902]
가중치에 다항 특성을 고려하게 되면 이해에 더 복잡해짐.
ph * sugar
sugar ** 2
순서도처럼 간단한 표현방법은 없나??
결정 트리
from sklearn.tree import DecisionTreeClassifier
dt = DecisionTreeClassifier(random_state=42)
dt.fit(train_scaled, train_target)
print(dt.score(train_scaled, train_target))
# //0.996921300750433
print(dt.score(test_scaled, test_target))
# //0.8592307692307692
현재 코드는 분류모델만 존재하지만 회귀모델도 존재함.
import matplotlib.pyplot as plt
from sklearn.tree import plot_tree
plt.figure(figsize=(10,7))
plot_tree(dt)
plt.show()
사이킷런에서 결정트리 관련 함수 제공.
루트 노드 - 가장 위의 노드. 부모가 없고 자식만 존재.
리프 노드 - 가장 말단의 노드. 자식이 없고 부모만 존재.
분류일 때는 마지막 leaf node 중 다수의 클래스가 예측 클래스가 됨.
회귀일 때는 평균 값이 예측 값이 됨.
maxfeatures - 사용할 특성 개수 지정 가능. None 이면 모든 특성 사용. 숫자 지정하면 특성 개수 지정.
알코올, pH, sugar 특성 3개 존재 시 maxfeatures=2로 설정할 때 불순도(나중에 설명)의 성과가 동일할 때는 랜덤하게 선택하게 됨.
결정 트리 분석
plt.figure(figsize=(10,7))
plot_tree(dt, max_depth=1, filled=True, feature_names=['alcohol', 'sugar', 'pH'])
plt.show()
왼쪽 - Yes
오른쪽 - No
value - 양성클래스, 음성클래스 개수
gini - 불순도
지니 불순도
결정트리 - 부모의 지니 불순도에서 자식의 지니 불순도를 뺐을 때 가장 크게 나오는 방향으로 노드를 분할함.
지니불순도 = 0.5 - 가장 불순함. 똑같이 섞인 경우.
지니불순도 = 0 - 순수노드(pure node). 하나의 클래스로만 이뤄지는 경우.
leaf node가 순수 노드가 될 때까지 나눈 것이라 위의 결정 트리가 복잡하고 양도 많았던 것.
부모와 자식의 불순도 차이는 사이킷런에서 계산 제공함.
순수노드가 좋긴 하지만 너무 많은 트리가 생기고 훈련 세트에서는 높은 점수가 나오고 테스트 세트에서는 낮은 점수가 나오는 과대적합이 생기기도 함.
이를 해결하기 위해 가지치기 존재.
가지치기
dt = DecisionTreeClassifier(max_depth=3, random_state=42)
dt.fit(train_scaled, train_target)
print(dt.score(train_scaled, train_target))
# //0.8454877814123533
print(dt.score(test_scaled, test_target))
# //0.8415384615384616
plt.figure(figsize=(20,15))
plot_tree(dt, filled=True, feature_names=['alcohol', 'sugar', 'pH'])
plt.show()
max_depth - 트리의 깊이 제한. 3이면 3번 분할하여 루트노드 제외하면 3층의 자식노드가 존재함.
결정트리는 L2, L1 규제, 선형함수 같은 것들을 적용할 수 없으므로 가지치기 방법이 과대적합을 막기 위해 사용됨.
레드와인은 -0.802 < sugar <= -0.239, alcohol <= 0.454 이어야 함.
색이 짙을 수록 양성 클래스 비율 높은 것.
이진 분류라서 해석이 쉬웠지만 depth를 높이면 해석이 어려울 수 있음.
선형 함수의 경우 스케일을 조정했지만 선형 함수를 사용하지 않으므로 결정트리는 전처리를 사용하지 않아도 됨.
스케일 조정하지 않은 특성 사용하기
dt = DecisionTreeClassifier(max_depth=3, random_state=42)
dt.fit(train_input, train_target)
print(dt.score(train_input, train_target))
# //0.8454877814123533
print(dt.score(test_input, test_target))
# //0.8415384615384616
plt.figure(figsize=(20,15))
plot_tree(dt, filled=True, feature_names=['alcohol', 'sugar', 'pH'])
plt.show()
print(dt.feature_importances_)
# //[0.12345626 0.86862934 0.0079144 ]
스케일 조정한 것과 조정하지 않은 것 결과 모두 동일함.
1.625 < sugar <= 4.325, alcohol <= 11.025
위와 같이 가진 특성 데이터의 스케일을 가지고 설명 가능함.
특성 중요도 출력 가능.
feature_importance_ 제공하여 가장 큰 특성인 sugar가 가장 중요한 속성임을 알 수 있음.
pH가 별로 영향을 끼치지 않음도 알 수 있음.
깊이 만들면 너무 과대 적합되어 자르는데 성능이 덜 나옴.
깊이와 성능 간 tradeoff가 존재하는데 왜 결정 트리가 잘 쓰이나??
앙상블을 만들 수 있기 때문
결정 트리 장점
1. 설명 쉬움.
2. 그래프 표현 용이.
3. 특성 중요도 표현 가능.
지니 불순도를 기준으로 노드를 나눔.
참고 자료
https://www.youtube.com/watch?v=tOzxDGp8rsg&list=PLVsNizTWUw7HpqmdphX9hgyWl15nobgQX&index=11
'ICT 멘토링 > 혼자 공부하는 머신러닝+딥러닝' 카테고리의 다른 글
18강 - 심층 신경망 ▶️인공 신경망에 층을 추가하여 심층 신경망 만들어 보기 (0) | 2021.07.01 |
---|---|
17강 - 인공 신경망 ▶️ 간단한 인공 신경망 모델 만들기 (0) | 2021.06.24 |
10강 - 확률적 경사 하강법 알아보기 (0) | 2021.06.24 |
9강 - 로지스틱 회귀 알아보기 (0) | 2021.06.24 |
8강 - 특성 공학과 규제 알아보기 (0) | 2021.06.17 |