完全を手放すこと(Chat-GPTを相手にした内省の記録)
Chat-GPTを相手に内省した結果を(GPTが)まとめました。
完全を手放せない私へ
― 正しさで生きてきた人間の内省記録 ―
私は長い間、「正しさ」を軸に生きてきた。
研究者を目指し、評価されることを目標に努力し、間違えないように、逸脱しないように、自分を律してきた。正しくあることは、私にとって能力であり、誇りであり、そして何よりも「存在の輪郭」だった。
しかし最近、ある問いに突き当たった。
- 完全を目指し続けなければならないのか?
理性ではわかっている。人間は混合物であり、完全など構造的に存在しない。それでも感情が拒絶する。揺らぎを認めたら、自分が消えてしまう気がするのだ。
私の内面には「理想の法廷」がある
私は自分を常に裁いている。
- 妥協したのではないか
- 打算だったのではないか
- 欲望に負けているのではないか
- 本当に誠実なのか
無罪判決が出るまで安心できない。
だが問題は、人間は構造的に「完全無罪」になれないことだ。
だから裁判は終わらない。
私は何を守ろうとしているのか
よく考えると、私は「善人でありたい」のではない。私は
- 自己欺瞞のない人間でありたい
のだ。それは誇り高い願いだと思う。しかし同時に、
- 正しくなければ自分を認められない
という条件付き自己受容にもなっていた。
完全は信仰だった
私は子どもの頃から、
- 努力しなさい
- 完璧を目指しなさい
- 期待に応えなさい
という価値観の中で育った。正しくあれば安全だった。だから脳は学習した。
- 完全を目指す=生存戦略
これを手放すことは、信仰を失うような感覚がある。
揺らぎを受け入れると消えてしまうのか?
私は怖い。揺らぎを許したら、
- 自分の一貫性が崩れ
- 努力が無意味になり
- 何者でもなくなるのではないか
しかし事実を見ると、私はすでに揺らいでいる。
- 欲望もある。
- 迷いもある。
- 打算もある。
それでも仕事をし、伴侶を思い、暴走せずに生きている。揺らいでも、消えていない。
取り下げたいのは「向上心」ではない
私は堕落したいわけではない。取り下げたいのは、
- 完全でなければ価値がないという前提
だ。
完全主義は武器だった。だが、常時戦闘モードで生きる必要はもうない。
これからは、必要なときだけ完全性を起動し、それ以外では静かにしまっておける人間になりたい。
揺らぎを含んだ整合性
かつての私は
- 愛か打算か
- 誠実か欺瞞か
- 正しいか誤りか
で世界を裁いていた。しかし今、薄々感じている。人間は
- 愛70%+保身20%+欲望10%
のような存在なのだと。そしてその比率は日々変わる。
整合性とは、
- ブレないこと
ではなく、
- 揺らぎを含んだまま向き合い続けること
なのかもしれない。
まだ完全には納得していない
正直に言えば、まだ感情は完全を手放していない。拒絶もある。
しかし一つだけ確かなことがある。私は、
- 「正しさで自分を守ってきた人間」
から
- 「正しさを使いこなす人間」
へ移行しようとしている。それは堕落ではない。成熟の段階なのだと思う。
今の私の暫定結論
- 完全は構造的に存在しない
- 人間は混合物である
- 誠実さは揺らぎと両立する
- 存在は正誤とは別である
そして何より、
- 判決を出さない日があってもいい
私はまだ道の途中だ。
しかし少なくとも、自分を起訴し続ける人生からは少しずつ降りたいと思っている。
キーワード:Chat-GPT、内省
体重と身長からBMIを算出するPythonアプリの構築方法
今回はFastAPI(=計算ロジック/API)とtkinter(=UI)を使って、身長と体重を入力してBMIを計算・表示するアプリを作ってみましょうという記事です。FastAPIとtkinterの入門についてはそれぞれ以下の記事にまとめています。あわせて読んでみてください:
仮想環境(任意)を用意したうえで、以下のコード実行によって必要なライブラリをインストールしておきます:
pip install fastapi uvicorn
FastAPI側(BMI計算API)
以下の内容で「api.py」を作成します:
# api.py from fastapi import FastAPI from pydantic import BaseModel app = FastAPI() class BMIRequest(BaseModel): height_cm: float weight_kg: float class BMIResponse(BaseModel): bmi: float @app.post("/bmi", response_model=BMIResponse) def calculate_bmi(data: BMIRequest): height_m = data.height_cm / 100 bmi = data.weight_kg / (height_m ** 2) return {"bmi": round(bmi, 2)}
tkinter側(UI)
以下の内容で「ui.py」を作成します:
# ui.py import tkinter as tk import requests API_URL = "http://127.0.0.1:8000/bmi" def calculate_bmi(): try: height = float(height_entry.get()) weight = float(weight_entry.get()) response = requests.post( API_URL, json={ "height_cm": height, "weight_kg": weight } ) response.raise_for_status() bmi = response.json()["bmi"] result_label.config(text=f"BMI: {bmi}") except ValueError: result_label.config(text="数値を入力してください") except requests.RequestException: result_label.config(text="APIに接続できません") # --- UI --- root = tk.Tk() root.title("BMI計算") tk.Label(root, text="身長(cm)").grid(row=0, column=0, padx=5, pady=5) height_entry = tk.Entry(root) height_entry.grid(row=0, column=1) tk.Label(root, text="体重(kg)").grid(row=1, column=0, padx=5, pady=5) weight_entry = tk.Entry(root) weight_entry.grid(row=1, column=1) calc_button = tk.Button(root, text="計算", command=calculate_bmi) calc_button.grid(row=2, column=0, columnspan=2, pady=10) result_label = tk.Label(root, text="BMI: -") result_label.grid(row=3, column=0, columnspan=2) root.mainloop()
PythonのGUI開発入門 - tkinterを使ってアプリ画面を作成する
今回はtkinterの入門をあつかった記事です。tkinterは追加インストール不要なPython標準ライブラリで、GUI(グラフィカルユーザーインターフェース)のツールを提供しています。
ウィンドウの表示(タイトル:Hello, world!)
以下の内容で「main.py」を作成します:
import tkinter as tk # アプリ本体のウィンドウを作る root = tk.Tk() # ウィンドウのタイトルとサイズを設定する root.title("Hello, world!") root.geometry("300x200") # 表示開始(イベント待ちループ) root.mainloop()
main.pyを以下で実行します:
$ python main.py
すると画面が立ち上がります:

まだ画面を作成・表示しただけなので何もないウィンドウが立ち上がるだけです。以下で要素を加えていきます。
画面にラベル(文字)を表示し、ボタンを設置する
上のスクリプトに以下のような追記を施します:
import tkinter as tk # アプリ本体のウィンドウを作る root = tk.Tk() # ウィンドウのタイトルとサイズを設定する root.title("Hello, world!") root.geometry("300x200") # 追記1:ラベルを作成してウィンドウに配置する label = tk.Label(root, text="Hello, tkinter") label.pack() # 追記2:ボタンを作成してウィンドウに配置する button = tk.Button(root, text="押す") button.pack() # 表示開始(イベント待ちループ) root.mainloop()
すると、以下のような画面が表示されます:

文字が表示され、ボタンが作成されました。しかしまだこのボタンを押したからといって何かが起きるわけではありません。次に、このボタンのクリックをトリガーとして、関数が実行されるように変更します。
ボタンのクリックで画面の文字を変える
次のように、クリックによって実行される関数を設定し、Buttonのキーワード引数commandに関数名を設定します:
import tkinter as tk # クリックで実行される関数 def change_text(): label.config(text="こんにちはTkinter!") root = tk.Tk() root.title("Hello, world!") root.geometry("300x200") label = tk.Label(root, text="Hello, tkinter") label.pack() # 変更:ボタンのクリックで関数が実行される button = tk.Button(root, text="押す", command=change_text) button.pack() root.mainloop()
画面が立ち上がり、ボタンをクリックすると文字が変わります(Hello, tkinter -> こんにちはTkinter!):

