機械学習 ワインの品質判定 練習問題

機械学習

【教師あり学習】機械学習でワインの品質判定を行ってみよう【scikit-learn】

2020年7月31日

こんにちは。産婦人科医のtommyです(Twitter:@obgyntommy)。

 

この記事では、ワインのデータセットを用いた教師あり機械学習の一通りの流れをscikit-learnを用いて学びます。

 

教師あり機械学習の一般的な流れは以下の通りです。

 

 教師あり学習の機械学習の流れ

  1. データセットの読み込み
  2. データの前処理
  3. 探索的データ解析(EDA;Explanatory Data Analysis)
  4. 機械学習予測モデルの作成
  5. 性能評価

 

scikit-learnを用いた機械学習の流れについては、以下の記事を参照して下さい。

AI python 機械学習 scikit-learnを使用して予測モデル(機械学習アルゴリズム)を作成し評価する
【機械学習】scikit-learnの使い方【基礎から全て解説】

続きを見る

 

又、Google Colaboratoryの使い方については以下の記事を参照して下さい。

Google Colaboratory グーグルコラボラトリー グーグルコラボ 使い方
Google Colaboratoryの使い方【完全マニュアル】

続きを見る

 

尚、ワインのデータセットを用いた教師なしの機械学習についてはこちらの記事をご参照下さい。

Scikit-learn 乳がんデータセット 機械学習
scikit-learn の乳がんデータセットで機械学習を行う

続きを見る

 

では早速、1つ1つ確認していきましょう。

Wineデータセットの読み込みと内容確認

機械学習 ワインの品質判定 練習問題

記事を読まなくても、こちらのGooogle Colaboratoryの共有ファイルで確認出来ますので参照されて下さい。

 

scikit-learnのライブラリから「wine」のデータセットを読み込みます。

 

wineのデータセットは典型的な多値分類のデータセットです。アルコール量やマグネシウム量などの成分のデータから、ワイン3種の分類を行うためのデータセットになります。

 

