혼공 ML+DL #11

myeong·2022년 10월 2일
0

ML+DL

목록 보기
9/23

📌 로지스틱 회귀로 와인 분류

  • 레드 와인(0) or 화이트 와인(1) 구분하기

📍 Data 준비

  • head() : 상위 5개 행 출력
    info() : 행/열 크기, 컬럼명, 자료형등 정보 출력
    describe() : 컬럼별 요약 통계량
import pandas as pd

wine = pd.read_csv('https://bit.ly/wine_csv_data')
wine.head()

wine.info()

wine.describe()

📍 Data Set

  • test_size : train - test 비율 설정
data = wine[['alcohol', 'sugar', 'pH']].to_numpy()
target = wine['class'].to_numpy()

from sklearn.model_selection import train_test_split
train_input, test_input, train_target, test_target = train_test_split(
    data, target, random_state=42, test_size=0.2
)
print(train_input.shape, test_input.shape)

(5197, 3) (1300, 3) // train_set이 test_set의 3배

📍 로지스틱 회귀

from sklearn.preprocessing import StandardScaler
ss = StandardScaler()
ss.fit(train_input)

train_scaled = ss.transform(train_input)
test_scaled = ss.transform(test_input)

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]
-> alcohol, sugar 높을수록 화이트 와인, ph 높을수록 레드 와인


📌 결정 트리

  • 루트노드 -> 리프노드
  • 질문(노드) - 예/아니오로 점차 구분하여 예측함
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

import matplotlib.pyplot as plt
from sklearn.tree import plot_tree

plt.figure(figsize=(10,7))
plot_tree(dt)
plt.show()

  • 분류 : 리프 노드 샘플의 다수 클래스가 예측값
    회귀 : 리프 노드 샘플의 타깃 값의 평균이 예측값

📌 결정 트리 분석

  • depth = 1, 특성 3가지 명시
  • value = [음성 class, 양성 class] 갯수
plt.figure(figsize=(10, 7))
plot_tree(dt, max_depth=1, filled=True, 
          feature_names=['alcohol', 'sugar', 'pH'])
plt.show()

-> sugar를 기준으로 샘플이 나누어짐

📍 불순도

  • 노드 분할 기준
  • 결정 트리의 매개 변수 criterion
  • default = gini
  • 지니 불순도 = 1 - (음성 비율² + 양성 비율²)
  • 지니 불순도 = 0 이면 순수 노드 (리프 노드)
  • (부모 gini - 자식 gini) 차이가 크도록 노드 분할

📍 가지치기

  • 과대적합 방지
  • 제한이 없으면 리프노드가 순수노드가 될 때 까지 분할 반복
  • max_depth 조절로 분할 깊이 조절
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

📍 스케일 조정하지 않고 특성 사용

  • 결정 트리는 데이터 전처리가 필요없음 !!
  • train_input, test_input 사용
  • 분할에서 각 특성의 중요도
print(dt.feature_importances_)

[0.12345626 0.86862934 0.0079144 ]
-> alcohol, sugar, pH



🔗 혼공 MLDL-11

0개의 댓글