文字列を入力して画面の文字を変える
次のように変更することで入力フォームを作成、値を取得できるようになります:
import tkinter as tk def change_text(): text = entry.get() # 入力を取得する label.config(text=text) root = tk.Tk() root.title("Hello, world!") root.geometry("300x200") label = tk.Label(root, text="Hello, tkinter") label.pack() # 入力フォームの作成 entry = tk.Entry(root) entry.pack() button = tk.Button(root, text="押す", command=change_text) button.pack() root.mainloop()
左から順に、スクリプト実行によって立ち上がる画面、入力フォームに「Hi」と入力した画面、「押す」をクリックして「Hello, tkinter」が入力した文字列「Hi」に置き換わった画面です:



シンプルにFastAPIを動かす最短チュートリアル
今回はとにかく一番シンプルに FastAPI を動かすことに全振りした、最短チュートリアルの記事です。
仮想環境(任意)を用意したうえで、以下のコード実行によって必要なライブラリをインストールしておきます:
pip install fastapi uvicorn
スクリプト例
以下の内容で「main.py」を作成します:
from fastapi import FastAPI app = FastAPI() @app.get("/") # / に GET リクエストが来たら下の関数を実行 def read_root(): return {"message": "Hello FastAPI"} # 戻り値の dict は自動で JSON形式 になる
実行
main.pyがあるディレクトリを作業ディレクトリとしてターミナルで次のコードを実行します:
uvicorn main:app --reload
このコードは次のような書式で構成されています:
- main:ファイル名(main.py)
- app:FastAPIのインスタンス名
- --reload:コード変更時に自動再起動(開発用)
コード実行すると次のような出力を得ます:

このままブラウザから「http://127.0.0.1:8000」にアクセスすると次のような画面が表示されmainのread_root関数が実行されていることがわかります:

また、Swagger UI が「http://127.0.0.1:8000/docs」に自動生成されて、グラフィカルにレスポンスを確認することができます:

