この記事では、Pythonプログラミング言語を使って、様々な特徴に基づいてワインを分類する方法を学びます。
こちらもご覧ください。
ワインの分類入門
デザートワイン、スパークリングワイン、前菜、ポップワイン、テーブルワイン、ヴィンテージワインなど、世の中には数多くのワインが存在します。
どのワインが良くて、どのワインがダメなのか、どうやって知ることができるのだろうかと思うかもしれない。
その答えは、機械学習です。
ワインを分類する方法は数多くあります。
ここでは、そのいくつかを紹介します。
-
- CART
- ロジスティック回帰
- ランダムフォレスト
- ナイーブ・ベイズ
- パーセプション
- SVM
- KNN
Wine分類をPythonで実装する
それでは、Pythonでワイン分類器の基本的な実装を行ってみましょう。
これは、分類器がどのように動作するのか、そして様々な実世界のシナリオのためにPythonでどのように実装できるのかを学ぶための出発点となります。
1. モジュールのインポート
まず最初に、必要なモジュールやライブラリをすべてプログラムにインポートします。
分類に必要なモジュールは、以下のようないくつかの基本的なモジュールです。
-
- Numpy
- Pandas
- matplotlib
次のステップは、すべてのモデルをsklearnライブラリに付属するプログラムにインポートすることです。
また、sklearnライブラリの他の関数もいくつか含めます。
読み込まれたモデルは以下の通りです。
- SVM
- ロジスティック回帰
1
2
3
4
5
6
7
8
9
|
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn import svm
from sklearn import metrics
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report
from sklearn.metrics import confusion_matrix,accuracy_score
from sklearn.preprocessing import normalize
|
2. データセットの準備
次に、データセットを準備する必要があります。
まずはデータセットを紹介し、それをアプリケーションにインポートしてみます。
2.1 データセットの紹介
データセットには、6497 個のオブザベーションと、合計 12 個の特徴があります。
どの変数にもNAN値はありません。
データはここから簡単にダウンロードできます。
12の特徴量の名前と説明は次のとおりです。
- 固定酸度。固定酸度:ワインに含まれる酸の量
- 揮発性酸度。ワインに含まれる酢酸の量
- クエン酸。クエン酸:ワインに含まれるクエン酸の量
- 残留糖分。発酵後の糖分量
- 塩化物 ワインに含まれる塩分の量
- 遊離二酸化硫黄の量 遊離型の二酸化硫黄の量
- 全二酸化硫黄。総二酸化硫黄:遊離型と結合型の二酸化硫黄の量
- 密度。ワインの密度(質量/体積)
- pH:ワインのpH 0~14の範囲
- 硫酸塩。ワインに含まれる二酸化硫黄ガス(S02)レベル量
- アルコール アルコール: ワインに含まれるアルコールの量
- 品質。ワインの最終的な品質
2.2 データセットのロード
データセットは read_csv
関数を用いてプログラムにロードし、 head
関数を用いてデータセットの最初の5行を表示します。
1
2
|
data = pd.read_csv( "./wine_dataset.csv" )
data.head() |
data=data.drop('Unnamed: 0',axis=1) data.dropna() |
2.3 データのクリーニング
データセットのクリーニングは、以下のコードを用いて不要な列やNaN値を削除します。
1
2
3
4
5
6
7
8
|
plt.style.use( 'dark_background' )
colors = [ 'blue' , 'green' , 'red' , 'cyan' , 'magenta' , 'yellow' , 'blue' , 'green' , 'red' , 'magenta' , 'cyan' , 'yellow' ]
plt.figure(figsize = ( 20 , 50 ))
for i in range ( 1 , 13 ):
plt.subplot( 6 , 6 ,i)
plt.hist(data[data.columns[i - 1 ]],color = colors[i - 1 ])
plt.xlabel(data.columns[i - 1 ])
plt.show() |
2.4 データの可視化
重要なステップは、データをさらに処理する前に、まずデータを可視化することです。
可視化は次の2つの形式で行われる。
- ヒストグラフ
- シーボーングラフ
ヒストグラムのプロット
1
2
3
4
5
|
import seaborn as sns
plt.figure(figsize = ( 10 , 10 ))
correlations = data[data.columns].corr(method = 'pearson' )
sns.heatmap(correlations, annot = True )
plt.show() |
各特徴のヒストグラムを個別にプロットします。
出力は以下のように表示されます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
split = int ( 0.8 * data.shape[ 0 ])
print ( "Split of data is at: " ,split)
print ( " )
train_data = data[:split]
test_data = data[split:]
print ( 'Shape of train data:' ,train_data.shape)
print ( 'Shape of train data:' ,test_data.shape)
print ( " )
y_train = train_data[ 'quality' ]
y_test = test_data[ 'quality' ]
x_train = train_data.drop( 'quality' ,axis = 1 )
x_test = test_data.drop( 'quality' ,axis = 1 )
print ( 'Shape of x train data:' ,x_train.shape)
print ( 'Shape of y train data:' ,y_train.shape)
print ( 'Shape of x test data:' ,x_test.shape)
print ( 'Shape of y test data:' ,y_test.shape)
nor_train = normalize(x_train)
nor_test = normalize(x_test)
|
シーボーンをプロットする
1
2
3
4
|
clf = svm.SVC(kernel = 'linear' )
clf.fit(nor_train, y_train) y_pred_svm = clf.predict(nor_test)
print ( "Accuracy (SVM) :" ,metrics.accuracy_score(y_test, y_pred_svm) * 100 )
|
Seabornグラフは、データセットに存在する異なる特徴間の関係を表示するために使用されます。
1
2
3
4
|
logmodel = LogisticRegression()
logmodel.fit(nor_train, y_train) y_pred_LR = logmodel.predict(nor_test)
print ( 'Mean Absolute Error(Logistic Regression):' , metrics.mean_absolute_error(y_test, y_pred_LR) * 100 )
|
2.5 訓練とテストの分割とデータの正規化
データをトレーニングデータとテストデータに分割する場合、最適な分割比率はありません。
しかし、公平な分割ルールの1つは80/20ルールであり、データの80%をトレーニングデータ、残りの20%をテストデータにします。
このステップでは、データセットの正規化も行います。
この記事もチェック:Ubuntu 20.04 Focal Fossaのダウンロード先はこちらです。
3. ワイン分類モデル
このプログラムでは、SVMとLogistic Regressionの2つのアルゴリズムを使用しています。
3.1 サポートベクターマシン(SVM)アルゴリズム
モデルの精度は50%程度であることがわかった。
3.2 ロジスティック回帰アルゴリズム
この場合も精度は50%程度であることがわかります。
この主な理由は、使用した/作成したモデルにあります。
まとめ
より高い精度を得るために、tensorflowのモデルもチェックしてみてくださいね。
今後もこのようなチュートリアルを続けていきます お読みいただきありがとうございました。