スキップしてメイン コンテンツに移動

【番外編】AI(機械学習)やってみた。【第5回】ソムリAIの改良(アンサンブル学習)

ソムリAI(ワインの評価を機械学習で当てる「ソムリエ+AI」)の改良として前回は正規化を試しました(大した効果なし)。今回は「アンサンブル学習」と「交差検証」というものを試してみようと思います。

アンサンブル学習とは

ざっくりいうと、複数の機械学習モデルのいいとこどりをしてより精度の高いモデルを作るということです。「アンサンブル」っていう表現がおしゃれですよね。複数のモデルを組み合わせることで過学習を防ぐ効果もあるそうです。

交差検証とは

今までのソムリAIでは、データを訓練用と検証用に分けて訓練データでモデルを作成し、検証データ(モデルにとっては未知のデータ)でモデルの精度を測定していました。

訓練データでの精度に比べて検証データでの精度が高い場合は訓練データに個別最適化された過学習なモデルということになります。一方で、訓練データと検証データでの精度があまり変わらない場合は汎化性能の高いよいモデルということになります。

交差検証(Cross Validation)は、訓練データをさらにn個に分けて訓練することで過学習を防ぎつつモデルの精度を上げる手法です。例えば、3個に分ける場合こんなイメージです。複数のモデルを使ってよりよいものを作るので、アンサンブル学習の1手法ともいえます。

実際にやってみる

毎度おなじみですが、まずワインデータを読み込んで、訓練データ・検証データに分割します(データの正規化は後でやります)。
#入力データセットを読み込み
import pandas as pd #データハンドリング用ライブラリ呼び出し
data = pd.read_csv('winequality-red.csv', encoding='SHIFT-JIS')
 
#機械学習で求める解である「評価」以外の項目をdata_Xに、「評価」をdata_Yに格納
data_X = data.copy()
del data_X['評価']
data_Y = data['評価']
 
data.head() #読み込んだデータの先頭5行を出力

#入力データセットの70%を訓練データ・30%を検証データに分割
from sklearn.model_selection import train_test_split #機械学習用ライブラリ呼び出し
X_train, X_test, Y_train, Y_test = train_test_split(data_X, data_Y,random_state=0, test_size=0.3)

ランダムフォレスト

1つ目のアンサンブル学習として決定木の応用版であるランダムフォレストというものを使ってみようと思います。決定木では学習用データを分類するために、データの各項目の優先度を探索し、優先度の高い項目から順に分類しました(樹形図のようなものです)。

ランダムフォレストは決定木を複数作って統合して、よりよい決定木を見つける手法です。木を集めるからフォレストっていう名前もおしゃれですね。

早速やってみます。機械学習の汎用ライブラリであるscikit-learnにはランダムフォレストなど機械学習で使うモデルがあらかじめ用意されているのでとっても簡単にできます。決定木の数は多ければ多いほどよいので、とりあえず100本にしてみます(n_estimators=100)。また、決定木では正規化の効果は無いので正規化せずに実行しています。
from sklearn.ensemble import RandomForestClassifier
 
#ランダムフォレストで機械学習
forest = RandomForestClassifier(n_estimators=100, 
                                min_samples_leaf=3,
                                random_state=0)
forest.fit(X_train, Y_train)
 
#結果表示
print(forest.score(X_train, Y_train))
print(forest.score(X_test, Y_test))
お、検証精度65.8%!!今までのソムリAIは62%台で頭打ちだったので最高記録です。ただし、訓練データでの精度が92%なので過学習の傾向があります。

交差検証

続いて交差検証です。いろいろ試したところ、訓練データを7分割するのがよさそうだったので、そのときの結果を載せます。これまで使ってきた決定木・ロジスティック回帰・ニューラルネットワーク・ランダムフォレストの4つの機械学習モデルに対してまとめて交差検証を行いました。
まずは、訓練データでのモデル作成から。
import numpy as np
from sklearn.preprocessing import StandardScaler
from skyline.tree import DecisionTreeClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.neural_network import MLPClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.pipeline import Pipeline
from sklearn.model_selection import cross_val_score
 
#モデル1:決定木
clf1 = DecisionTreeClassifier(max_depth=4,random_state=0)
#モデル2:ロジスティック回帰
clf2 = LogisticRegression(solver='lbfgs', C=0.1, random_state=0)
pipe2 = Pipeline([['sc', StandardScaler()],['clf', clf2]])
#モデル3:ニューラルネットワーク
clf3 = MLPClassifier(solver='lbfgs', activation='relu', random_state=0, hidden_layer_sizes=(200,200,200))
pipe3 = Pipeline([['sc', StandardScaler()],['clf', clf3]])
#モデル4:ランダムフォレスト
clf4 = RandomForestClassifier(n_estimators=100, min_samples_leaf=3, random_state=0)
 
