【Python機械学習】教師あり学習、教師なし学習、強化学習とは?違いは?

現在のデータサイエンスとAIの中核技術は機械学習と呼ばれるものです。機械学習は、データからルールやパターンを発見することができます。そして、データからルール・パターンを発見する方法には、大きく分けて教師あり学習、教師なし学習、強化学習の3種類があるのです。以下ではそれらについて説明し、プログラミング言語Pythonによる実装例を紹介します。ただし、強化学習については難易度がある程度高いため、この記事では概要の紹介にとどめることにします。強化学習の詳しい説明に興味がある人はこの記事の次に以下記事を読んでください。

「教師あり学習」とは?

結論から述べると、教師あり学習とは「正解データ」のあるデータのことです。

たとえば、社員の退職を予測するAIを作るとしましょう。その際に用意するデータは、これまでに所属していた社員の属性データと正解データです。

・属性データ→給料、勤続年数、異動回数、評価など
・正解データ→退職、在職

この属性データと正解データがセットになったデータが十分にあれば、退職理由となる重要な属性を特定できたり、属性データを入力することで退職予測を行うことができます。ちなみに、属性データのことを特徴量と呼ぶことが多いです。

この「正解データ」のあるものが、教師あり学習です。

さらに例を出します。たとえば、ワインの品質を予測するAIを作成するとします。このAIの目的は、ワイン専門家の判定の模倣(マネ)です。その際には、ワインの属性データと専門家の評価という正解データを用意します。

・属性データ→アルコール濃度、ポリフェノール量、色など
・正解データ→上、中、下

このようなデータで学習すると、ワインの属性データを入力するだけでワインの品質(上、中、下)を予測することができます。

教師あり学習の目的には、回帰と分類という2つがあります。回帰とは、株価などの「数値」を予測することです。

分類とは、文字通り、画像から犬と猫などの分類を行うことです。両方に対応する機械学習アルゴリズムもあれば、回帰と分類のどちらかだけにしか対応していないアルゴリズムもあります。

教師あり学習の回帰のPythonコード

本記事執筆者による話題の新刊!発売即重版!

Pythonにはデータサイエンス用のscikit-learnという便利なライブラリーがあり、scikit-learnでは回帰の学習に使用できるボストンの住宅価格データがあります。教師あり学習の例としてそれを用います。

・属性データ→犯罪率、広さ、部屋数など
・正解データ→住宅価格

今回は、ランダムフォレスト回帰とサポートベクター回帰でトレーニング(学習)を行います。標準化などの前処理を行わずにトレーニングを行うため、ランダムフォレスト回帰の性能が勝ると予想されます。ランダムフォレストは前処理が少なくてすむ初心者でもある程度の性能が見込めるアルゴリズムです。

回帰モデルを評価するために一般的に用いられるのがRMSE(二乗平均平方根誤差)というもので、モデルの予測値と正解データの差を2乗して平方根をとります。

#必要なモジュールをインポート
from sklearn.ensemble import RandomForestRegressor
from sklearn.svm import SVR
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
import numpy as np
from sklearn.metrics import mean_squared_error

#scikit-learn内にあるボストンの住宅価格データセットをbostonという変数に代入。
boston = load_boston()
#Xに住宅の特徴量(属性データ)を代入。特徴量は、ここでは犯罪率、広さ、部屋数など。
X=boston.data
#yに正解データとなる住宅価格を代入。
y=boston.target
#トレーニングデータとテストデータに分割。
#トレーニングデータで学習を行い、テストデータでAIが実際に使えるかの精度検証。テストデータは全体の3割に設定。
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)
#ランダムフォレスト回帰とサポートベクター回帰をインスタンス化(実体化)。
reg_r = RandomForestRegressor()
reg_s = SVR()
#ランダムフォレスト回帰とサポートベクター回帰による学習を行う
reg_r.fit(X_train, y_train)
reg_s.fit(X_train, y_train)
#それぞれでpredict(予測)を行う
y_pred_r = reg_r.predict(X_test)
y_pred_s = reg_s.predict(X_test)
#回帰モデルの評価に用いられるRMSEを算出。
rmse_r = np.sqrt(mean_squared_error(y_test,y_pred_r))
rmse_s = np.sqrt(mean_squared_error(y_test,y_pred_s))
print(rmse_r)
print(rmse_s)
#ランダムフォレスト回帰のRMSEは3.8、サポートベクター回帰は8.3となった。

 
やはりランダムフォレスト回帰の性能がサポートベクター回帰を上回りましたね。

