【scikit-learn入門】ロジスティック回帰を使ってワイン分類をやってみよう

データサイエンス
スポンサーリンク

スポンサーリンク

はじめに

ゆうき
ゆうき

こんにちは。学生エンジニアのゆうき(@engieerblog_Yu)です。

今回はscikit-learnというデータ分析のライブラリを使ってワイン分類を行っていこうと思います。

今回の記事をお勧めする方は

データ分析に興味がある

scikit-learnを使ってみたい

機械学習を使って分類問題を解いてみたい

に当てはまる人です。

今回の制作物

今回はこのようなワインのデータセットを使って以下の画像のように分類を行っていきます。

今回は注目するのはClass labelという列です。

Class labelに値する、ワインの種類を他のデータから予測できるように機械学習を行っていきます。

ねこすけ
ねこすけ

お酒は飲めないにゃ。

ゆうき
ゆうき

まずは教師あり学習についての説明です。

教師あり学習について

教師あり学習とは正解データが事前に用意されているものです。

反対に教師なし学習であれば正解データは事前に用意されていません。

分類問題は教師あり学習に分類され、教師あり学習には主に以下の二つのものがあります。

【教師あり学習】

・回帰問題

・分類問題

今回行うものは教師あり学習の分類問題ということをしっかり理解していただきたいと思います。

ねこすけ
ねこすけ

わかったにゃ。

また回帰問題についての記事も投稿しています。

ロジスティック回帰について

次にロジスティック回帰とは何なんかということについてです。

ロジスティック回帰は主に○か×かで表されるデータに対して使われます。

例えば

試験に合格するか否か

タイタニック号に乗っていた人が生きているか死んでいるか

などです。

○×で表されるデータは数値で表すデータが量的データと表されるのに対して質的データといいます。

ロジスティック回帰は予測モデルの出力が必ず0から1の値をとります。

上記の試験で例えると

0が不合格、1が合格と対応させて、出力結果が0.8であれば合格する確率は80%ということです。

ロジスティック回帰の式はこのようになります。

$$y=\frac{1}{1+e^{-\theta ^{T}x}}$$

$$\theta=\left( \theta _{1}\theta _{2}\ldots \cdot \theta _{n}\right) ^{T}$$

ねこすけ
ねこすけ

難しそうだにゃ。

この場合のθは説明変数の値を表しています。

試験であれば勉強時間であったり、部活に入っているか否か、などの値が入ります。

図で表すとこのようになります。

ロジスティック回帰は勉強時間、通学時間、部活などの情報を入れると合格する確率を出力してくれるというようなものです。

ねこすけ
ねこすけ

なんとなくわかったにゃ。

ロジスティック回帰の予測モデルをグラフで表すと以下のようなものになります。

以下のシグモイド関数と呼ばれるものを基本としθの値によって形状が変わります。

といっても式を見ていただけたら分かるとおり、θが変化しても、yの値が0から1であることは変わりません。

ねこすけ
ねこすけ

やっぱり、難しいにゃ。

 
ゆうき
ゆうき

難しいと思った方はとりあえずロジスティック回帰は○×問題を解けるくらいの認識で大丈夫です。

ゆうき
ゆうき

ところで不思議に思っている方はいませんか?

ロジスティック回帰には○か×かの2クラスに分けるだけの機能しかないのに今回は3クラスに分けることができています。

ロジスティック回帰で3クラス以上に分類したいときはOVR(One Vs Rest)といった手法を使うことができます。

OVR(One Vs Rest)について

ロジスティック回帰で多クラス分類を行いたい時に使われる手法の一つにOVRがあります。

OVRの原理は簡単で、多クラスをロジスティック回帰を用いて二つに分けるという作業を繰り返すことで分類するといったものです。

つまり今回のような3クラス分類であれば2クラスに分ける作業を3回行うということです。

これによって3クラスそれぞれの境界を求めることができます。

ゆうき
ゆうき

それでは実際に分類問題を解いていきましょう!

ライブラリのインポート

ゆうき
ゆうき

今回使用するライブラリは以下です。

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from mlxtend.plotting import plot_decision_regions
from sklearn.ensemble import RandomForestRegressor

データの読み込み

ゆうき
ゆうき

まずはワインのデータを読み込んでいきましょう。

