---
title: marimo ノートブックで機械学習 (4)
tags:  #機械学習 #marimo #python  
author: [荒木 雅弘](https://www.docswell.com/user/MasahiroAraki)
site: [Docswell](https://www.docswell.com/)
thumbnail: https://bcdn.docswell.com/page/PEXX2K26EX.jpg?width=480
description: marimo ノートブックで機械学習 (4) by 荒木 雅弘
published: January 07, 26
canonical: https://www.docswell.com/s/MasahiroAraki/K74XX1-2026-01-07-114646
---
# Page. 1

![Page Image](https://bcdn.docswell.com/page/PEXX2K26EX.jpg)

2026/01/07 11:41
slide4.py
marimo ノートブックで機械学習 (4)
127.0.0.1:2718
1/1


# Page. 2

![Page Image](https://bcdn.docswell.com/page/3EKWM5MGED.jpg)

2026/01/07 11:42
slide4.py
はじめに
このスライドは、marimo（アプリのスライドモード）で作成したものです
1つのマークダウンセルが1ページのスライドになります
印刷は PDF で1ページずつで出力して貼り合わせています
元になった文章は note で公開しています
marimo ノートブックで機械学習 (4)
【注意】 marimo を用いたコードは、荒木雅弘 : 『Pythonではじめる機械学習』
（森北出版, 2025）には含ま
れておりません。本ドキュメントは、同書の補足資料です。
127.0.0.1:2718
1/1


# Page. 3

![Page Image](https://bcdn.docswell.com/page/L731YKY5J5.jpg)

2026/01/07 11:42
slide4.py
3. 識別 ―概念学習―
カテゴリデータに対する決定木の作成方法を説明します。
ここで説明する marimo の特徴
カテゴリデータの表示
学習手順の可視化
127.0.0.1:2718
1/1


# Page. 4

![Page Image](https://bcdn.docswell.com/page/87DX535YEG.jpg)

2026/01/07 11:42
slide4.py
Contact-Lenses データに対する決定木
Contact-Lenses データ
特徴
値
age（年齢） {young, pre-presbyopic, presbyopic}（若年，老眼前期，老眼）
spectacle-prescrip（眼鏡）
{myope, hypermetrope}（近視，遠視）
astigmatism（乱視）
{no, yes}（なし，あり）
tear-prod-rate（涙液分泌量）
{reduced, normal}（低下，正常）
contact-lenses（クラス）
{soft, hard, none}（ソフト，ハード，なし）
127.0.0.1:2718
1/1


# Page. 5

![Page Image](https://bcdn.docswell.com/page/VJPPG4G2J8.jpg)

2026/01/07 11:43
slide4.py
marimo でカテゴリデータを値とするデータフレームを表示すると、各特徴について、値の割合が帯グラフで表さ
れます。
# Contact-Lenses データの取得
df = fetch_openml(name=&#039;contact-lenses&#039;, parser=&quot;auto&quot;)
df.data
127.0.0.1:2718
1/1


# Page. 6

![Page Image](https://bcdn.docswell.com/page/2EV26X6XEQ.jpg)

2026/01/07 11:43
slide4.py
age
spectacle-prescrip
astigmatism
tear-prod-rate
contact-lenses
category
category
category
category
category
young
myope
no
reduced
none
young
myope
no
normal
soft
young
myope
yes
reduced
none
young
myope
yes
normal
hard
young
hypermetrope
no
reduced
none
young
hypermetrope
no
normal
soft
young
hypermetrope
yes
reduced
none
young
hypermetrope
yes
normal
hard
pre-presbyopic
myope
no
reduced
none
pre-presbyopic
myope
no
normal
soft
24 rows, 5 columns 10
127.0.0.1:2718
/ page
Page 1
of 3
Download
1/1


# Page. 7

![Page Image](https://bcdn.docswell.com/page/57GRNVNREL.jpg)

2026/01/07 11:43
slide4.py
scikit-learn の決定木学習では、カテゴリデータはそのままでは扱えません。One-Hot Encoding で数値データに変
換します。変換後のデータは、特徴名_値 という形式の特徴を持ち、値は 0 または 1 で表されます。
# 学習データの準備
X = df.data.drop(&#039;contact-lenses&#039;, axis=1)
y = df.data[&#039;contact-lenses&#039;]
# カテゴリデータを数値データに変換
ohe = OneHotEncoder(sparse_output=False)
X_enc = ohe.fit_transform(X)
feature_names = ohe.get_feature_names_out(X.columns)
pd.DataFrame(X_enc, columns=feature_names, index=X.index)
127.0.0.1:2718
1/1


# Page. 8

![Page Image](https://bcdn.docswell.com/page/4EQVQ6QYJP.jpg)

2026/01/07 11:43
slide4.py
age_pre-presbyopic
age_presbyopic
age_young
spectacle-prescrip_hypermetrope
spectacle-prescrip_myope
astigmatism_no
astigmatism_yes
tear-prod
float64
float64
float64
float64
float64
float64
float64
float64
0
0
1
0
1
1
0
0
0
0
1
0
1
1
0
1
0
0
1
0
1
0
1
0
0
0
1
0
1
0
1
1
0
0
1
1
0
1
0
0
0
0
1
1
0
1
0
1
0
0
1
1
0
0
1
0
0
0
1
1
0
0
1
1
1
0
0
0
1
1
0
0
1
0
0
0
1
1
0
1


24 rows, 9 columns 10
127.0.0.1:2718
/ page
Page 1
of 3
Download
1/1


# Page. 9

![Page Image](https://bcdn.docswell.com/page/KJ4MN4NZE1.jpg)

2026/01/07 11:44
slide4.py
決定木を作成するアルゴリズムである ID3 アルゴリズムでは、データ集合 D に対して、もっとも情報獲得量が大
きい特徴 a を、以下の式に基づいて選びます。
Gain(D, a) ≡ E(D) − ∑
v∈Values(a)
∣Dv ∣
E(Dv )
∣D∣
​
​
​
​
ここで、E(D) はデータ集合 D のエントロピーを表し、Dv は特徴 a が値 v をとるデータの部分集合を表しま
​
す。また、∣集合∣ は集合の要素数を表します。
E(D) = −P+ log2 P+ − P− log2 P−
​
​
​
​
​
​
P+ , P− はそれぞれ正例、負例の割合です。他クラスの場合は、それぞれの割合になります。
​
​
このようにして選んだ特徴でデータを分割することを、データ集合が単一のクラスになる（あるいは停止条件に
達する）まで繰り返します。
127.0.0.1:2718
1/1


# Page. 10

![Page Image](https://bcdn.docswell.com/page/LE18545D7G.jpg)

2026/01/07 11:44
slide4.py
以下のコードでは、決定木を学習し、その成長過程を 1 段ずつ可視化しています。各段階の間の秒数は、以下の
スライダーで調整できます。
各段階の表示秒数
127.0.0.1:2718
1/1


# Page. 11

![Page Image](https://bcdn.docswell.com/page/GEWZ5X58E2.jpg)

2026/01/07 11:44
slide4.py
# 決定木の学習
clf = DecisionTreeClassifier(criterion=&quot;entropy&quot;, random_state=9)
clf.fit(X_enc, y)
depth = clf.tree_.max_depth
# 1段ずつ成長する決定木の可視化
for i in range(0, depth + 1):
fig, ax = plt.subplots(figsize=(10, 7))
plot_tree(clf, filled=True, fontsize=9,
feature_names=ohe.get_feature_names_out(),
class_names=clf.classes_,
max_depth=i, ax=ax)
plt.show()
time.sleep(slider.value)
127.0.0.1:2718
1/1


# Page. 12

![Page Image](https://bcdn.docswell.com/page/47Z1N6N9J3.jpg)

2026/01/07 11:44
127.0.0.1:2718
slide4.py
1/1


