marimo ノートブックで機械学習 (4)

>100 Views

January 07, 26

スライド概要

profile-image

機械学習・音声認識・プログラミングに関する書籍を執筆しています。

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

ダウンロード

関連スライド

各ページのテキスト
1.

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

2.

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

3.

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

4.

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

5.

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

6.

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

7.

2026/01/07 11:43 slide4.py scikit-learn の決定木学習では、カテゴリデータはそのままでは扱えません。One-Hot Encoding で数値データに変 換します。変換後のデータは、特徴名_値 という形式の特徴を持ち、値は 0 または 1 で表されます。 # 学習データの準備 X = df.data.drop('contact-lenses', axis=1) y = df.data['contact-lenses'] # カテゴリデータを数値データに変換 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

8.

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

9.

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

10.

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

11.

2026/01/07 11:44 slide4.py # 決定木の学習 clf = DecisionTreeClassifier(criterion="entropy", 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

12.

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