#データの読み込み
df_wine = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.data',header=None)

# カラムの名前の設定
df_wine.columns = ['Class label','Alcohol','Malic acid','Ash','Alcalinity of ash','Magnesium','Total phenols','Flavanoids','Nonflavanoid phenols','proanthocyanins','Color intensity','Hue','OD280/OD315 of diluted wines','Proline']
# データの確認
df_wine.head()
ねこすけ
ねこすけ

しっかり読みこめてるにゃ。

説明変数と目的変数の代入

今回は10番目の色の要素と13番目のプロリンの量を説明変数としました。

なぜこの二つを説明変数にしたかについては後ほど述べます。

# 説明変数と目的変数の代入
X = df_wine.iloc[:,[10,13]].values
y = df_wine.iloc[:,0].values-1

訓練データとテストデータの分割

今回は訓練データとテストデータを8:2に分割していきます。

X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2,random_state=0)
ゆうき
ゆうき

慣例としては割合は8:2か7:3が良いとされています。

標準化

次にデータを揃えるために標準化を行っていきます。

標準化を行うことでデータの平均が0、標準偏差が1になります。

# 標準化を行う
sc = StandardScaler()
X_train_std = sc.fit_transform(X_train)
X_test_std = sc.fit_transform(X_test)

ロジスティックモデルの作成

ゆうき
ゆうき

ロジスティックモデルのパラメータについての説明です。

max_iter勾配降下法を行う回数
multi_class多クラス分類の方法を’ovr’,’multinomial’,’auto’から選ぶ
solver計算に使用するライブラリ
C正則化の強さを表し、値が大きいほど正則化の効果は弱くなる
penalty正則化を’l1′,’l2′,’elasticnet’から選択
l1_ratioelasticnetを選んだ時のl1正則化の割合を指定する
random_state乱数のシードを指定
ロジスティック回帰のパラメータについて

今回は先ほど説明したovrを使っていきます。

# ロジスティックモデルの作成
logistic_model = LogisticRegression(max_iter=100,multi_class='ovr',solver='liblinear',C=1.0,penalty='l2',l1_ratio=None,random_state=0)
model.fit(X_train_std,y_train)
ゆうき
ゆうき

それでは出来上がったモデルがどんなもんか確かめていきましょ〜。

モデルの評価

# モデルの評価
y_test_pred = model.predict(X_test_std)
ac_score = accuracy_score(y_test,y_test_pred)
ゆうき
ゆうき

89パーセント程度の正確さで予測できていることがわかります。

訓練データの結果のプロット

ゆうき
ゆうき

それでは訓練データとテストデータをそれぞれプロットしていきましょう。

plt.figure()
plot_decision_regions(X_train_std,y_train,model)

テストデータの結果のプロット

ゆうき
ゆうき

次に本当にモデルが良いものなのかどうかテストデータで確かめてみましょう。

plt.figure()
plot_decision_regions(X_test_std,y_test,model)
ゆうき
ゆうき

89%で予測できているので大方良いモデルだと思います。

ランダムフォレストを用いた特徴量の重要度の確認

最後に何故10番目と13番目の項を選んだのかについて説明したいと思います。

ランダムフォレストというモデルを使うと特徴量の重要度を評価することができます。

# 説明変数と目的変数の代入
X = df_wine.loc[:,"Alcohol":"Proline"].values
y = df_wine.iloc[:,0].values-1

#訓練データとテストデータの分割
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2,random_state=0)

# モデルの作成
forest_model = RandomForestRegressor(bootstrap=True,n_estimators=1000,criterion='mse',max_depth=None,random_state=0,n_jobs=-1)

# モデルにフィットさせる
forest_model.fit(X_train,y_train)

以下の配列を見ると10番目と13番目の値が大きいことがわかります。

ゆうき
ゆうき

ランダムフォレストで分類問題を解いている記事も合わせてどうぞ。

おわりに

今回はscikit-learnというデータ分析のライブラリを使ってワイン分類を行っていきました。

データサイエンスを少しでも楽しんでいただけたら嬉しいです。

続きとして主成分分析を使った記事もお勧めです。

ねこすけ
ねこすけ

他にもいろんな投稿があるにゃ。

コメント

タイトルとURLをコピーしました