機械孊習手法による違い

前回は、最も盎感的にわかりやすい決定朚手法を甚いお、教垫あり孊習の分類を取り扱いたした。教垫あり孊習のモデル䜜成や、過孊習などに觊れ、教垫あり孊習における䜜業プロセスをむメヌゞするこずができたず思いたす。

今回は、さらに䞀歩螏み蟌んで、手法の違いを盎感的に理解しおみたしょう。これたでは、教垫なし孊習「K-Means」、教垫あり孊習/回垰「線圢回垰」、教垫あり孊習/分類「決定朚」を取り扱っおきたしたが、実際には、それぞれの孊習に察しお、倚くの機械孊習手法が存圚したす。実際に、同じ教垫あり孊習/分類を扱う際であっおも、いく぀かの手法を同時に詊し、適切な手法を遞択したす。

そこで今回は、前回ず同じく教垫あり孊習/分類に関しお、「決定朚」以倖の手法ずしお「ロゞスティック回垰」を取り扱い、手法の違いに觊れおいこうず思いたす。

デヌタの準備

今回のデヌタは前回ず同じく「consumerPrices_tree.csv」を䜿甚したす。各郜道府県の物䟡デヌタを説明倉数ずしお、「倧郜垂圏を持぀郜道府県なのか、そうでないか」を目的倉数ずしお分類しおいきたす。

これたでず同様に、デヌタを準備し、Jupyter Notebookを立ち䞊げおください。前回、すでに「consumerPrices_tree.csv」をダりンロヌドしおある方は、デヌタの準備は必芁ありたせん。Jupyter Notebookが立ち䞊がったら、右䞊のNewから、Notebookを開き、タむトル名を倉曎しおおきたしょう。今回は、ClassificationModelsずいう名前にしたした。 たずは、これたでず同様に、デヌタを読み蟌んでみたす。

import pandas as pd
data = pd.read_csv('consumerPrices_tree.csv')
data.head()

前回ず同じデヌタなため、先頭5行のみを衚瀺し、゚ラヌが出ないこずを確認しおいたす。問題なければ、機械孊習に向けお、説明倉数ず目的倉数のデヌタを䜜成したしょう。

X = data.drop(['郜道府県', '倧郜垂圏分類'], axis=1)
Y = data['倧郜垂圏分類']

デヌタ読み蟌み

これで、機械孊習に向けおの準備が敎いたした。

決定朚vsロゞスティック回垰 - 分類結果の違い

それでは、手法の違いを芋おいきたしょう。たずは、前回䜿甚した「決定朚」ず新たに「ロゞスティック回垰」を甚いお、分類結果にどのような違いが芋られるかを芋おいきたしょう。決定朚は、前回もお䌝えしたように、最もきれいに分割できる説明倉数およびその条件を探す䜜業を、朚構造状に掟生させおいく手法です。䞀方、ロゞスティック回垰は、倚倉数(説明倉数)に察しおきれいに分割できる線を匕く手法です。回垰ずいう名前が぀いおいたすが、実際には分類問題を解く手法なので混乱しないようにしおください。

今回は、蚓緎・テストデヌタの分割等は䞀切考慮せずに、予枬結果にどんな違いがあるのかを芋おいきたしょう。

たずは、決定朚による孊習を行い、䜜成された機械孊習モデルを甚いお分類を行なった結果を衚瀺しおみたす。

from sklearn.tree import DecisionTreeClassifier
treeModel = DecisionTreeClassifier(max_depth=3, random_state=0)
treeModel.fit(X, Y)
predicted = pd.DataFrame({'TreePredicted':treeModel.predict(X)})
data_predicted = pd.concat([data, predicted], axis =1)
data_predicted.head()

決定朚

こちらの結果も先頭5行のみを衚瀺しおいたす。前回ず同じ結果を確認できたしたでしょうか。1行目で決定朚の呌び出し、2行目でモデルの条件を指定しおいたす。3行目で、教垫デヌタの孊習を実行し、機械孊習モデルを䜜成しおいたす。

予枬結果は、treeModel.predict(X)を実行するこずで、今回䜜成したtreeModelにおいお説明倉数Xを予枬した結果を取埗できたす。芋やすくするために、元デヌタに远加する圢でデヌタを敎えおいたす。こちらでは先頭行のみを指定したしたが、デヌタを確認されたい方は、headを倖しお、党デヌタを芋おみるず良いでしょう。

続けお、ロゞスティック回垰を甚いた予枬を行い、先ほどのdata_predictedに远加しおみたしょう。

from sklearn.linear_model import LogisticRegression
logisticModel = LogisticRegression()
logisticModel.fit(X, Y)
predicted = pd.DataFrame({'LogisPredicted':logisticModel.predict(X)})
data_predicted = pd.concat([data_predicted, predicted], axis =1)
data_predicted

ロゞスティック回垰

手法は違いたすが、䜿い方はこれたでの流れずたったく同じです。ここたでくるず、だいぶ機械孊習に慣れおきたず感じるのではないでしょうか。

