はじめに
こんにちは! 早稲田大学のMATLAB学生アンバサダーです。
普段は工学系の研究をしており、現在修士1年生です。
「機械学習」「ロジスティック回帰」「決定木」——名前は聞くけど、結局それで何ができるの? と思っている人は多いと思います。私もそうでした。
しかし、研究室の後輩指導用に少し触ってみたところ、MATLABなら簡単に実践できることに気づきました。
この記事は初心者向けに「ロジスティック回帰」「決定木」を使って実際に統計データを解析することを目標とします。
扱うデータは南極に生息する3種のペンギンに関するデータです。
ペンギンたちのクチバシの長さや体重を図ったデータを基に、その種類・性別を予測することを目指します。
Statistics and Machine Learning Toolboxが必要です。
アドオンの管理画面から簡単にインストールできます
この記事で使うデータ
GitHubから penguins.xlsx をダウンロードして、MATLABの「現在のフォルダー」に置いてください。
Excelファイルの内容は以下の通りです。
| 列名 | 意味 |
|---|---|
species |
種(Adelie / Gentoo / Chinstrap) |
island |
生息する島 |
bill_length_mm |
くちばしの長さ [mm] |
bill_depth_mm |
くちばしの太さ [mm] |
flipper_length_mm |
ヒレの長さ [mm] |
body_mass_g |
体重 [g] |
sex |
性別(male / female) |
year |
観測年 |
全344羽のデータです。
今回扱うペンギンは全部で3種類!
※フリー素材です
STEP0:Excelを読み込んで「掃除」する
実データに値が抜けている(欠損)行がないか確認が必要です。
まずExcelファイルの読み込みと整理を行います。
P = readtable('penguins.xlsx'); % Excelを表として読み込む
% 文字の列をカテゴリ型に変換
P.species = categorical(P.species);
P.island = categorical(P.island);
P.sex = categorical(P.sex);
% 値が抜けている行を削除
P = rmmissing(P);
summary(P.species) % 種ごとの羽数を表示
**列名は英語のままにしてください。
その1:決定木 =「どの種か」を寸法から見分ける道具
何ができるのか
決定木がやってくれるのは、ひとことで言うとこれです。
「Yes/No の質問を繰り返して答えにたどり着くフローチャート」を、データから勝手に作ってくれる
しかも、答えは 2択じゃなくて3種類(以上)に枝分かれしてOK。「ヒレが○mmより長ければ Gentoo、そうでなくてくちばしが△mmより短ければ Adelie…」のように、種を見分ける判定基準を、データから自動で組み立ててくれます。
やってみよう
tree = fitctree(P, ...
'species ~ bill_length_mm + bill_depth_mm + flipper_length_mm + body_mass_g');
view(tree, 'Mode', 'graph') % 判定基準のフローチャートが図で出る
'species ~ ...' は「種(species)を、右の4つの寸法から当ててね」という指示です。
【決定木】
図が出ます。上から質問をたどっていくと、一番下で 3種のどれかにたどり着きます。
注目してほしいのは、この分かれ道の数字(○mm)を、あなたは一切指定していないことです。データを渡しただけで、MATLABが「ここで切ればうまく3種に分けられる」という判定基準を勝手に計算してくれたのです。便利ですね。
何が嬉しいのか
① 判定条件がすぐにわかる
② 専門家じゃない人にそのまま見せられる
フローチャートなので、統計を知らない人にも図を指させば一発で伝わります。
fprintf('決定木の正解率: %.1f%%\n', (1 - resubLoss(tree)) * 100);
木が分岐しすぎて複雑で読めないとき
'MaxNumSplits', 6 のように分岐数の上限を付けてください。複雑なデータだと分岐が数十個の巨大な木になり、図が読めなくなります。
その2:ロジスティック回帰 =「◯◯である確率は何%?」を出す道具
何ができるのか
決定木は答えを分類してくれますが、実際には判定が難しいケースがあります。そこで登場するのがロジスティック回帰です。
条件を入れると「YESである確率」を%で返してくれる
今度は種ではなく 「このペンギンはオスか?」 を当ててみます。
答えが male / female の2択の問題です。
「このペンギンがオスである確率は 80%」のように、白黒つけずにグラデーションで答えてくれるのが特徴です。
やってみる
P.IsMale = double(P.sex == 'male'); % オス=1 / メス=0
% 今回は「体重」だけからオスかどうかを予想する(変数1つでシンプルに)
model = fitglm(P, 'IsMale ~ body_mass_g', 'Distribution', 'binomial');
'Distribution','binomial' を付けると、ロジスティック回帰になります。これだけです。
何が嬉しいのか:確率がなめらかに出る
「体重が変わると、オスである確率がどう変わるか」を絵にします。体重を軽い方から重い方まで少しずつ変えて、それぞれの確率を計算してつなぐだけです。
m = linspace(2700, 6300, 100)'; % 体重を2700〜6300gで100点きざみに用意
p = predict(model, table(m, 'VariableNames', {'body_mass_g'})); % 各体重でのオス確率
figure
plot(m, p*100, 'LineWidth', 2)
xlabel('体重 [g]'); ylabel('オスである確率 [%]')
title('体重が重いほどオスの確率が上がる'); grid on
なめらかなS字カーブが出ます。「体重が重くなるほど、オスである確率がスルスル上がっていく」 のが一目で分かります。決定木のように白黒つけるのではなく、"確率"で教えてくれるのがロジスティック回帰の答え方です。
具体的な1羽で予想させることもできる
グラフだけでなく、「体重◯gの1羽」を入れて確率を1つ返してもらうこともできます。predict に体重を渡すだけです。
newbird = table(4500, 'VariableNames', {'body_mass_g'}); % 体重4500gの1羽
prob = predict(model, newbird);
fprintf('このペンギンがオスである確率: %.0f%%\n', prob*100);
「体重4500g のペンギン → オスである確率 ◯%」と即答してくれます。これが、さっきのS字カーブの「体重4500gのところの高さ」に対応しています。
どっちを使えばいい?
| 決定木 | ロジスティック回帰 | |
|---|---|---|
| 答え方 | 「こう分岐すると決まる」と図で | 「YESの確率は◯%」と数字で |
| 答えの種類 | 3つ以上に枝分かれOK | 基本は2択(Yes/No) |
| 一番の強み | 判定基準を自動で見つけ、絵で見せる | 確率で扱える |
| こんな人に | 仕分け基準・ルールを人に説明したい | リスクの度合いを%で見たい |
| 使う関数 | fitctree(...) |
fitglm(...) |
「ルールが欲しいか、確率が欲しいか」で選ぶとよいですね。どちらも試してみるといいかも。
答えが分類じゃなくて「数値そのもの」を予想したいとき
(例:体重が"何g"になるか、明日の気温が"何℃"か)は、重回帰分析 という別の手法を使います。
MATLABでは fitlm(P, 'body_mass_g ~ flipper_length_mm')という関数です。
まとめ
-
決定木 … 「どういう基準で分けられるか」を自動で見つけ、フローチャートを出力(
fitctree) -
ロジスティック回帰 … 「○○の確率は何%?」を出力(
fitglm)。 - どちらも MATLABなら1行、書き方もそっくりですね
「機械学習=難しい数学」というイメージがあるかもしれませんが、
"何ができるか"を知るだけなら簡単でしたね。
皆さんの身の回りの実験データをreadtableで読み込めば、ペンギンの種類の仕分けと同じことができますよ!
データの出典
本記事で使用した penguins.xlsx は、南極パーマー基地周辺で観測されたペンギンの実測データ(Palmer Penguins)です。Kristen Gorman博士および Palmer Station Antarctica LTER(Long Term Ecological Research Network)によって収集・公開され、CC0ライセンスで提供されています。利用にあたっては以下を引用しました。
- Horst AM, Hill AP, Gorman KB (2020). palmerpenguins: Palmer Archipelago (Antarctica) penguin data. R package version 0.1.0. https://allisonhorst.github.io/palmerpenguins/ doi:10.5281/zenodo.3960218
- Gorman KB, Williams TD, Fraser WR (2014). Ecological Sexual Dimorphism and Environmental Variability within a Community of Antarctic Penguins (Genus Pygoscelis). PLoS ONE 9(3): e90081. doi:10.1371/journal.pone.0090081