「教師なし学習」とは?

教師なし学習は、正解データのない状況で学習を行うことです。何を行うかというと、グループ分けを行います。この教師なし学習によるグループ分けのことをクラスタリングと呼びます。

教師なし学習を何に活用できるかというと、たとえばマーケティングにおける顧客セグメンテーションです。教師なし学習を用いると、自分がグループ化したい任意のグループ数に分けることができます。たとえば、顧客を4グループに分けたければ、プログラミングの際にそう設定することで4グループに分けることができます。

教師なし学習の欠点としては、なぜその4グループに分けられたかという解釈を分析者が自分で考えてネーミングする必要があるということです。極端な例ですが、顧客を分ける重要属性が年齢と居住都道府県の場合、たとえば、「関西リッチ層」、「関西非リッチ層」、「関東超セレブ層」、「関東非セレブ層」などです。プログラミングだけでなく、ビジネスセンスが求められるところです。

教師なし学習のPythonコード

教師なし学習の例として、scikit-learn内にあるワインの品質予測に活用できるデータセットを利用します。専門家の品質評価という正解データが付属しているのですが、教師なし学習なのでこれを利用せずクラスタリングを行います。専門家の評価は3クラス(上、中、下のようなもの)になりますので、3つのグループに分けてみます。今回は、3つのグループに分けるのが都合がいいとわかっているため3グループに分けますが、実際は何グループに分ければよいかわかりませんので注意してください。今回はK-means(k平均法)という教師なし学習のアルゴリズムを用います。

また、精度を高めるために標準化という前処理も行っておきます。標準化はデータの単位を揃えるために行います。

#必要なモジュールをインポート
from sklearn.cluster import KMeans 
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import load_wine
from sklearn.metrics import accuracy_score

#scikit-learn内にあるワインの品質判定用データセットをwineという変数に代入。
wine = load_wine()

#Xにワインの特徴量を代入。特徴量は、ここではアルコール濃度や色などwineの属性データのこと。
X=wine.data
#yにワインの目的変数を代入。目的変数は、ここでは専門家によるワインの品質評価結果のこと。
y=wine.target

#標準化を実行するためのStandardScalerをインスタンス化(実体化)。fitで訓練データを標準化する際の準備。
scaler = StandardScaler()
scaler.fit(X)

# データを標準化し、3つのグループに分ける
kmeans_c = KMeans(n_clusters=3, random_state=0).fit(scaler.transform(X))

# 分類結果のラベルを取得する
label = kmeans_c.labels_

# 一致率(正解率)を算出
accuracy_score(y,label)
# 約97%の正解率

 
正解率は約97%となり、教師なし学習によるグループ分けがうまくいっていたとわかります。ただ、今回は正解データのある状況であえて教師なし学習を行いました。正解データがある場合は、当然ながら教師なし学習ではなく教師あり学習を行いましょう。

「強化学習」とは?

最後に、強化学習について説明します。強化学習とは、最適な「行動」を学習するための仕組みです。

ある環境(条件)下で、目的とする報酬を最大化するためにどう行動すればいいかを学びます。将棋や囲碁に勝つ作戦や金融投資の戦略を発見したり、ロボットに運動(歩かせる、ダンスを踊らせる、など)させたりしたいときなどの学習方法です。

近年では強化学習によるAIは非常に精度が高く、さまざまな面で人間を超えているといってよいかもしれません。

将棋や囲碁においては、すでに人間よりも強くなっている可能性があり、走ったりバック転をしたりするロボットも開発されています。

このように、どの学習方法にも使い所が存在し、そして非常に強力なものなのです。さきほども述べましたが、強化学習の詳細に関しては、次の記事に進んでください。

スポンサードリンク
おすすめの記事