メモ > 技術 > プログラミング言語: Python > scikit-learn(機械学習)でワインの品質判定
■scikit-learn(機械学習)でワインの品質判定
Index of /ml/machine-learning-databases/wine-quality
https://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/
GitHub - kujirahand/book-mlearn-gyomu: Book sample (AI Machine-learning Deep-learning)
https://github.com/kujirahand/book-mlearn-gyomu
以下のプログラムで学習&評価できるが、正解率は6〜7割程度と低い
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
from sklearn.metrics import classification_report
# データを読み込む
wine = pd.read_csv("winequality-white.csv", sep=";", encoding="utf-8")
# データをラベルとデータに分離
y = wine["quality"]
x = wine.drop("quality", axis=1)
# 学習用とテスト用に分割する
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2)
# 学習する
model = RandomForestClassifier()
model.fit(x_train, y_train)
# 評価する
y_pred = model.predict(x_test)
print(classification_report(y_test, y_pred))
print("正解率=", accuracy_score(y_test, y_pred))
以下のプログラムで確認すると、品質データの数には大きく偏りがあることが判る
(品質の大半は5〜7で、2以下と10は存在すらしていない)
なお結果のグラフは wine-count-plt.png に出力されるが、出力できるようにあらかじめパーミッションを調整しておく
import matplotlib.pyplot as plt
import pandas as pd
# ワインデータの読み込み
wine = pd.read_csv("winequality-white.csv", sep=";", encoding="utf-8")
# 品質データごとにグループ分けして、その数を数える
count_data = wine.groupby('quality')["quality"].count()
print(count_data)
# 数えたデータをグラフに描画
count_data.plot()
plt.savefig("wine-count-plt.png")
plt.show()
以下のように、品質を3段階に再分類する
これにより、正解率は9割以上になる
1, 2, 3, 4 → 0(悪い)
5, 6, 7 → 1(普通)
8, 9, 10 → 2(良い)
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
from sklearn.metrics import classification_report
# データを読み込む
wine = pd.read_csv("winequality-white.csv", sep=";", encoding="utf-8")
# データをラベルとデータに分離
y = wine["quality"]
x = wine.drop("quality", axis=1)
# yのラベルを付け直す
newlist = []
for v in list(y):
if v <= 4:
newlist += [0]
elif v <= 7:
newlist += [1]
else:
newlist += [2]
y = newlist
# 学習用とテスト用に分割する
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2)
# 学習する
model = RandomForestClassifier()
model.fit(x_train, y_train)
# 評価する
y_pred = model.predict(x_test)
print(classification_report(y_test, y_pred))
print("正解率=", accuracy_score(y_test, y_pred))