본문 바로가기
머신러닝/Preprocessing

Decision Tree를 이용한 Wine 데이터 분석_이진분류

by 미생22 2024. 3. 4.
728x90

전에는 red와인이냐 white와인이냐로 분류했다면 이번에는 quality 컬럼을 이진화 해보겠습니다.
이진화는 quality가 3부터 9등급까지 있으므로, 3-5, 6-9등급으로 나누어 맛이없다(0)와 맛이있다(1)로 나눠보겠습니다.

 

4. 와인 맛에 대한 분류 (이진분류)

 

wine['taste'] = [1. if grade>5 else 0. for grade in wine['quality']]
wine

if문과 for문을 한 줄에 적어보았습니다.

wine.info()

 

info()로 모든 데이터에 누락이 없는지도 잘 확인해줬습니다.

이제 학습을 위해 feature와 label로 나누기 위해 taste를 빼보겠습니다.

 

X = wine.drop(['taste'], axis=1)
y = wine['taste']

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=13
)

wine_tree = DecisionTreeClassifier(max_depth=2, random_state=13)
wine_tree.fit(X_train, y_train)

 

학습을 완료했으니 예측하고 accuracy를 확인해보겠습니다.

 

y_pred_tr = wine_tree.predict(X_train)
y_pred_test = wine_tree.predict(X_test)

print('Train Acc : ', accuracy_score(y_train, y_pred_tr))
print('Test Acc : ', accuracy_score(y_train, y_pred_tr))

 

100%가 나오네요... 이게 가능한걸까요? 무조건 의심해야합니다. 불가능하다고 생각해야합니다.
왜 100%가 나왔을까 고민해보겠습니다. 우선 plot시켜보겠습니다.

 

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

plt.figure(figsize=(12, 6))
tree.plot_tree(wine_tree)
plt.show()

컬럼 이름이 안나와서 당황스러우니까 X[11]이 아닌, 컬럼이름으로 나오게 할겁니다.

plt.figure(figsize=(12, 6))
tree.plot_tree(wine_tree, feature_names=X.columns)
plt.show()

 

우리가 처음 5보다 작으면 맛이 0, 크거나 같으면 1로 했기 때문에 얘가 quality column을 가지고 학습한 겁니다.
quality 컬럼을 지우고 학습했어야 했습니다. 맛을 구분한 원재료가 살아있기 때문에 얘를 없애야합니다.

따라서 drop을 taste뿐만 아니라 quality도 같이 해줘야합니다.

 

X = wine.drop(['taste', 'quality'], axis=1)
y = wine['taste']

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=13
)

wine_tree = DecisionTreeClassifier(max_depth=2, random_state=13)
wine_tree.fit(X_train, y_train)

y_pred_tr = wine_tree.predict(X_train)
y_pred_test = wine_tree.predict(X_test)

print('Train Acc : ', accuracy_score(y_train, y_pred_tr))
print('Test Acc : ', accuracy_score(y_train, y_pred_tr))

이제 좀 신뢰할 수 있는 정확도가 나왔네요. 화학성분을 가지고 맛이 있다 없다를 구분하는 것은 72.9%의 정확도를 보입니다. 그럼 무엇을 가지고 맛이 있다 없다가 나뉘는지 살펴보겠습니다.

 

plt.figure(figsize=(12,6))
tree.plot_tree(wine_tree, feature_names=X.columns,
               rounded=True,
                filled=True)
plt.show()

맛이 있다 없다의 첫번째 조건은 alcohol로 먼저 구분이 되었습니다. 결국 등급은 알콜도수가 높으면 등급이 높아지는게 아닐까요...?

728x90