Aidemyワインのデータでの機械学習を実施
概要
仕事でAIに触れることが増え、G検定を取得しようと思い、Aidemyの自然言語学習をはじめました。
過去組み込みのソフトウェアをC言語で扱い、その後FPGAでコードを記述してきたが、既に10年以上開発に携わっておらず四苦八苦しました。
また、仕事では外注先に実装をしていたため、実務から離れると技術者としての能力が落ちていると感じることがありました。
目的
ワインの品質判定のデータベースを使用し、機械学習の4種類の手法を使用して正解率の違いについて比較を行った。
このワインデータはUCIが公開している機械学習のデータとなっており、有名なデータセットである。
1.ランダムフォレスト
2.ロジスティック回帰
3.決定木
4.k-NN
検証条件
Windows10
Python3
Google Colaboratory
使用したデータ
# データの読み込み
import pandas as pd
wine = pd.read_csv("winequality-red.csv", sep=";", encoding="utf-8")
wine
結果
以下の結果より、ランダムフォレストの正解率が一番高いことが分かった。
各モデルの考察については下段に記載している。
1.決定木 正解率 = 0.6125
2.ランダムフォレスト 正解率 = 0.71875
3.ロジスティック回帰 正解率 = 0.590625
4.k-NN 正解率 = 0.51875
コードについて
ダウンロードデータであるPandasのデータを使用しているqualityがy:目的変数であり、残りのデータをx:説明変数とした。
train_test_splitでテスト用データを20%、トレーニングデータを80%の割合として設定し、機械学習を行う。
各モデルの考察
1.決定木
ツリー型のアルゴリズムの代表である決定木である。
教師データから条件式を作成し、予測の際に木の根から順番に条件分岐をたどっていき、葉(条件式の末端)に到達すると予測結果を返すアルゴリズムである。
# 学習データをダウンロードする
from urllib.request import urlretrieve
url = "https://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/winequality-red.csv"
savepath = "winequality-red.csv"
urlretrieve(url, savepath)
# データの読み込み
import pandas as pd
wine = pd.read_csv("winequality-red.csv", sep=";", encoding="utf-8")
wine
# データをラベルとデータに分離
#目的変数:Y:品質を抜き出し
y = wine["quality"]
#csvファイルquality以外をxに保存
x = wine.drop("quality", axis=1)
# 学習用とテスト用に分類する
from sklearn.model_selection import train_test_split
#1599のデータのうちトレーニングデータとして80%ランダムに抜き出している。残りの20%をテストデータとして使用している。
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, train_size=0.8, shuffle=True)
# 学習する
from sklearn.tree import DecisionTreeClassifier
model = DecisionTreeClassifier()
#モデルにトレーニングデータを入れる。
model.fit(x_train, y_train)
# 正解率
from sklearn.metrics import accuracy_score
# fitで学習したデータを元にテストデータのxに対するqualityの予測値
y_pred = model.predict(x_test)
print("正解率 = ", accuracy_score(y_test, y_pred))
2.ランダムフォレスト
ランダムフォレストは決定木を応用したアルゴリズムである。利用する標本をランダムに選択し、利用する特徴量をランダムに選択して複数の決定木を作る。これにより、決定境界が滑らかになり、決定木単体より高い性能が見込める。そのため、前段の決定木に比べて正解率が高い結果となった。
特に決定木の枝刈りをしないため、木の数、深さと調整すべきパラメータも少なく、過学習しやすい傾向にある。予測性能は決定木よりも高くパラメータ数が少ないためチューニングも比較的簡単である。
# 学習データをダウンロードする
from urllib.request import urlretrieve
url = "https://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/winequality-red.csv"
savepath = "winequality-red.csv"
urlretrieve(url, savepath)
# データの読み込み
import pandas as pd
wine = pd.read_csv("winequality-red.csv", sep=";", encoding="utf-8")
wine
# データをラベルとデータに分離
#目的変数:Y:品質を抜き出し
y = wine["quality"]
#csvファイルquality以外をxに保存
x = wine.drop("quality", axis=1)
# 学習用とテスト用に分類する
from sklearn.model_selection import train_test_split
#1599のデータのうちトレーニングデータとして80%ランダムに抜き出している。残りの20%をテストデータとして使用している。
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, train_size=0.8, shuffle=True)
# 学習する
from sklearn.linear_model import LogisticRegression
model = LogisticRegression()
#モデルにトレーニングデータを入れる。
model.fit(x_train, y_train)
# 正解率
from sklearn.metrics import accuracy_score
# fitで学習したデータを元にテストデータのxに対するqualityの予測値
y_pred = model.predict(x_test)
print("正解率 = ", accuracy_score(y_test, y_pred))
3.ロジスティック回帰
ロジスティック回帰は、回帰という名前が付いているが分類のためのアルゴリズムである。シンプルな方法だが、パラメータ数もそれほど多くなく予測に時間がかからないこともあるため、様々な機械学習アルゴリズムを比較する際のベースラインとして、よく使用されている。例として、Googleマップでは、駐車場の空き具合を推定するのに工夫した特徴量とロジスティック回帰が使用されている。
# 学習データをダウンロードする
from urllib.request import urlretrieve
url = "https://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/winequality-red.csv"
savepath = "winequality-red.csv"
urlretrieve(url, savepath)
# データの読み込み
import pandas as pd
wine = pd.read_csv("winequality-red.csv", sep=";", encoding="utf-8")
wine
# データをラベルとデータに分離
#目的変数:Y:品質を抜き出し
y = wine["quality"]
#csvファイルquality以外をxに保存
x = wine.drop("quality", axis=1)
# 学習用とテスト用に分類する
from sklearn.model_selection import train_test_split
#1599のデータのうちトレーニングデータとして80%ランダムに抜き出している。残りの20%をテストデータとして使用している。
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, train_size=0.8, shuffle=True)
# 学習する
from sklearn.linear_model import LogisticRegression
model = LogisticRegression()
#モデルにトレーニングデータを入れる。
model.fit(x_train, y_train)
# 正解率
from sklearn.metrics import accuracy_score
# fitで学習したデータを元にテストデータのxに対するqualityの予測値
y_pred = model.predict(x_test)
print("正解率 = ", accuracy_score(y_test, y_pred))
4.k-NN
k-NNは未知の1個のデータが入力された時、そのデータのクラスを近くのk個の基地データの所属するクラスの多数決で決める、最近傍探索のアルゴリズムの1つである。
# 学習データをダウンロードする
from urllib.request import urlretrieve
url = "https://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/winequality-red.csv"
savepath = "winequality-red.csv"
urlretrieve(url, savepath)
# データの読み込み
import pandas as pd
wine = pd.read_csv("winequality-red.csv", sep=";", encoding="utf-8")
wine
# データをラベルとデータに分離
#目的変数:Y:品質を抜き出し
y = wine["quality"]
#csvファイルquality以外をxに保存
x = wine.drop("quality", axis=1)
# 学習用とテスト用に分類する
from sklearn.model_selection import train_test_split
#1599のデータのうちトレーニングデータとして80%ランダムに抜き出している。残りの20%をテストデータとして使用している。
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, train_size=0.8, shuffle=True)
# 学習する
from sklearn.neighbors import KNeighborsClassifier
model = KNeighborsClassifier()
#モデルにトレーニングデータを入れる。
model.fit(x_train, y_train)
# 正解率
from sklearn.metrics import accuracy_score
# fitで学習したデータを元にテストデータのxに対するqualityの予測値
y_pred = model.predict(x_test)
print("正解率 = ", accuracy_score(y_test, y_pred))