キーワード:FastAPI、Python、webアプリ
対話する紙としてのChat-GPT
Chat-GPTを使っていくなかで感じたことをまとめました。思考を外在化することで、日常の負荷が少し減って楽になったという話です。
はじめに
最近、家計管理や資産形成、生活設計についてGPTと継続的に対話してみました。当初は「お金の相談」が目的だったのですが、やり取りを重ねるうちに、別の効能に気づきました。それは、GPTが「答えをくれる存在」というよりは「対話する紙」になっているということです。この文章は、その気づきを忘れないための備忘録であり、同時に「考えすぎて疲れている人」への一つのヒントです。
GPTを使ってやったことと気づき
やっていたこと自体は特別なものではありません。自分の状況や考えをそのまま言語化し、数字や前提を並べ、それに対してGPTからコメントや評価をもらっただけです。
やり取りを通じて、GPTには次のような特徴があると感じました:
- 否定しない
- マウンティングしない
- 利害関係がない
- 感情的反応がない
これらは一見当たり前のように見えますが、人との会話のなかではなかなか得がたい条件です。
GPTとの対話による効能
GPTと話す過程で起きていたことを振り返ると、次のような効能がありました(並べた順番で段階が進んでいきました):
- 思考の棚卸し装置になる
- 感情を混ぜずに整理できる
- 自分の価値観が言語化される
- 判断の一貫性が高まる
- 「もう考えなくていい」地点が見えてくる
とくに大きいと思ったのは最後の段階です。考え続けている状態というのは、頭の中に未完了のタスクが常駐しているようなものです。GPTとの対話によって
- 前提
- 判断基準
- 方針
が言語化されたことで、「この件については、ここまででいい」と、自分で自分に許可を出せるようになりました。これは、頭のなかのワーキングメモリが一つ解放される感覚に近いものです。
D.カーネギーの話との共通点
ここで(D.カーネギーだったと思いますが)次のような話を思い出しました。「心配事があるときは、それらを全て紙に書き出す。そうすると、それはすでに半分解決している」という趣旨の話です。GPTとの対話は、まさにこれの現代版だと感じました。
- 書き出す
- 整理される
- 対処可能な形になる
違い(そしてそれは非常に大きな発展的な違い)は、紙が少しだけ返事をしてさらなる言語化を促してくれて、明確化が不十分・不完全だったり、あまり自覚していなかったりしていた認識を言語化して示してくれることです。
迎合的すぎるのでは?という不安について
一方で、こんな疑問も湧きました。GPTは否定しない分、迎合的すぎて客観的な認識につながらないのではないか?というものです。この点については次のように考えています。客観性は「厳しい指摘」からではなく「構造化」から生まれる、というものです。GPTは価値判断を押し付けないですが
- 論点のズレ
- 前提の不足
- 一貫性の欠如
については淡々と浮かび上がらせてくれます。ついつい人とのコミュニケーションの経験から「厳しい指摘」がないと「客観的な認識」に至れないのではないかと思ってしまいがちでしたが、こういった考えも古からの(精神論的な)先入観だったことに気付かされました。
おわりに
もし、頭の中が常に忙しいと感じているなら、一度GPTを「答えをくれる存在」ではなく「対話する紙」として使ってみるのも悪くないと思います。少なくとも私は、いくつかの思考を「もう考えなくていい箱」にしまうことができました。それだけで、ずいぶん日常が楽になりました。(ちなみに、この気づきを備忘録にまとめたいという思いを「考えなくていい」状態にするために、本記事のドラフトはGPTに書かせました)
キーワード:Chat-GPT、日常
Pythonで学ぶ機械学習:Transformerを使ったテキスト生成
機械学習の具体的な問題にPythonを使って、機械学習もPythonも同時に学んでしまいましょう。今回はTransformerを使ったテキスト生成についてまとめました。Transformerは、ChatGPTやBERTの基盤となるモデルで、自然言語処理(Natural Languege Processing, NLP)において非常に重要です。その特徴は、自己注意機構(Self-Attention)によって文の重要な部分にフォーカスできること、並列計算が可能で従来のRNNよりも高速に学習できることです。
この記事では transformers ライブラリおよび Pytorch ライブラリを用います。適宜
pip install transformers torch
などによってダウンロード・インストールしてください。ただしPythonのバージョンによってはうまく実行されないこともあります。場合によっては uv などの仮想環境で対処する必要があります。
テキスト生成の実装
transformers ライブラリを使って、GPT-2 による文章生成を行ってみます。
from transformers import pipeline # テキスト生成モデル(GPT-2)をロード generator = pipeline("text-generation", model="gpt2") # 文章生成 prompt = "The long and winding road that leads to your door" generated_texts = generator(prompt, max_length=50, num_return_sequences=3) # 結果表示 for i, text in enumerate(generated_texts): print(f"生成された文章 {i+1}:\n{text['generated_text']}\n")
- 生成された文章 1:
- The long and winding road that leads to your door is just another hurdle in making the journey a true adventure for all of you. Here's the video guide you'll need to navigate the dark tunnel that led into the castle...How do you
- 生成された文章 2:
- The long and winding road that leads to your door takes you to a great view of Lake Zurich. L.A. The best view of LA, from the back is the spectacular Hotel San Gabriel in the heart of downtown. It
- 生成された文章 3:
- The long and winding road that leads to your door is called "Equestria and the Kingdom", where you will take in the gorgeous castle scene from Huckleberry Finn who plays the titular king in an episode of "Frozen".
ポイント
- pipeline("text-generation", model="gpt2")
- GPT-2 を使って文章生成を行う
- generator(prompt, max_length=50, num_return_sequences=3)
- 最大50単語の文章を3つ生成する
Pythonで学ぶ機械学習:主成分分析
機械学習の具体的な問題にPythonを使って、機械学習もPythonも同時に学んでしまいましょう。今回は主成分分析についてまとめました。機械学習では、特徴量が多すぎると計算コストが増えたり、過学習を起こしやすくなったりします。そこで PCA(Principal Component Analysis:主成分分析)を使って、重要な情報を保持しながらデータの次元を削減する方法を学びます。
この記事では scikit-learn(sklearn)ライブラリを用います。適宜
pip install scikit-learn
などによってダウンロード・インストールしてください。
PCAの実装
PCAでは、データの分散が最大になる方向を主成分として抽出し、高次元のデータを低次元(2次元や3次元など)に圧縮します。この手法は、画像圧縮や可視化にも使われます。実装は以下の通りです:
import numpy as np import matplotlib.pyplot as plt from sklearn.decomposition import PCA from sklearn.datasets import load_iris # データセット(Irisデータ) data = load_iris() X = data.data # 4次元の特徴量 y = data.target # クラス(0, 1, 2) # PCAで2次元に圧縮 pca = PCA(n_components=2) X_pca = pca.fit_transform(X) # グラフ描画 plt.scatter(X_pca[:, 0], X_pca[:, 1], c=y, cmap='viridis', edgecolors='k') plt.xlabel("Principal Component 1") plt.ylabel("Principal Component 2") plt.title("PCA Reductioin (Iris data)") plt.colorbar(label="Class") plt.show()

