ML_Wine

조천룡·2023년 7월 15일
0

Machine Learning

목록 보기
6/26
post-thumbnail

wine.info()

와인 맛 분류

EDA

데이터 읽기

import pandas as pd

red_url = 'https://raw.githubusercontent.com/PinkWink/ML_tutorial/master/dataset/winequality-red.csv'
white_url = 'https://raw.githubusercontent.com/PinkWink/ML_tutorial/master/dataset/winequality-white.csv'

red_wine = pd.read_csv(red_url, sep=';')
white_wine = pd.read_csv(white_url, sep=';')

두 데이터의 구조는 동일하다

red_wine.head()

white_wine.head()

컬럼 종류

white_wine.columns

데이터 합치기

red_wine['color'] = 1.
white_wine['color'] = 0.

wine = pd.concat([red_wine, white_wine])
wine.info()

등급 확인하기

wine['quality'].unique()

histogram

import plotly.express as px 

fig = px.histogram(wine, x='quality')
fig.show()

wine['quality'].value_counts()

레드/화이트 와인별 등급 histogram

fig = px.histogram(wine, x='quality', color='color')
fig.show()

➔ plotly.exptress는 아주 간편하고 강력한 기능을 제공한다.

DT

  • 레드 와인/화이트 와인 분류기

라벨을 분리

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

데이터를 휸련용과 테스트용으로 나누기

from sklearn.model_selection import train_test_split
import numpy as np

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

np.unique(y_train, return_counts=True)

훈련용과 테스트용이 레드/화이트 와인에 대한 구분 정도

import plotly.graph_objects as go 

fig = go.Figure()
fig.add_trace(go.Histogram(x=X_train['quality'], name='Train'))
fig.add_trace(go.Histogram(x=X_test['quality'], name='Test'))

fig.update_layout(barmode='overlay')
fig.update_traces(opacity=0.7)
fig.show()

결정나무 훈련

from sklearn.tree import DecisionTreeClassifier
 
wine_tree = DecisionTreeClassifier(max_depth=2, random_state=13)
wine_tree.fit(X_train, y_train)

학습 결과

from sklearn.metrics import accuracy_score

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_test, y_pred_test))

데이터 전처리

  • MinMaxScaler , StandardScaler

와인 데이터의 몇 개 항목에 대한 Boxplot

fig = go.Figure()
fig.add_trace(go.Box(y=X['fixed acidity'], name='fixed adidity'))
fig.add_trace(go.Box(y=X['chlorides'], name='chlorides'))
fig.add_trace(go.Box(y=X['quality'], name='quality'))
fig.show()

  • 컬럼들의 최대/최소 범위가 각각 다르고, 평균과 분산이 각각 다르다.
  • 특성(feature)의 편향 문제는 최적의 모델을 찾는데 방해가 될 수도 있다.
  • 이럴 때 쓰는 것이 MinMaxScaler와 StandardScaler이다.
from sklearn.preprocessing import MinMaxScaler, StandardScaler

MMS = MinMaxScaler()
SS = StandardScaler()

MMS.fit(X)
SS.fit(X)

X_ss = SS.transform(X)
X_mms = MMS.transform(X)

X_ss_pd = pd.DataFrame(X_ss, columns=X.columns)
X_mms_pd = pd.DataFrame(X_mms, columns=X.columns)
  • 결정나무에서는 이런 전처리는 의미를 가지지 않는다.
  • 주로 Cost Function을 최적화할 때 유효할 때가 있다.
  • MinMaxScaler와 StandarScaler 중 어떤 것이 좋을지는 해봐야 안다.

MinMaxSclaer

  • 최대,최소값을 1과 0으로 강제로 맞추는 것.
def px_box(target_df):
    fig = go.Figure()
    fig.add_trace(go.Box(y=target_df['fixed acidity'], name='fixed adidity'))
    fig.add_trace(go.Box(y=target_df['chlorides'], name='chlorides'))
    fig.add_trace(go.Box(y=target_df['quality'], name='quality'))
    fig.show()
    
px_box(X_mms_pd)

StandardScaler

  • 평균을 0으로 표준편차를 1로 맞추는 것 .
px_box(X_ss_pd)

MinMaxScaler를 적용해서 다시 학습

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

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

print('Tran Acc : ', accuracy_score(y_train, y_pred_tr))
print('Test Acc : ', accuracy_score(y_test, y_pred_test))

StandardScaler를 적용

레드와인과 화이트와인을 구분하는 중요 특성

dict(zip(X_train.columns, wine_tree.feature_importances_))

와인 맛에 대한 분류 - 이진분류

  • quality 컬럼을 이진화
wine['taste'] = [1. if grade > 5 else 0. for grade in wine['quality']]
wine.head()

레드/화이트 와인 분류와 동일 과정

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)

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_test, y_pred_test))

100% 발생 한 이유

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

plt.figure(figsize=(12,8))
tree.plot_tree(wine_tree, feature_names=X.columns);

try again

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_test, y_pred_test))

맛있는 와인 기준

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

profile
10√2 Data

0개의 댓글