戻る
■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))