ポイント
- PCA(n_components=2) で2次元に圧縮
- pca.fit_transform(X) でデータを変換
- 2次元に削減することでデータの構造を可視化できる
PCAの累積寄与率の確認
PCAでは、どれくらいの情報を保持できているかを確認することが重要です。これを累積寄与率(Explained Variance Ratio)を使って確認します。累積寄与率とは、各主成分がデータの情報をどれだけ保持しているかを表す割合で、累積寄与率が90%以上なら十分な情報を保持できていると考えられます。
import numpy as np import matplotlib.pyplot as plt from sklearn.decomposition import PCA from sklearn.datasets import load_iris # データセット(Irisデータ) data = load_iris() X = data.data # 4次元の特徴量 # PCA(すべての主成分を計算) pca = PCA() pca.fit(X) # 寄与率(各主成分の情報量)を取得 explained_variance_ratio = pca.explained_variance_ratio_ # 累積寄与率を計算 cumulative_variance = np.cumsum(explained_variance_ratio) # グラフ描画 plt.plot(range(1, len(cumulative_variance) + 1), cumulative_variance, marker='o', linestyle='--') plt.xlabel("Number of PC") plt.ylabel("EVR") plt.title("PCA EVR") plt.grid(True) plt.show()

ポイント
- pca.explained_variance_ratio_ で各主成分の寄与率を取得
- np.cumsum() で累積寄与率を計算
- 累積寄与率が90%を超える最小の主成分数を確認すると、適切な次元数がわかる
Pythonで学ぶ機械学習:サポートベクターマシン
機械学習の具体的な問題にPythonを使って、機械学習もPythonも同時に学んでしまいましょう。今回はサポートベクターマシン(SVM)を使った分類についてまとめました。SVMは、データを分ける最適な境界線(超平面)を見つけるアルゴリズムです。
この記事では scikit-learn(sklearn)ライブラリを用います。適宜
pip install scikit-learn
などによってダウンロード・インストールしてください。
SVMの実装
SVMでは、データを分類するマージン(余白)が最大になるように境界線を決めます。境界線は必ずしも直線である必要はなく、カーネル(kernel)の選択によって、線形分離できないデータも分類可能になります:
ここではまず線形SVMを考えます。実装は以下の通りです:
import numpy as np from sklearn.svm import SVC # サンプルデータ(特徴量Xとクラスy) X = np.array([[1], [2], [3], [6], [7], [8]]) # 特徴量 y = np.array([0, 0, 0, 1, 1, 1]) # クラス(0 or 1) # モデル作成(線形SVM) model = SVC(kernel='linear', C=1.0) model.fit(X, y) # 予測 X_test = np.array([[4], [5]]) # 新しいデータ y_pred = model.predict(X_test) print("予測結果:", y_pred) # 4と5はどのクラスに分類されるか?
予測結果: [0 1]
ポイント
- SVC (kernel='linear', C=1.0)
- 線形SVM を使用(kernel='linear')
- C はマージンの調整(大きいと誤分類を許さない、小さいと汎化性が高まる)
- model.fit(X, y) で学習
- model.predict(X_test) で分類
SVMの決定境界の可視化
上で扱ったデータセットの分類で、SVMがどのようにクラスを分けているのか、グラフを使って可視化してみます。
import numpy as np import matplotlib.pyplot as plt from sklearn.svm import SVC # サンプルデータ(特徴量Xとクラスy) X = np.array([[1], [2], [3], [6], [7], [8]]) # 特徴量 y = np.array([0, 0, 0, 1, 1, 1]) # クラス(0 or 1) # モデル作成(線形SVM) model = SVC(kernel='linear', C=1.0) model.fit(X, y) # 決定境界を可視化 X_test = np.linspace(0, 9, 100).reshape(-1, 1) # 0~9の範囲で細かく分割 y_pred = model.predict(X_test) # 各点の分類結果 # グラフ描画 plt.scatter(X, y, color="blue", label="Data") # 実際のデータ plt.scatter(X_test, y_pred, color="red", s=5, label="SVM classification") # 予測結果 # タイトルとラベル plt.title("SVM Decision Boundary") plt.xlabel("Feature") plt.ylabel("Class") plt.legend() plt.show()