wineデータセット(https://scikit-learn.org/stable/modules/generated/sklearn.datasets.load_wine.html) の中身を確認します

 

In[]

 

Out[]

 

このデータセットの中身はpythonの辞書型になっていますので、取得したい対象のキーを以下のように指定することによって対象の中身(バリュー)を取得できます。

 

以下は正解ラベルの取得を行なっています。

 

In[]

 

Out[]

 

データの前処理

機械学習 ワインの品質判定 練習問題

次に $x$ を特徴量、$y$ を正解ラベルとし前処理を行なっていきます。

 

まずは正解ラベルの前処理を行います。

 

元のデータは0, 1, 2 という整数型のデータになっていますが、今回は分類問題のためにこれをカテゴリカル変数に変換します。

 

In[]

 

Out[]

 

続いて、特徴量の前処理を行います。特徴量の名前は feature_names、値はdataキーに含まれていますのでそれを用います。

 

In[]

 

Out[]

 

describeメソッドによって、一括で全ての特徴量の統計値の概要を表示できます。

 

In[]

 

Out[]

※ 出力結果は一部分のみ掲載しています。

 

続いて、全てのデータを学習用と評価用に分割します。これにはsklearnの train_test_split メソッドを使います。

 

学習用データと評価用データの数の割合ですが、今回は2:1とします。

 

※ 2:1でなければならないというわけではなく、一般的には評価用データ数が全体の2-4割程度にすることが多いです。

 

In[]

 

学習データの特徴量と正解ラベルを1つのデータセットとしてまとめます。

 

In[]

 

続いて、学習用データセットの特徴量と正解ラベルの型を確認します。pandasのinfoメソッドにより全てのカラムの型を確認できます。

 

In[]

Out[]

全ての特徴量が浮動小数点数(float型)ということが確認できました。

 

探索的データ解析(EDA)

機械学習 ワインの品質判定 練習問題

続いて、このデータに関して探索的データ解析(EDA)を行なっていきます。

 

探索的データ解析(EDA)の目的ですが、これから機械学習を使って分類を行なっていきますが、その前に『分類が可能そうかそうでないか』を見極めるのが重要となります。

 

注意

目的なくデータ全体の平均や分散を算出するだけでは意味がありません。

 

このデータセットは特徴量が浮動小数点数(float型)で構成されているため、値の大小でクラス分けが大体できれば理想的になります。

 

クラス、特徴量ごとの平均をまずは算出してみます。

 

In[]

 

Out[]

※ 出力結果は一部分のみ掲載しています。

 

特徴量は目で確認するにはそれほどでもない数なので、特徴量ごとに値を確認してみましょう。

 

そうすると" proline " ," flavanoids " ," color_intensity "あたりの特徴量がクラスごとに差があることが分かります。

 

In[]

 

Out[]

 

 

 

 

 

続いてこれらの特徴量をもう少し詳細に確認していきます。

 

箱ひげ図を用いることによりデータの分布を考慮したクラスごとの違いを確認します。

 

描画にはseabornライブラリの boxplot メソッドを使うと便利です。

 

In[]

 

Out[]

 

In[]

 

Out[]

In[]

 

Out[]

prolineは class_0 と他クラス、color_intensityclass_1 と他クラスを分類するのに有用そうです。

 

また、flavanoids はこれだけでも全てのクラスを分類できそうですね。(25%-75%点の部分でクラス感の被りが無いですね。)

 

続いて散布図により、2つの特徴量でクラスが上手く分類できそうかを確認してみます。

 

これも seaborn の scatterplot メソッドを使うと便利です。

 

seabornの使い方については以下の2つの記事を参考にして下さい。

 

PythonのライブラリSeabornの使い方【前編】 - Tommy blog 
PythonのライブラリSeabornの使い方【前編】 - Tommy blog 

続きを見る

PythonのライブラリSeabornの使い方【後編】
PythonのライブラリSeabornの使い方【後編】

続きを見る

 

In[]

 

Out[]

In[]

 

Out[]

以上から、それぞれのクラスが上手く纏まっており機械学習などの手法によりクラス分類が可能そうという目処がつきました。

 

よってこれよりクラス分類を行うモデルの作成を行なっていきます。

 

機械学習予測モデルの作成

機械学習 ワインの品質判定 練習問題

機械学習予測モデルの作成を行います。すでに前処理は完了していますので、機械学習モデルのハイパーパラメータ探索から行います。

 

今回は機械学習モデルとしてランダムフォレスト、ハイパーパラメータ探索としてグリッドサーチを用います。

 

両方ともsklearnのクラスとして用意されています。

 

In[]

 

ランダムフォレストのハイパーパラメータについては色々ありますが、今回は代表的なもののみ取り上げることにします。

 

ランダムフォレストについては以下の記事を参考にして下さい。

 

【機械学習】ランダムフォレストとは【特徴の解説から実装まで】 - Tommy blog 
【機械学習】ランダムフォレストとは【特徴の解説から実装まで】 - Tommy blog 

続きを見る

 

max_depth(木深さ)、n_estimators(木の数)、min_samples_split(木ノードにおいてそれ以上分割を行うための最少サンプル数)

 

GridSearchCVの引数について説明しておきます。 scoringについては今回はaccuracyにしております。

 

不均衡データについて

ただし不均衡データの場合はaccuracyからは変えたほうが良い場合があります。これは別途記事にて解説します。

 

cvはクロスバリデーションにおけるデータセットの分割数ですが、これは一般的には3-10くらいの場合が多いです。

 

もちろん分割数が多いほど結果の信頼性が高まりますが、その分計算時間が増大します。

 

グリッドサーチの手順としては、ハイパーパラメータの候補を作成し、それを元にグリッドサーチのインスタンスを作成、データをフィッティングさせます。

 

In[]

 

Out[]

どのハイパーパラメータが最も良い性能を及ぼすかは、フィッティングさせたインスタンス(cld f)の best_params_ メソッドで確認することができます。

 

best_paras_メソッドは以下を参照しましょう。

sklearn.model_selection.GridSearchCV — scikit-learn 0.23.2 documentation
sklearn.model_selection.GridSearchCV — scikit-learn 0.23.2 documentation

続きを見る

 

In[]

 

Out[]

 

また、このハイパーパラメータを採用した際のモデルは best_estimator_メソッド により作成が可能です。

 

In[]

 

性能評価

機械学習 ワインの品質判定 練習問題

続いて、予測と性能評価を行いましょう。

 

※性能は正解データと予測データがどの程度合致しているかということですが、一般的にはprecision、recall、f1-score、accuracyの4種類があります。

 

(説明は割愛しますが、本来はデータ分析の背景からこのどれを選ぶかを決定することが多いです。)

 

今回は元々性能指標として設定していたaccuracyに注目することにしましょう。

 

accuracy 含め性能評価結果は sklearn の classification_report によって一括で算出することが可能です。

 

In[]

 

Out[]

以上の結果から、十分な性能が得られていることが分かります。

まとめ:【教師あり学習】ワインの品質判定を行ってみた

機械学習 ワインの品質判定 練習問題

以上がワインのデータセットを用いた教師あり学習の機械学習の練習問題となります。

 

実際に手を動かされると分かるかと思いますが、それほど難しい内容ではありません。

 

機械学習を勉強し始めた方の学習の一助になれば幸いです。

 

今回用いたワインのデータセットを使用して行う、教師なしの機械学習についてもセットで学習しましょう。

機械学習 教師なし学習 ワインの品質判定 データセット 練習問題
【教師なし学習】機械学習でワインの品質判定を行ってみよう【scikit-learn】

続きを見る

 

今回は以上となります。

 

 

人気記事 【入門から上級レベルまで】人工知能・機械学習の学習の為におすすめの書籍25選

人気記事 無料あり:AI(機械学習)特化型おすすめプログラミングスクール3社


-機械学習
-, ,

Copyright© Tommy blog  , 2020 All Rights Reserved.