기계 학습과 포도주 품질: 다양한 분류로 양질의 포도주 찾기

8645 단어 machinelearningai

기계 학습과 포도주 품질: 다양한 분류로 양질의 포도주 찾기


술을 마시다


술을 음미하는 것은 심오한 과정으로 많은 의식과 풍습이 있다.컵의 모양부터 포도주의 온도까지 모든 것이 포도주의 등급에 영향을 줄 것이다.포도주 전문가들은 색깔, 점도, 냄새, 맛, 부차적인 향기를 검사한다.기계는 유사한 방식으로 포도주를 검출할 수 있지만, 이것은 매우 비싸고 어려울 것이다.더 실행 가능한 선택은 기체 스펙트럼 분석과 pH값과 다른 화학 지표를 사용하여 포도주를 11개의 변수로 분해하는 것이다.이러한 변수와 평론을 사용하면 우리는 이 변수 중 어떤 것이'좋은'포도주를 확정할 때 가장 중요한지 예측할 수 있는 모델을 만들 수 있다.
이 프로젝트는 붉은 포도주가 좋은지 아닌지를 예측하기 위해 카글Red Wine Quality의 데이터 집합을 사용하여 여러 분류 모델을 만들 것이다.데이터가 집중된 포도주는 이미 심사를 거쳐 0에서 10까지 점수를 매겼다.다음 11개의 변수도 제공됩니다.
비휘발성산
휘발성 산도
레몬산
잔여 설탕
염화물
유리 이산화황
총 이산화황
밀집
산성 알칼리도
황산염
알코올 음료
우리는 몇 개의 분류 모델로 실험을 진행하여 어느 모델이 이 데이터 집합으로 가장 높은 정밀도를 되돌릴 수 있는지 볼 것이다.이렇게 함으로써 우리는 어떤 변수가 좋은 포도주를 확정하는 데 가장 중요한지 잘 알게 될 것이다.

설치 프로그램


우리가 사용할 데이터 세트와 라이브러리를 가져오려면 다음과 같이 하십시오.
import numpy as np
import pandas as pd
import matplotlib as plt
import seaborn as sns
import plotly.express as px
데이터 읽기:
df = pd.read_csv("../input/red-wine-quality-cortez-et-al-2009/winequality-red.csv")
데이터 확인:
print("Rows, columns: " + str(df.shape))
df.head()
12열에 총 1599줄이 있는 것을 보실 수 있습니다.앞의 다섯 줄의 데이터는 문제가 없는 것 같다.부족한 값을 확인하겠습니다.
print(df.isna().sum())
Kaggle은 부족한 값이 없는 깔끔한 데이터 집합을 제공합니다.

시각화 변수



질량 변수 직사각형도
질량 변수에 충분한 방차와 수량을 확보하기 위해 우리는 직사각형을 만들었다.
fig = px.histogram(df,x='quality')
fig.show()

가변 상관성
가시화 변수 간의 관련성을 위해 관련 행렬을 만들 것입니다.이것은 우리로 하여금 변수 간의 서로 다른 관계를 이해할 수 있게 할 뿐만 아니라, 심지어는 어떤 변수가 양질의 포도주와 관련이 있는지 확정할 수 있게 할 것이다.
corr = df.corr()
matplotlib.pyplot.subplots(figsize=(15,10))
sns.heatmap(corr, xticklabels=corr.columns, yticklabels=corr.columns, annot=True, cmap=sns.diverging_palette(220, 20, as_cmap=True))

분류 문제로 변환


포도주의 질을 예측하는 목표로 돌아가려면 출력 변수가 2진 출력이어야 한다.
이 문제에 대해 만약에 포도주 한 병의 품질 점수가 8 이상이면 나는'양질'이라고 정의한다. 만약에 그것의 품질 점수가 8보다 낮으면'저질'로 간주된다.
출력 변수를 바이너리 출력으로 변환한 후 특징 변수 (X) 와 목표 변수 (y) 를 단독 데이터 프레임으로 분리합니다.
# Create Classification version of target variable
df['goodquality'] = [1 if x >= 8 else 0 for x in df['quality']]
# Separate feature variables and target variable
X = df.drop(['quality','goodquality'], axis = 1)
y = df['goodquality']

좋은 포도주와 나쁜 포도주의 비율


나는 합리적인 수량의 양질의 포도주를 확보하고 싶다.다음 결과에 따르면 이것은 충분한 공평한 숫자인 것 같다.일부 응용 프로그램에서 데이터가 매우 불균형적이면 다시 샘플링을 해야 할 수도 있지만, 나는 이것이 가능하다고 생각한다.
# See proportion of good vs bad wines
df['goodquality'].value_counts()

모델링을 위한 데이터 준비



사양명세 피쳐 변수
현재, 나는 이미 시범을 위해 정보를 설정할 준비가 되어 있다고 생각한다.내가 하는 주요 일은 정보를 정상화시키는 것이다.귀일화 정보는 정보를 바꾸어 순환하는 평균치가 0이고 표준 편차가 1이라는 것을 의미한다.정보를 규범화하여 정보 범위를 균형 있게 하는 것이 매우 중요하다.
예를 들어 키(mm)와 몸무게(파운드) 두 가지 정보의 하이라이트를 가진 데이터 집합을 생각해 보자.'키'의 추정치는 그 추정치에 따라 훨씬 높기 때문에 더욱 주의해야 할 것은 키가 체중보다 더 중요하기 때문에 편차가 생길 수 있다는 것이다.
# Normalize feature variables
from sklearn.preprocessing import StandardScaler
X_features = X
X = StandardScaler().fit_transform(X)