#各モデルの名称をリストに格納
clf_labels = ['Decision Tree', 'Logistic Regression', 'Neural Network', 'Random Forest']
 
#各モデルに対して交差検証を行い結果を表示
for clf, label in zip([clf1, pipe2, pipe3, clf4], clf_labels):
    scores = cross_val_score(estimator=clf, X=X_train, y=Y_train, cv=7)
    print("訓練精度と標準偏差: %0.4f (+/- %0.2f) [%s]"
          % (scores.mean(), scores.std(), label))
各モデル60%前後なので過学習は起こしていなさそうです。続いて、検証データでの精度を測定します。
from sklearn import metrics
#各モデルに対して検証データでの予測精度を表示
for clf, label in zip(all_clf, clf_labels):
    clf.fit(X_train,Y_train)
    Y_pred = metrics.accuracy_score(Y_test, clf.predict(X_test))
 
    print("検証精度: %0.4f [%s]" % (Y_pred, label))
これまでのソムリAIの精度と比較してみると、ロジスティック回帰のパフォーマンスが上がりました。決定木は頭打ち・ニューラルネットワークはダウンしました。ランダムフォレストの精度が一番高いです。

多数決

最後に多数決(Majority Vote)という手法を試してみます。これは以前読んだ機械学習の本で紹介されていたものです。MajorityVoteClassifierという複数のモデルの結果を組み合わせた機械学習モデルを定義(この本の著者が自分で実装)して、よりよい学習モデルを作るという感じです。著作権的にアレなのでMajorityVoteClassifierのコードは載せず、結果だけ書きます。

MajorityVoteClassifierの中身を知りたい方はこちらをどうぞ。



#MajorityVoteClassifierを使って多数決してみる
 
#モデルの定義
mv_clf = MajorityVoteClassifier(classifiers=[clf1, pipe2, pipe3, clf4])
#多数決モデルをループさせるリストに追加
clf_labels += ['Majority Voting']
all_clf = [clf1, pipe2, pipe3, clf4, mv_clf]
#各モデルに対して交差検証を行い結果を表示
for clf, label in zip(all_clf, clf_labels):
    scores = cross_val_score(estimator=clf, X=X_train, y=Y_train, cv=7)
    print("訓練精度と標準偏差: %0.4f (+/- %0.2f) [%s]"
          % (scores.mean(), scores.std(), label))
訓練モデルの精度は61.86%とまずまずですが、ランダムフォレストの64.17%を下回っています。多数決は各モデルのいいとこどりをして各モデルよりも高い精度を出すことを目指すモデルなので、いまいちな結果です。精度50%台の決定木とロジスティック回帰が足を引っ張っているように見えます。

気を取り直して検証データで精度を測定します。
from sklearn import metrics
#各モデルに対して検証データでの予測精度を表示
for clf, label in zip(all_clf, clf_labels):
    clf.fit(X_train,Y_train)
    Y_pred = metrics.accuracy_score(Y_test, clf.predict(X_test))
 
    print("検証精度: %0.4f [%s]" % (Y_pred, label))
検証データでの精度は65.42%となかなかいい値ですが、やはりランダムフォレストの65.83%を下回っています。

足を引っ張っていそうな決定木をはずして多数決してみます。
#MajorityVoteClassifierを使って多数決してみる
 
#モデルの定義
mv_clf = MajorityVoteClassifier(classifiers=[pipe2, pipe3, clf4])
#使用するモデルをリストに格納
clf_labels = ['Logistic Regression', 'Neural Network', 'Random Forest', 'Majority Voting']
all_clf = [pipe2, pipe3, clf4, mv_clf]
#各モデルに対して交差検証を行い結果を表示
for clf, label in zip(all_clf, clf_labels):
    scores = cross_val_score(estimator=clf, X=X_train, y=Y_train, cv=7)
    print("訓練精度と標準偏差: %0.4f (+/- %0.2f) [%s]"
          % (scores.mean(), scores.std(), label))
訓練データでの精度は63.91%であり、あいかわらずランダムフォレストを下回っています。

検証データで精度を測定します。
from sklearn import metrics
#各モデルに対して検証データでの予測精度を表示
for clf, label in zip(all_clf, clf_labels):
    clf.fit(X_train,Y_train)
    Y_pred = metrics.accuracy_score(Y_test, clf.predict(X_test))
 
    print("検証精度: %0.4f [%s]" % (Y_pred, label))
