본문 바로가기
머신러닝/프로젝트

Proj Wine 속성을 이용한 포도 품종 예측

by ADELA_J 2023. 8. 7.

Wine - UCI Machine Learning Repository

이 데이터로 머신러닝 해보려고합니다.......

요런식의 csv파일도 아니고 뭐지 하고 열어봤더니

- index나 wine.names는 데이터 설명서이고 사용할 파일은 wine.data

 

<개요>

포도 품종 예측하기
목표 와인의 속성을 분석해서 포도 품종을 예측한다.
핵심 개념 기술 통계, 의사결정트리, K-Fold cross validation, 성능확인, 산점도 그래프
데이터 수집 UCI Machine Learning Repository 에서 다운로드
데이터 내용 독립 변수 12개(('Alcohol','Malic acid','Ash', 'Alcalinity of ash  ', 'Magnesium', 'Total phenols', 'Flavanoids','Nonflavanoid phenols','Proanthocyanins','Color intensity','Hue', 'OD280/OD315 of diluted wines','Proline')
종속 변수 1개 ('Class')
데이터 준비 수집한 데이터 columns 명과 데이터 값 일치
데이터 탐색 정보 확인 : info()
기술 통계 확인 :  info(), describe(), unique(), value_counts()
데이터 모델링 1. 학습/예측 및 검증
- 훈련 데이터 및 테스트 데이터 나누기 : train_test_split()
- 학습, 의사결정 트리 : DecisionTreeClassifier
 # 해당 학습 선정 이유 : 전체 자료를 몇 개의 집단으로 분류하거나 예측을 수행하는 분석 방법이기 때문에 
- 학습 : fit()

2. 품질 등급 예측 및 검증
- 샘플을 독립변수(x)로 지정→ 의사결정트리 모델 적용 → 종속 변수(y) 예측
- 검증 : K-Fold Cross Validation (6회)

3. 시각화
- 상관관계가 가장 높은 독립변수(속성)과 Class와의 산점도 그래프를 통해 분류 확인

 

- 사용된 모듈

 

<데이터 준비>

원래 데이터는 이렇게 준비되어있음 (컬럼값이 없었음)

▼ 그래서 컬럼값을 주고 데이터를 불러와서 새로 저장

▶ 그리고 컬럼명에 공백에 _으로 바꿔주고

 

<데이터 탐색>

 

▲ info() 를 통해 정보를 확인한다. 총 14개의 컬럼, 178개의 행(데이터셋), 그리고 각각의 데이터타입까지

▲ 그리고 describe()를 통해 데이터 정보들을 본다.

Class를 살펴보면 min은 1 max 3인거 보면 1~3의 값밖에 없어보이므로 탈락(사실은 종속변수)

그래서 .unique() 메서드를 써서 더블 체크를 해보자면

역시나 1,2,3밖에 없는 것을 확인할 수 있다. 3가지 종류로 분류 되어있다.

▶ 갯수를 세어보면(.value_counts()메서드) 2가 71개로 제일 많고 3이 48개로 제일 적다. 

▶ groupby로 묶어서 평균과 표준편차도 각 컬럼마다 확인해볼 수 있다.

 

<데이터 모델링>

- 데이터 훈련을 위해 데이터 값과 라벨 값을 정해주었다.

▼ 그리고 훈련데이터 / 테스트 데이터 나누고 ( 7:3이니까 테스트사이즈 0.3 고정값나왔으면 해서,, random_state)

▼ 의사 결정트리의 객체를 생성하고 돌려본 결과 정확도는 0.96

 

<검증>

▲ k-fold 검증을 위한 와인 데이터 세트 크기를 확인해보면 178개인데, 그럼 6개로 나누면 되지 않을까..?

▲ 그래서 총 6번을 한 결과 이렇게 정확도가 나온다. 평균 0.83...

좀 더 올리기위해서는 하이퍼파라미터를 조정해서 올려야하는걸까

 

▶ 이걸 메서드를 이용하면 이렇게 하면 된다는데 그럼 0.91 이 나온다

random_state를 None으로 해놨기 때문에 돌릴때마다 값은 달라진다.

 

<예측>

▶ 가상의 값을 2개를 넣었는데 Class 가 1,1 이라고 나왔다!

 

<상관관계를 확인하고 산점도 그리기>

양의 상관관계를 가지는 변수를 확인해보니 color_intensity빼고는 다 비슷비슷하다....

하지만 가장 높은 Alcalinity_of_ash__ 와 Nonflavanoid_phenols 가 가장 영향을 크게 주는 변수다.

그래서 이 두개를 가지고 산점도 그래프를 그려보았다. 

▼2개의 변수로 Class가 어떻게 나뉘어질것인가!

◀ 회귀선 있는거 ▶ 회귀선 없는 것.

▼ 2개의 변수의 상관관계를 시각화 하는 것 중에 catplot도 있길래 해봄

▷▷▷▷ 산점도와 catplot를 보면 알 수 있듯이 2개의 변수만으로는 Class를 명확하게 결정하기 어렵다.

 

▶ 그리고 수업시간에 배운 pairplot도 사용해서 상관 분석 시각화도 해보았다.

 

 

<교수님 피드백>

- 방식이나 절차는 GOOD!

- 정확도가 낮은 이유는 데이터의 갯수가 부족해서 정확한 모델을 도출하기 어렵기 때문에.

- 상관계수값이 그렇게 높지 않기 때문에 -> 대부분 0.6 이상이여야지만 있다고 함

- 그래프가 2개의 속성값으로만 나눠지지 않는 이유는 속상값이 1-2개로 결정나는게 아니라 여러개로 결정나는 것이기 때문에 그래프로 정확히 분류되는것도 어려움.