카테고리 없음

와인 품종 예측

dldbwls0818 2025. 1. 31. 01:34

1. 와인 품종 DataSet

- sklearn에서 제공되는 데이터셋으로 이탈리아의 같은 지역에서 재배된 세가지 품종으로 만든 와인을 화학적으로 분석한 결과대한 데이터가 담겨져 있습니다.

- 이 데이터 셋으로 13개의 성분을 분석하여 어떤 와인인지 구별하는 모델을 만들어보겠습니다.

- 마지막에 테스트 데이터셋의 0번째 인덱스에 해당되는 데이터를 넣어 어떤 와인인지 출력해보겠습니다.

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import torch
import torch.nn as nn
import torch.optim as optim
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_wine

 

2. DataSet 다루기

wine = load_wine()
wine

print(wine['DESCR'])

data = wine['data']
target = wine['target']
feature_names = wine['feature_names']

wine_df = pd.DataFrame(data, columns=feature_names)
wine_df['target'] = target

wine_df.info()

 

wine_corr = wine_df.corr()

plt.figure(figsize=(16, 16))
sns.heatmap(wine_corr, annot=True, fmt='.2f', cmap='coolwarm')
plt.title('Feature Correlation Heatmap')
plt.show()

 

3. Train, Test 분리 후 모델 생성 및 다중 분류 예측

X_train, X_test, y_train, y_test = train_test_split(wine_df.drop('target', axis=1), wine_df['target'], test_size=0.2, random_state=2025)
print(X_train.shape, X_test.shape)
print(y_train.shape, y_test.shape)

model = nn.Sequential(
	nn.Linear(13, 3)
)

list(model.parameters())

X_train = X_train.to_numpy()
y_train = y_train.to_numpy()
X_test = X_test.to_numpy()
y_test = y_test.to_numpy()

X_train = torch.FloatTensor(X_train)
y_train = torch.LongTensor(y_train)
X_test = torch.FloatTensor(X_train)
y_test = torch.LongTensor(y_train)

optimizer = optim.Adam(model.parameters(), lr=0.001)
epochs = 10000

for epoch in range(epochs + 1) :
    y_pred = model(X_train)
    loss = nn.CrossEntropyLoss()(y_pred, y_train)
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

    if epoch % 100 == 0 :
        print(f'Epoch: {epoch}/{epochs}, Loss: {loss:.6f}')
        
y_pred = model(X_test[:1])
y_prob = nn.Softmax(1)(y_pred)

print(f'0일 확률: {y_prob[0][0]:.2f}')
print(f'1일 확률: {y_prob[0][1]:.2f}')
print(f'2일 확률: {y_prob[0][2]:.2f}')