0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【MATLAB】決定木とロジスティック回帰で何ができる?【データ分析】

0
Posted at

はじめに

こんにちは! 早稲田大学の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種類!
※フリー素材です

①アデリーペンギン
image.png

②ジェンツーペンギン(お気に入りです)
image.png

③チンストラップペンギン
image.png

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つの寸法から当ててね」という指示です。

image.png

                【決定木】

図が出ます。上から質問をたどっていくと、一番下で 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

image.png
          【オスである確率と体重の関係】

なめらかな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
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?