お!!多数決の精度が過去最高の66.46%であり、かつ各モデルの精度を上回っています。ようやく多数決の成果が出ました!

まとめ

各ソムリAIの性能をまとめるとこんな感じです。

アンサンブル学習をすることでわずか4%ではありますが、初期型より性能を改善することができました。今回使った多数決のようなアンサンブル学習は各モデルのいいとこどりをする一方で、精度の悪いモデルが混在していると足を引っ張られることがわかりました。

とりあえずソムリAIはこれでおしまいにしようと思います。面白そうなネタを見つけたらまた投稿しようと思います!

関連情報

AI(機械学習)やってみた

AI(機械学習)関連書籍


ビッグデータ解析やってみた

ベストビュー(過去1カ月)

【番外編】ボストン旅行記(UMASS Lowell卒業式編)【Day 4:卒業式】

UMASS Lowellの卒業式@Boston。4 日目は卒業式本番です。とても賑やかでアメリカンな式典でした。ただしあいにくの雨、僕曇り男なのに。。

『九龍城探訪 魔窟で暮らす人々 - City of Darkness』 ☆4

魔窟とも言われた香港の九龍城の住人へのインタビューや、在りし日の写真集。香港の本土返還に伴い取り壊されてしまっているけど、その怪しさに妙に惹かれるのです。

【番外編】ボストン旅行記(UMASS Lowell卒業式編) 【Day2:晩餐会】

UMASS Lowellの卒業式@Boston。 2日目は午前中はボストン観光、夕方から Hooding ceremonyという卒業生(大学院生)向けの晩餐会です。卒業式で被るHoodをもらいました。

【番外編】ボストン旅行記(UMASS Lowell卒業式編) 【Day0:渡米前にやっておくこと】

UMASS Lowellの卒業式@Bostonについて、計画の立て方やら行く前にやっておくことやらをまとめておきます。

【番外編】ボストン旅行記(UMASS Lowell卒業式編) 【Day5:帰国】

UMASS Lowellの卒業式@Boston。5 日目にして帰国なのです。

【番外編】ボストン旅行記(UMASS Lowell卒業式編) 【Day3:終日観光】

UMASS Lowellの卒業式@Boston。3 日目は終日フリーなので、ゆっくりボストンを観光しました。

【番外編】ボストン旅行記(UMASS Lowell卒業式編) 【Day1:ボストンへ】

UMASS Lowellの卒業式@Boston。 1日目は移動だけで終わりました。

『女たちの王国 「結婚のない母系社会」中国秘境のモソ人と暮らす』☆3

雲南省と四川省の境にある「世界で最後の母系社会を営むモソ族」の社会に入り込んだ中華系シンガポール人女性の手記。結婚という概念がない・一夫一妻制でもないなど、父系社会が当たり前の我々にはイメージしづらい世界ですが、命をはぐくむ女性を中心とした母系社会のほうが生物としては正しい在り方なのかもしれません。

【番外編】AI(機械学習)やってみた。【第3回】ソムリAI ~ニューラルネットワーク編~

AI(機械学習)やってみた、第3弾です。「ニューラルネットワーク(Neural Network)」を使ったソムリAIを作ってみようと思います。”ニューラルネットワーク”、見るからにAIっぽい名前ですよね。

【番外編】AI(機械学習)やってみた。【第4回】ソムリAIの改良(正規化)

ソムリAI(ワインの評価を機械学習で当てる「ソムリエ+AI」)はもういいかなと思っていたのですが、機械学習の教科書的な本を読んでいるといくつか改良ポイントが見えてきたので、実際に適用してみようと思います。 まずは データの正規化 という手法を試してみました。結論から言うと、 あまり効果はなかった のです。。 ソムリAIの振り返り ワインの成分とランクのデータに対して、決定木・ロジスティック回帰・ニューラルネットワークの3通りのモデルを使って機械学習 を行い、モデルの精度を検証してきました。それぞれのソムリAIの性能はこんな感じでした。 どのモデルも概ね60%程度の精度 でした。 改良その1:正規化 正規化とは まずは 正規化 という手法を試してみます。標準化とも呼ばれます。正規化を行うことで 尺度の異なるデータを比べやすくする とともに、 はずれ値の影響を小さくする ことができます。正規化には 各データを平均0・標準偏差1に成形する手法 と、各データを 0から1の範囲に成形する手法 の2つがあります。 前者は標準偏差が出てくることからも分かるように、 データが正規分布に従うことを前提にした正規化手法 です。 元のデータが釣鐘型の分布になっている場合に有効 です。後者は単純に データの範囲を0から1の範囲に狭める手法 であり、 元のデータが一様分布の場合 (規則性が無くランダムなように見える場合) に有効 です。 どちらの手法でもデータの範囲を一定のレンジに狭めており、そうすることで異なる尺度のデータを比べやすくしつつ、はずれ値の影響を下げるのです。 正規化してみる 元データの分布を確認 前回同様のワインのデータを使って正規化してみます。まずはワインのデータを読み込んで表示してみます。ついでに機械学習で使うワインの成分と、ワインの評価にデータを分割しておきます。 【オリジナルのワインデータ】 UCI(University of California, Irvine:カリフォルニア大学アーバイン校) http://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/winequality-red.csv #入力データセットを読み込み i

