【Python】機械学習でワインの品質を判定する

 

この記事では、ワインのデータ(アルコール度数、pH、酸性度…)を学習して品質を判定するコードを書いてみたいと思います。

 

「機械学習の使い方を学びたい」

「Pythonで機械学習のコードを書いてみたい」

 

そんな方に読んでいただければと思います。

 

スポンサーリンク

使用するデータ

 

UCI Machine Learning Repositoryという機械学習向けデータセットを無料で公開しているサイトがあります。

 

このサイトの白ワインのデータセット(winequality-white.csv)を使ってみます。

 

https://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/

 

CSVのカラムをみてみましょう。

 

 

 

酸性度(fixed acidity)や揮発性酸度(volatile acidity)などのワインのデータが11個あり、最後のカラムに品質(quality)があることが分かります。

 

品質は0〜10で評価されており、数字が高いほど良いです。

 

SVM(サポートベクターマシン)を使う

 

まずは、データのクラス分類に有効なSVMのLinearSVCを使ってみます。

 

コードの流れは以下の通り。

 

  1. pandasでデータを読み込み、データとラベルに分割する。
  2. 訓練用とテスト用にデータを分ける
  3. 学習する
  4. 予測する

 

 

 

あまり精度はよくありませんね。

 

ランダムフォレストを使う

 

では、複数の分類器を使って精度を向上させるランダムフォレスト(Random Forests)という手法を使ってみます。

 

コードの流れは全く同じで、学習器の指定の部分だけ違っています。

 

 

 

精度は大幅に改善したようです。さすがランダムフォレスト。

 

ただし、よく見るとワーニング「UndefinedMetricWarning」が出ています。これは全てのラベルにデータが分類されていないという意味です。

 

pandasのgroupbyを使って、それぞれの品質(quality)の数を数えてみます。

 

 

 

11段階の評価と言いつつ、3から9しかありませんしデータが偏っています。これを不均衡データと言います。

 

ラベルを振り直す

 

ラベルを3つにして再度学習してみます。品質が4以下は0(悪い)、5〜7は1(普通)、8以上は2(良い)とラベルを振り直してみます。

 

 

新しいラベルデータ(new_y)を使って、以下のように学習、判定してみます。

 

 

 

かなり精度が向上しました。

 

学習アルゴリズムやパラメータを変更する方法の他に、ラベルを振り直す方法を学びました。かなり有効なので、覚えておきたいですね。

 

参考