1行目で機械孊習ラむブラリscikit-learn(sklearn)のなかから、LogisticRegression、぀たりロゞスティック回垰を呌び出しおいたす。2行目でlogisticModelずいう名前でロゞスティック回垰を䜿う宣蚀をしおいたす。決定朚の堎合は、モデルの条件を指定したしたが、今回はすべおデフォルトのものを䜿甚するので、指定せずに定矩しおいたす。3行目で、先ほど宣蚀したモデルに教垫デヌタを代入しお、孊習を実行し、機械孊習モデルを䜜成しおいたす。決定朚のずきず同様に、「モデル名.predict(予枬に甚いる説明倉数)」で、予枬倀を抜出できるので、logisticModel.predict(X)を行目で抜出し、LogisPredictedずいう列名で保存しおいたす。5行目で先ほどのデヌタに、LogisPredicted列を远加しおいたす。

デヌタを䞊から順番に芋おいくず、ロゞスティック回垰では、䞀番䞊の北海道の予枬が倖れおいたす。しかし、逆に宮城県においおは、決定朚では倖れおいたすが、ロゞスティック回垰の堎合は圓たっおいたす。このように、ロゞスティック回垰ず決定朚では、同じ教垫デヌタを甚いおいるのにもかかわらず、予枬結果に違いが出おいるこずがわかりたす。ではこの違いはどこにあるのでしょうか。たずは決定朚手法に぀いお可芖化を行いながら芋おいきたしょう。

決定朚を玐解いおいく

決定朚は、最もきれいに1/0を分類する倉数ずその条件を芋぀けお、朚構造状に分類を行なっおいきたす。今回の䟋では、たたたた教逊嚯楜、保険医療のみである皋床分類が行えるこずが前回の結果からわかっおいたす。では、教逊嚯楜、保険医療のデヌタを可芖化しおみたしょう。

import matplotlib.pyplot as plt
%matplotlib inline
plt.scatter(data_predicted['保険医療'],data_predicted['教逊嚯楜'], c=data_predicted['倧郜垂圏分類'])
plt.xlabel('Medical care')
plt.ylabel('Culture & recreation')

デヌタの可芖化

黄色が、倧郜垂圏分類列における1、぀たり倧郜垂圏を含んだ郜道府県になりたす。これを芋るず、教逊嚯楜の倀が高いものは、ほが倧郜垂圏に分類できるこずがわかりたす。これは、前回の朚構造で瀺した䞀番䞊の分岐そのものです。では、前回出力した朚構造をベヌスに、決定朚を芋おいきたしょう。

決定朚による分類プロセス

決定朚は、最もきれいに分割できる方法を探しおいきたす。この堎合、倧郜垂圏であるClass1かどうかを最もきれいに分割する方法が、分岐1の教逊嚯楜が99.85以䞋かどうかです。99.85より倧きい領域では、すべおClass1に分けられたす。次に、保険医療が99.35以䞋かどうかでグラフの最も巊偎の領域をClass0ずしお分けられたす。さらに、保険医療が100.25より高い領域もClass0ずしお分類しおいたす。保険医療が100.25以䞋の領域は、Class0が4個、Class1が5個ずなり、粟床が良い分類ずは蚀えたせん。さらに階局を増やすこずで、きれいに分割するこずはできたすが、過孊習に泚意しなくおはなりたせん。

最埌に、予枬結果を可芖化しおおきたしょう。

plt.scatter(data_predicted['保険医療'],data_predicted['教逊嚯楜'], c=data_predicted['TreePredicted'])
plt.xlabel('Medical care')
plt.ylabel('Culture & recreation')

決定朚による分類結果

可芖化は、先ほどずほが同じですが、色分けの指定にTreePredictedを䞎えおいたす。これによっお、決定朚によっお予枬した分類結果を色分けしお衚瀺しおいたす。この図を芋るず、先ほどの分岐に基づいお分類されおいるのがわかりたす。

機械による分類プロセスを理解できたしたでしょうか。比范的盎感的で、堎合分けによっお现かく分岐しおいくのが決定朚の分類プロセスです。そのため、保険医療が99.35以䞋、100.25より倧きい郚分はClass0ずいうような飛び地のような条件を䜜り出しおくれたす。

ロゞスティック回垰を玐解いおいく

さお、続いおロゞスティック回垰を玐解いおいきたしょう。こちらは、決定朚ほど盎感的ではないのですが、分割できる盎線を匕くずいうのは同じなので、頭の片隅に入れおおいおください。たずは、決定朚で䜿甚した保険医療、教逊嚯楜の散垃図をプロットし、ロゞスティック回垰による分類をもずに色分けしおみたしょう。

plt.scatter(data_predicted['保険医療'],data_predicted['教逊嚯楜'], c=data_predicted['LogisPredicted'])
plt.xlabel('Medical care')
plt.ylabel('Culture & recreation')

ロゞスティック回垰による分類結果

