Python機械学習ライブラリScikit-learn その49:ワインの分類のデータセットの紹介

目次

機械学習ライブラリScikit-learn

前回まで機械学習ライブラリScikit-learnの手書き数字のデータセットを使って、色々な機械学習モデルを試してきました。

Scikit-learnにはあと3つデータセットがあるのですが、これまで結構色々な事をやってきたので、そろそろもっと実践的なデータセットに移りたい。。。そんな思いが芽生えてきました。

ということで残り3つのデータセットに関しては、紹介だけということにしたいと思います。

そしてまた後ほど必要があれば、随時詳細を解説していくことにしましょう。

今回は3つのデータセットのうち「ワインの分類」のデータセットを紹介していきます。

このデータセットはワイン中に含まれる成分から、どんな種類のワインかを分類するというデータセットになります。

ではでは進めていきましょう。

データセットの読み込み

まずはデータセットを読み込んでいきます。

手間を省くため、オプションを「as_Frame = True」としてPandasのデータセット形式で読み込みましょう。

<セル1>

from sklearn.datasets import load_wine

wine = load_wine(as_frame=True)

print(wine.keys())

実行結果
dict_keys(['data', 'target', 'frame', 'target_names', 'DESCR', 'feature_names'])

次にデータフレームを表示してみます。

<セル2>

wine.frame

実行結果

これで読み込みが完了しました。

データセットの概要を確認

次にデータセットの概要を確認してみましょう。

<セル3>

print(wine.DESCR)

実行結果
.. _wine_dataset:

Wine recognition dataset
------------------------

**Data Set Characteristics:**

    :Number of Instances: 178 (50 in each of three classes)
    :Number of Attributes: 13 numeric, predictive attributes and the class
    :Attribute Information:
 		- Alcohol
 		- Malic acid
 		- Ash
		- Alcalinity of ash  
 		- Magnesium
		- Total phenols
 		- Flavanoids
 		- Nonflavanoid phenols
 		- Proanthocyanins
		- Color intensity
 		- Hue
 		- OD280/OD315 of diluted wines
 		- Proline

    - class:
            - class_0
            - class_1
            - class_2
		
    :Summary Statistics:
    
    ============================= ==== ===== ======= =====
                                   Min   Max   Mean     SD
    ============================= ==== ===== ======= =====
    Alcohol:                      11.0  14.8    13.0   0.8
    Malic Acid:                   0.74  5.80    2.34  1.12
    Ash:                          1.36  3.23    2.36  0.27
    Alcalinity of Ash:            10.6  30.0    19.5   3.3
    Magnesium:                    70.0 162.0    99.7  14.3
    Total Phenols:                0.98  3.88    2.29  0.63
    Flavanoids:                   0.34  5.08    2.03  1.00
    Nonflavanoid Phenols:         0.13  0.66    0.36  0.12
    Proanthocyanins:              0.41  3.58    1.59  0.57
    Colour Intensity:              1.3  13.0     5.1   2.3
    Hue:                          0.48  1.71    0.96  0.23
    OD280/OD315 of diluted wines: 1.27  4.00    2.61  0.71
    Proline:                       278  1680     746   315
    ============================= ==== ===== ======= =====

    :Missing Attribute Values: None
    :Class Distribution: class_0 (59), class_1 (71), class_2 (48)
    :Creator: R.A. Fisher
    :Donor: Michael Marshall (MARSHALL%PLU@io.arc.nasa.gov)
    :Date: July, 1988

(以下略)

Alcohol:アルコール濃度

Malic acid:リンゴ酸濃度

Ash:灰分濃度

Alcalinity of ash:灰のアルカリ性

Magnesium:マグネシウム量

Total phenol:フェノール量

Flavanoids:フラバノイド量

Nonflavanoid phenols:非フラバノイドフェノール類の量

Proanthocyanins:プロアントシアニン

Color intensity:色の強度

Hue:色調

OD280/OD315 of diluted wines:薄めたワインの280nmと315nmの波長の光に対する濁度

Proline:プロリン量

これらの値から「Class1」、「Class2」、「Class3」のカテゴリに分類します。

しかしワインには色々な成分がふくまれているのですね。

こういった普段考えていないような情報に当たれるのも、機械学習を学ぶいい点だと思います。

LinearSVCで機械学習してみる

このデータセットは「分類」をするデータセットなので、手書き数字のデータセットの時に使った「LinearSVC」 モデルを使って機械学習してみましょう。

<セル4>

from sklearn.svm import LinearSVC
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

x = wine.frame.iloc[:, 0:-1]
y = wine.frame.iloc[:, -1]

x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, train_size=0.8)

model = LinearSVC()
model.fit(x_train, y_train)
pred = model.predict(x_test)

print(accuracy_score(y_test, pred))

実行結果
0.9166666666666666
/opt/anaconda3/lib/python3.7/site-packages/sklearn/svm/_base.py:977: ConvergenceWarning: Liblinear failed to converge, increase the number of iterations.
  "the number of iterations.", ConvergenceWarning)

警告が出てしまいました。

「increase the number of iterations」、つまり「繰り返し回数を増やしてくれ」ということなので、「max_iter」のオプションをつけて試してみましょう。

<セル4 修正>

from sklearn.svm import LinearSVC
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

x = wine.frame.iloc[:, 0:-1]
y = wine.frame.iloc[:, -1]

x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, train_size=0.8)

model = LinearSVC(max_iter = 100000000)
model.fit(x_train, y_train)
pred = model.predict(x_test)

print(accuracy_score(y_test, pred))

実行結果
0.9722222222222222

「max_iter」を100000000にしたら警告が出なくなりました。

結果も「0.97222」とかなり高くてこのままでも十分そうです。

では次回は残り2つのうち、生理学的データと運動能力の関係のデータセットを紹介します。

ということで今回はこんな感じで。

よかったらシェアしてね!

コメント

コメントする

目次
閉じる