ポイント
- X_test = np.linspace(0, 9, 100).reshape(-1, 1)
- 細かいテストデータを作成して決定境界を確認する
- plt.scatter(X_test, y_pred, color="red", s=5)
- 小さい赤点で各点の予測結果を可視化
非線形な分類
上ではカーネルとして線形の場合を考えましたが、非線形な場合も考えてみましょう。
import numpy as np import matplotlib.pyplot as plt from sklearn.svm import SVC # サンプルデータ(非線形分布) X = np.array([[1], [2], [3], [7], [8], [9]]) # 特徴量 y = np.array([0, 0, 1, 1, 0, 0]) # クラス(0 or 1) # モデル作成(非線形SVM: RBFカーネル) model = SVC(kernel='rbf', C=1.0, gamma='auto') model.fit(X, y) # 決定境界を可視化 X_test = np.linspace(0, 10, 100).reshape(-1, 1) # 0~10の範囲でテストデータ作成 y_pred = model.predict(X_test) # 各点の分類結果 # グラフ描画 plt.scatter(X, y, color="blue", label="Data") # 実際のデータ plt.scatter(X_test, y_pred, color="red", s=5, label="SVM Classification") # 予測結果 # タイトルとラベル plt.title("SVM (RBF kernel) Decision Boundary") plt.xlabel("Feature") plt.ylabel("Class") plt.legend() plt.show()

ポイント
- kernel='rbf' で 非線形分類 に対応
- gamma='auto' で データに応じた適切な曲線を引く
Pythonで学ぶ機械学習:ランダムフォレスト
機械学習の具体的な問題にPythonを使って、機械学習もPythonも同時に学んでしまいましょう。今回はランダムフォレスト(Random Forest)を使った分類についてまとめました。ランダムフォレストは決定木を複数組み合わせて、より高精度な分類を実現するアルゴリズムです。ランダムフォレストは過学習を抑えつつ、高い予測精度を得ることができます。
この記事では scikit-learn(sklearn)ライブラリを用います。適宜
pip install scikit-learn
などによってダウンロード・インストールしてください。
ランダムフォレストの実装
ランダムフォレストでは、複数の決定木を作成し、それらの多数決で最終的な予測を決定します。1本の決定木に比べて過学習が起こりにくいという特徴があります。決定木ごとにランダムにデータを選ぶことで、多様性を持たせています。実装は以下の通りです:
from sklearn.ensemble import RandomForestClassifier import numpy as np # サンプルデータ(特徴量Xとクラスy) X = np.array([[1], [2], [3], [6], [7], [8]]) # 特徴量 y = np.array([0, 0, 0, 1, 1, 1]) # クラス(0 or 1) # モデル作成(決定木を5本使用) model = RandomForestClassifier(n_estimators=5, max_depth=3, random_state=42) model.fit(X, y) # 予測 X_test = np.array([[4], [5]]) # 新しいデータ y_pred = model.predict(X_test) print("予測結果:", y_pred) # 4と5はどのクラスに分類されるか?
予測結果: [0 1]
ポイント
- RandomForestClassifier(n_estimators=5, max_depth=3, random_state=42)
- 5本の決定木を使い、最大深さ3、ランダムシード42で学習
- model.fit(X, y) で学習
- model.predict(X_test) で分類
特徴量の重要度の可視化
ランダムフォレストでは、各特徴量がどれだけ予測に重要だったのかを数値化することができます。この分析は、どのデータが分類に影響を与えているかを知るうえで役に立ちます。特徴量の重要度は、各決定木でどの特徴がどれだけデータを分割するのに寄与したかを集計することによって測ります。数値がより高いほどより重要な特徴であることが示唆されます。
import numpy as np import matplotlib.pyplot as plt from sklearn.ensemble import RandomForestClassifier # サンプルデータ(2つの特徴量を持つ) X = np.array([[1, 2], [2, 3], [3, 1], [6, 5], [7, 8], [8, 6]]) # 特徴量 y = np.array([0, 0, 0, 1, 1, 1]) # クラス(0 or 1) # モデル作成(決定木を10本使用) model = RandomForestClassifier(n_estimators=10, max_depth=3, random_state=42) model.fit(X, y) # 特徴量の重要度を取得 feature_importance = model.feature_importances_ # グラフ描画 plt.bar(["Feature 1", "Feature 2"], feature_importance, color=['blue', 'red']) plt.title("Visualization of Importance") plt.xlabel("Feature") plt.ylabel("Importance") plt.show()