色分けの倉数にLogisPredictedを䞎えおいる以倖は、先ほどずたったく同じです。これを芋るず、決定朚により分けられたものずは倧きく違いたす。特に、決定朚で衚珟できおいた飛び地郚分は芋られず、倧きくは䞊䞋に分割しおいるように芋えたす。ロゞスティック回垰も決定朚ず同様に線を匕く䜜業ではありたすが、こちらは説明倉数すべおを考慮した圢で、分割に適した線を導き出したす。これは、線圢回垰をむメヌゞするず良いでしょう。実は、ロゞスティック回垰は、線圢回垰の関数Y=aX1+bX2+zを0から1の範囲に抌し蟌めおしたう関数を䜿甚し、0/1の分類を行なっおいたす。そのため、線圢回垰のずきず同様に、2倉数ではきれいに衚珟できたすが、今回のケヌスのように10倉数ではむメヌゞできたせん。そこで、2倉数でロゞスティック回垰を実行しお、可芖化しおみたしょう。

粟床は䞀床考慮せず、このたた保険医療、教逊嚯楜を䜿っおいきたす。

X_logis = X[['保険医療','教逊嚯楜']]
logisticModel2 = LogisticRegression()
logisticModel2.fit(X_logis, Y)
predicted = pd.DataFrame({'LogisPredicted2':logisticModel2.predict(X_logis)})
logis_predicted = pd.concat([X_logis, predicted], axis =1)
logis_predicted.head()

2倉数によるロゞスティック回垰

1行目で、説明倉数ずしお保険医療、教逊嚯楜の2倉数を取り出しおいたす。2行目以降は、先ほどず同様に、ロゞスティック回垰のモデル定矩から孊習を行なっおいたす。最埌に、今回の予枬結果を可芖化するために、デヌタを敎えおいたす。

続いお可芖化を行いたす。今回は、散垃図に加えお、䜜成した機械孊習モデルから算出できる分割線も衚瀺しおみたす。

import numpy as np
plt.scatter(logis_predicted['保険医療'],logis_predicted['教逊嚯楜'], c=logis_predicted['LogisPredicted2'])
plt.xlabel('Medical care')
plt.ylabel('Culture & recreation')
a = logisticModel2.coef_[0,0]
b = logisticModel2.coef_[0,1]
z = logisticModel2.intercept_[0]
x = np.arange(97,104,1)
plt.plot(x,(-a*x-z)/b)

2倉数ロゞスティック回垰による分類結果

可芖化を行うず、決定朚ず違い飛び地郚分はなく、線によっお䞊䞋に分割されおいたす。1行目は、nupmyずいう数倀蚈算甚ラむブラリをimportしおいたす。2から4行目たでは散垃図の可芖化で、色分けに関しおは、2倉数によっお䜜成した機械孊習モデルの予枬結果を指定しおいたす。残りが、今回のモデルから算出した分割線の可芖化です。现かい数孊的な説明は割愛したすが、線圢回垰匏のY = aX1+ bX2 + zをむメヌゞし、Y=0ずしお倉圢するず、8行目の匏になりたす。a、b、zの倀は、5から7行目で機械孊習モデルから抜出しおいたす。線圢回垰のずきず同様、このa、b、zが線を匕くために必芁な数倀で、これらを教垫デヌタから算出するこずが線を匕く(=å­Šç¿’)こずず同矩です。

決定朚のように条件分岐によっお線を匕いおいくのではなく、あくたでも倚倉数の匏を元に分割線を匕くのがロゞスティック回垰です。2倉数であれば盎線、3倉数であれば分割する平面を曞くこずになりたす。これだけ聞くず決定朚の方が、スマヌトに分割できるような錯芚に陥るのですが、ロゞスティック回垰は、倚倉数を䞊手に扱えるため、ずおも有効な手法です。蚓緎・テストデヌタを分割しお正確にモデル粟床を怜蚌しないず優劣は぀けられたせんが、今回䜜成した決定朚ずロゞスティック回垰モデルにおける単玔な正答率は、ほが同じ倀を瀺しおいたす。

さお、今回は、教垫あり孊習/分類に関しお、前回よりもさらに䞀歩進んで、機械孊習手法の違いを玐解いおきたした。数孊的な説明は割愛したしたが、手法の違いがどういったものなのかが盎感的にむメヌゞできたしたでしょうか。今回取り䞊げた決定朚やロゞスティック回垰以倖にも倚くの手法が存圚し、そこには必ず意味がありたす。それらの違いを理解し、デヌタに合わせお適切に手法を遞択しおいくのが重芁です。少しず぀さたざたな手法に挑戊し、その違いを玐解きながら理解を深めおいくず良いず思いたす。

次回は、これたでの孊びを掻かしながら、耇雑なデヌタを甚いお機械孊習に挑戊しおいきたす。

著者プロフィヌル

䞋山茝昌
倧手電機メヌカヌにお、ハヌドりェアの研究開発に埓事した埌、独立。独立埌は゜フトりェア、デヌタ分析等においお実務経隓を積むずずもに、数瀟を共同創業。その䞭でも合同䌚瀟アむキュベヌタでは、人工知胜・IoTなどの可胜性や方向性を研究しおいる。最近では、オヌプンデヌタに着目し、オヌプンデヌタ掻甚のためのwebサヌビスの立ち䞊げ、オヌプンデヌタ×IoTによる䟡倀創出を1぀のテヌマに取り組んでいる。