ベストビュー(全期間)

Malaysia Quarantine Premium Package 【番外編】Malaysia赴任記 隔離ホテル情報

Once entering Malaysia, we need to be quarantined for 14days. At the beginning of COVID-19 spread, the hotel for quarantine have been determined randomly. In these days, we can choose "premium quarantine stay package" in advance . This article is summary of premium packages which I asked each hotel. Note: Information in this article might be old. It's better to confirm the latest plan to the hotel. Note: Only Hotel Istana can be booked via its homepage so far. As the other hotels don't show their premium package plans on their homepage, you need to contact them through their reservation E-mail address or "Contact us". マレーシア入国とともに14日間ホテルで隔離されます。当初は滞在ホテルがランダムに割り振られていたようですが、より快適なプレミアムプランが追加されました。各ホテルにどんなプランがあるのか聞いてみたので、聞いた内容をまとめます。 ※情報が古い可能性があるので、念のため最新情報を各ホテルに確認したほうがよいかもしれません。

【番外編】AI(機械学習)やってみた。【第1回】ソムリAI ~決定木編~

最近ブームのAI(機械学習)に手を出しました。まずは、決定木(Decision Tree)というモデルを使って「ソムリAI(ワインソムリエAI)」を作ってみようと思います。

【番外編】ボストン旅行記(UMASS Lowell卒業式編) 【Day0:渡米前にやっておくこと】

UMASS Lowellの卒業式@Bostonについて、計画の立て方やら行く前にやっておくことやらをまとめておきます。

【番外編】AI(機械学習)やってみた。【第6回】乳がん診断AI その1

ソムリAI(ワインソムリエAI)で使った手法で乳がん診断AIを作ってみます。まずは決定木とニューラルネットワークの2つのモデルを試してみます。かなり高性能なモデルができました。名医誕生かもしれません 笑

【番外編】AI(機械学習)やってみた。【第3回】ソムリAI ~ニューラルネットワーク編~

AI(機械学習)やってみた、第3弾です。「ニューラルネットワーク(Neural Network)」を使ったソムリAIを作ってみようと思います。”ニューラルネットワーク”、見るからにAIっぽい名前ですよね。

【番外編】ボストン旅行記(UMASS Lowell卒業式編) 【Day5:帰国】

UMASS Lowellの卒業式@Boston。5 日目にして帰国なのです。

【番外編】ボストン旅行記(UMASS Lowell卒業式編)【Day 4:卒業式】

UMASS Lowellの卒業式@Boston。4 日目は卒業式本番です。とても賑やかでアメリカンな式典でした。ただしあいにくの雨、僕曇り男なのに。。

【番外編】AI(機械学習)やってみた。【第2回】ソムリAI ~ロジスティック回帰編~

AI(機械学習)やってみた、第2弾です。前回は決定木(Decision Tree)を使ったソムリAI(ワインソムリエAI)を作りました。今回は「ロジスティック回帰(Logistic Regression)」というモデルを使ったソムリAIを作ってみようと思います。

【番外編】ボストン旅行記(UMASS Lowell卒業式編) 【Day2:晩餐会】

UMASS Lowellの卒業式@Boston。 2日目は午前中はボストン観光、夕方から Hooding ceremonyという卒業生(大学院生)向けの晩餐会です。卒業式で被るHoodをもらいました。

『深層学習教科書 ディープラーニング G検定(ジェネラリスト) 公式テキスト』 ☆5

一般社団法人日本ディープラーニング協会が実施している「Deep Learning for GENERAL (通称G検定 ) 」 の公式テキスト 。 ディープラーニングについて1冊で網羅的によくまとめられているので 、 ディープラーニングの入門書としてもおすすめです 。 ついでに勢いで資格も取ってしまいました 。 AI人材への第一歩なのです 笑