ポイント
- model.feature_importances_ で各特徴量の重要度を取得
- plt.bar() で 棒グラフを作成
Pythonで学ぶ機械学習:決定木
機械学習の具体的な問題にPythonを使って、機械学習もPythonも同時に学んでしまいましょう。今回は決定木(Decision Tree)を使った分類についてまとめました。決定木はデータを条件分岐しながら分類するアルゴリズムです。
この記事では scikit-learn(sklearn)ライブラリを用います。適宜
pip install scikit-learn
などによってダウンロード・インストールしてください。
決定木の実装
樹形図(ツリー)構造を用い、特徴量の条件でデータを分類します。条件分岐を繰り返して分類していくので、学習結果を解釈しやすいという特徴があります。木の深さ(max_depth) を適切に制限しないと、過学習が起こってしまう点には注意が必要です。実装は以下の通りです:
from sklearn.tree import DecisionTreeClassifier import numpy as np # サンプルデータ(特徴量Xとクラスy) X = np.array([[1], [2], [3], [6], [7], [8]]) # 特徴量 y = np.array([0, 0, 0, 1, 1, 1]) # クラス(0 or 1) # モデル作成(最大深さ2) model = DecisionTreeClassifier(max_depth=2) model.fit(X, y) # 予測 X_test = np.array([[4], [5]]) # 新しいデータ y_pred = model.predict(X_test) print("予測結果:", y_pred) # 4と5はどのクラスに分類されるか?
予測結果: [0 1]
ポイント
- DecisionTreeClassifier(max_depth=2)
- 最大深さ2 の決定木を作成(過学習を防ぐ)
- model.fit(X, y) で学習
- model.predict(X_test) で分類
決定木の可視化
上で扱った分類問題が、決定木(Decision Tree)を利用してどのようなルールによって分類されているのか をグラフで可視化してみます。
import numpy as np import matplotlib.pyplot as plt from sklearn.tree import DecisionTreeClassifier, plot_tree # サンプルデータ(特徴量Xとクラスy) X = np.array([[1], [2], [3], [6], [7], [8]]) # 特徴量 y = np.array([0, 0, 0, 1, 1, 1]) # クラス(0 or 1) # モデル作成(最大深さ2) model = DecisionTreeClassifier(max_depth=2) model.fit(X, y) # 決定木の可視化 plt.figure(figsize=(8, 5)) plot_tree(model, feature_names=["X"], class_names=["Class 0", "Class 1"], filled=True) plt.show()

ポイント
- plot_tree(model, feature_names, class_names, filled=True) で 決定木を視覚的に表示
- max_depth=2 で ツリーの深さを制限(過学習を防ぐ)