정보 분할
다음에 나는 정보를 훈련과 테스트 집합으로 나누는데 목표는 내가 나의 모델을 교차 비준하고 그들의 타당성을 결정하는 것이다.
# Splitting the data
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.25, random_state=0)

모델링
이 프로젝트에서 우리는 다섯 가지 서로 다른 기계 학습 모델을 비교할 것이다. 그것이 바로 의사결정 트리, 무작위 삼림, AdaBoost, 사다리 Boost와 XGBoost이다.이 프로젝트의 목적을 위해서 나는 이 모델들의 정확성을 비교하고 싶다.
모델 1: 결정 트리
정책 결정 트리는 유행하는 모델로 운기획학, 전략 기획과 기계 학습에 쓰인다.위의 모든 네모난 블록은 노드라고 불리는데 노드가 많을수록 결정 트리(일반)가 정확해진다.결정 나무의 마지막 노드, 즉 결정을 내리는 노드를 나무의 잎이라고 부른다.결정 트리는 직관적이고 구축하기 쉽지만 정확성에 부족하다.
from sklearn.metrics import classification_report
from sklearn.tree import DecisionTreeClassifier
model1 = DecisionTreeClassifier(random_state=1)
model1.fit(X_train, y_train)
y_pred1 = model1.predict(X_test)
print(classification_report(y_test, y_pred1))
모델 2: 랜덤 숲
무작위 삼림은 결정 트리를 바탕으로 하는 통합 학습 기술이다.무작위 삼림은 원시 데이터의 자진 데이터 집합을 사용하여 여러 개의 결정 트리를 만들고 결정 트리의 모든 단계에서 무작위로 변수 서브집합을 선택한다.그리고 이 모델은 모든 결정 트리의 모든 예측 모델을 선택한다.이것은 무슨 의의가 있습니까?다수의 승리 모델에 의존함으로써 하나의 트리가 잘못될 위험을 줄였다.
예를 들어 우리가 결정 트리를 만들면 세 번째는 0을 예측할 것이다.그러나 만약 우리가 모든 4개의 결정 트리 모델에 의존한다면 예측치는 1이 될 것이다.이것이 바로 랜덤 숲의 힘이다.
from sklearn.ensemble import RandomForestClassifier
model2 = RandomForestClassifier(random_state=1)
model2.fit(X_train, y_train)
y_pred2 = model2.predict(X_test)
print(classification_report(y_test, y_pred2))
모델 3: AdaBoost
다음 세 가지 모델은 증강 알고리즘으로 약한 학습자를 강한 학습자로 바꾸는 것이다.나는 화제를 돌려 이 세 가지 사이의 차이를 설명하고 싶지 않다. 왜냐하면 이것은 매우 복잡하고 복잡하기 때문이다.그럼에도 불구하고 저는 몇 가지 자원을 남길 것입니다. 당신은 그 중에서 AdaBoost, 사다리 강화와 XGBoosting을 이해할 수 있습니다.
상태: AdaBoost
StatQuest: 계단식 향상
상태: XGBoost
from sklearn.ensemble import AdaBoostClassifier
model3 = AdaBoostClassifier(random_state=1)
model3.fit(X_train, y_train)
y_pred3 = model3.predict(X_test)
print(classification_report(y_test, y_pred3))
모델 4: 사다리 상승
from sklearn.ensemble import GradientBoostingClassifier
model4 = GradientBoostingClassifier(random_state=1)
model4.fit(X_train, y_train)
y_pred4 = model4.predict(X_test)
print(classification_report(y_test, y_pred4))
모델 5: XGBoost
import xgboost as xgb
model5 = xgb.XGBClassifier(random_state=1)
model5.fit(X_train, y_train)
y_pred5 = model5.predict(X_test)
print(classification_report(y_test, y_pred5))
다섯 가지 모델을 비교해 보면 랜덤 숲과 XGBoost가 최고 수준의 정확성을 가진 것 같다.그러나 XGBoost는 양질의 포도주를 예측할 때 더 좋은 f1 점수(1)를 가지기 때문에 XGBoost가 더 좋은 모델인 것 같다.

기능 중요성
다음은 랜덤 삼림 모델과 XGBoost 모델의 특징적 중요성을 바탕으로 한 도표입니다.비록 그것들은 약간 다르지만 앞의 세 가지 특징은 알코올, 휘발성 산도와 황산염이다.만약 네가 아래의 도표를 본다면, 데이터 집합은 이 변수들을 더욱 상세하게 비교하기 위해 좋은 품질과 나쁜 품질로 나뉜다.
랜덤 숲
feat_importances = pd.Series(model2.feature_importances_, index=X_features.columns)
feat_importances.nlargest(25).plot(kind='barh',figsize=(10,10))
XG 증압
feat_importances = pd.Series(model5.feature_importances_, index=X_features.columns)
feat_importances.nlargest(25).plot(kind='barh',figsize=(10,10))

이전 4개 기능 비교
 # Filtering df for only good quality
df_temp = df[df['goodquality']==1]
df_temp.describe() 
# Filtering df for only bad quality
df_temp2 = df[df['goodquality']==0]
df_temp2.describe()
연구 세부 사항을 통해 우리는 양질의 포도주의 평균 알코올 함량이 비교적 높고 평균 휘발성 산도가 비교적 낮으며 평균 황산염 함량이 비교적 높고 평균 잔류당 함량이 비교적 높다는 것을 알 수 있다.

좋은 웹페이지 즐겨찾기