Skip to content

第 7 章 ソースコード一覧

書籍第 7 章「分類」に掲載しているソースコードの一覧です。番号は書籍の「入力」番号と対応しています。上のバッジから、この章のコードをまとめた Google Colab ノートブックを開けます。

入力 7.1: ロジスティック回帰による2値分類

from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import pandas as pd
import seaborn as sns

# Irisデータセットの読み込み
iris = sns.load_dataset("iris")

# versicolor と virginica の2種類に限定
iris2 = iris[iris["species"].isin(
    ["versicolor", "virginica"]
)].copy()

# 特徴量とラベル
X = iris2[["petal_length", "petal_width"]].values
y = iris2["species"].values

# データ分割
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42
)

# ロジスティック回帰モデルの学習
model = LogisticRegression()
model.fit(X_train, y_train)

# 予測と精度
y_pred = model.predict(X_test)
print(f"正解率: {accuracy_score(y_test, y_pred):.2%}")

# 確率の出力(最初の5件)
y_proba = model.predict_proba(X_test)[:5]
proba_df = pd.DataFrame(y_proba.round(4),
                        columns=model.classes_)
proba_df["予測"] = y_pred[:5]
proba_df["正解"] = y_test[:5]
print("\n予測確率(最初の5件):")
print(proba_df)

入力 7.2: ロジスティック回帰による多クラス分類

from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.preprocessing import StandardScaler
import seaborn as sns

# ペンギンデータセットの読み込み
penguins = sns.load_dataset("penguins").dropna()

# 特徴量とラベル
X = penguins[["bill_length_mm", "bill_depth_mm",
              "flipper_length_mm", "body_mass_g"]].values
y = penguins["species"].values

# データ分割
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42
)

# 標準化(ロジスティック回帰では推奨)
scaler = StandardScaler()
X_train_s = scaler.fit_transform(X_train)
X_test_s = scaler.transform(X_test)

# ロジスティック回帰モデルの学習
model = LogisticRegression(max_iter=200, random_state=42)
model.fit(X_train_s, y_train)

# 予測と精度
y_pred = model.predict(X_test_s)
print(f"正解率: {accuracy_score(y_test, y_pred):.2%}")

入力 7.3: GaussianNBによる3品種の分類

from sklearn.naive_bayes import GaussianNB
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import pandas as pd
import seaborn as sns

# Irisデータセットの読み込み
iris = sns.load_dataset("iris")

# 特徴量とラベル
X = iris[["sepal_length", "sepal_width",
          "petal_length", "petal_width"]].values
y = iris["species"].values

# データ分割
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42
)

# ナイーブベイズモデルの学習
model = GaussianNB()
model.fit(X_train, y_train)

# 予測と精度
y_pred = model.predict(X_test)
print(f"正解率: {accuracy_score(y_test, y_pred):.2%}")

# 予測確率の確認(最初の3件)
y_proba = model.predict_proba(X_test)[:3]
print("\n予測確率(最初の3件):")
print(pd.DataFrame(y_proba.round(4), columns=model.classes_))

入力 7.4: k-NNによる3品種の分類

from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.preprocessing import StandardScaler
import seaborn as sns

# Irisデータセットの読み込み
iris = sns.load_dataset("iris")

# 特徴量とラベル
X = iris[["sepal_length", "sepal_width",
          "petal_length", "petal_width"]].values
y = iris["species"].values

# データ分割
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42
)

# 標準化(距離の影響を受ける手法では通常行う)
scaler = StandardScaler()
X_train_s = scaler.fit_transform(X_train)
X_test_s = scaler.transform(X_test)

# k-NN モデルの学習(k=5)
model = KNeighborsClassifier(n_neighbors=5)
model.fit(X_train_s, y_train)

# 予測と精度
y_pred = model.predict(X_test_s)
print(f"正解率: {accuracy_score(y_test, y_pred):.2%}")

入力 7.5: kの値による正解率の比較

import seaborn as sns
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import accuracy_score

# ペンギンデータの読み込み・分割・標準化(入力7.2と同じ)
penguins = sns.load_dataset("penguins").dropna()
X = penguins[["bill_length_mm", "bill_depth_mm",
              "flipper_length_mm", "body_mass_g"]].values
y = penguins["species"].values
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42
)
scaler = StandardScaler()
X_train_s = scaler.fit_transform(X_train)
X_test_s = scaler.transform(X_test)

# さまざまな k の値で正解率を比較
k_values = [1, 3, 5, 7, 9, 11, 15, 21]
for k in k_values:
    model = KNeighborsClassifier(n_neighbors=k)
    model.fit(X_train_s, y_train)
    y_pred = model.predict(X_test_s)
    acc = accuracy_score(y_test, y_pred)
    print(f"k={k:2d} の正解率: {acc:.2%}")

入力 7.6: k-NNの決定境界の可視化

import numpy as np
import matplotlib.pyplot as plt
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import StandardScaler
import seaborn as sns

# Irisデータセット(2特徴量のみ)
iris = sns.load_dataset("iris")
X = iris[["petal_length", "petal_width"]].values
y = iris["species"].values

# 標準化
scaler = StandardScaler()
X_s = scaler.fit_transform(X)

# k=5 で学習
model = KNeighborsClassifier(n_neighbors=5)
model.fit(X_s, y)

# メッシュグリッドの作成
x_min, x_max = X_s[:, 0].min() - 1, X_s[:, 0].max() + 1
y_min, y_max = X_s[:, 1].min() - 1, X_s[:, 1].max() + 1
xx, yy = np.meshgrid(
    np.arange(x_min, x_max, 0.02),
    np.arange(y_min, y_max, 0.02)
)

# 全グリッド点を予測
Z = model.predict(np.c_[xx.ravel(), yy.ravel()])

# クラス名を数値に変換(可視化用)
class_map = {"setosa": 0, "versicolor": 1, "virginica": 2}
Z_num = np.array([class_map[c] for c in Z])
Z_num = Z_num.reshape(xx.shape)

# 可視化
plt.figure(figsize=(5.8, 4.4))
plt.contourf(xx, yy, Z_num, alpha=0.3,
             cmap="RdYlBu")
for name, marker in zip(["setosa", "versicolor", "virginica"],
                        ["o", "s", "^"]):
    mask = y == name
    plt.scatter(X_s[mask, 0], X_s[mask, 1],
                marker=marker, label=name, edgecolors="k")
plt.xlabel("花弁の長さ(標準化)")
plt.ylabel("花弁の幅(標準化)")
plt.title("k-NNの決定境界 (k=5)")
plt.legend()
plt.show()

入力 7.7: SVMによるペンギンの分類

import seaborn as sns
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import accuracy_score

# ペンギンデータの読み込み・分割・標準化(入力7.2と同じ)
penguins = sns.load_dataset("penguins").dropna()
X = penguins[["bill_length_mm", "bill_depth_mm",
              "flipper_length_mm", "body_mass_g"]].values
y = penguins["species"].values
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42
)
scaler = StandardScaler()
X_train_s = scaler.fit_transform(X_train)
X_test_s = scaler.transform(X_test)

# SVM モデルの学習
model = SVC(kernel="rbf", random_state=42)
model.fit(X_train_s, y_train)

# 予測と精度
y_pred = model.predict(X_test_s)
print(f"正解率: {accuracy_score(y_test, y_pred):.2%}")

入力 7.8: カーネルによる正解率の比較

import seaborn as sns
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import accuracy_score

# Irisデータの読み込み・分割・標準化(入力7.4と同じ)
iris = sns.load_dataset("iris")
X = iris[["sepal_length", "sepal_width",
          "petal_length", "petal_width"]].values
y = iris["species"].values
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42
)
scaler = StandardScaler()
X_train_s = scaler.fit_transform(X_train)
X_test_s = scaler.transform(X_test)

# 各カーネルで比較
kernels = ["linear", "rbf", "poly"]
for kernel in kernels:
    model = SVC(kernel=kernel, random_state=42)
    model.fit(X_train_s, y_train)
    y_pred = model.predict(X_test_s)
    acc = accuracy_score(y_test, y_pred)
    print(f"{kernel}: {acc:.2%}")

入力 7.9: Cの値による正解率の変化

import seaborn as sns
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import accuracy_score

# ペンギンデータの読み込み・分割・標準化(入力7.2と同じ)
penguins = sns.load_dataset("penguins").dropna()
X = penguins[["bill_length_mm", "bill_depth_mm",
              "flipper_length_mm", "body_mass_g"]].values
y = penguins["species"].values
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42
)
scaler = StandardScaler()
X_train_s = scaler.fit_transform(X_train)
X_test_s = scaler.transform(X_test)

# C の値を変えて正解率を比較
C_values = [0.01, 0.1, 1.0, 10.0, 100.0]
for C in C_values:
    model = SVC(kernel="rbf", C=C, random_state=42)
    model.fit(X_train_s, y_train)
    train_acc = accuracy_score(
        y_train, model.predict(X_train_s))
    test_acc = accuracy_score(
        y_test, model.predict(X_test_s))
    print(f"C={C}: 訓練 {train_acc:.2%}, テスト {test_acc:.2%}")

入力 7.10: 混同行列の計算と表示

import seaborn as sns
from sklearn.metrics import confusion_matrix
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler

# ペンギンデータの読み込み(入力7.2と同じ)
penguins = sns.load_dataset("penguins").dropna()
# あえて特徴量を2つに絞って分類する
X = penguins[["bill_depth_mm", "flipper_length_mm"]].values
y = penguins["species"].values
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42
)
scaler = StandardScaler()
X_train_s = scaler.fit_transform(X_train)
X_test_s = scaler.transform(X_test)

model = LogisticRegression(max_iter=200, random_state=42)
model.fit(X_train_s, y_train)
y_pred = model.predict(X_test_s)

# 混同行列の表示
cm = confusion_matrix(y_test, y_pred)
print("混同行列:")
print(cm)
print(f"\nクラス順: {model.classes_}")

入力 7.11: classification_reportによる一括評価

from sklearn.metrics import classification_report

print(classification_report(y_test, y_pred))

入力 7.12: 4つの分類モデルの比較

import pandas as pd
from sklearn.linear_model import LogisticRegression
from sklearn.naive_bayes import GaussianNB
from sklearn.neighbors import KNeighborsClassifier
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score, f1_score

# ペンギンデータの読み込み・分割・標準化は入力7.10と同じ
# (bill_depth_mm と flipper_length_mm の2特徴量)

# 各モデルの定義
models = {
    "Logistic Regression": LogisticRegression(
        max_iter=200, random_state=42),
    "Naive Bayes": GaussianNB(),
    "k-NN (k=5)": KNeighborsClassifier(n_neighbors=5),
    "SVM (RBF)": SVC(kernel="rbf", random_state=42),
}

# 学習・評価
results = []
for name, model in models.items():
    model.fit(X_train_s, y_train)
    y_pred = model.predict(X_test_s)
    acc = accuracy_score(y_test, y_pred)
    f1 = f1_score(y_test, y_pred, average="macro")
    results.append({
        "Model": name,
        "Accuracy": f"{acc:.2%}",
        "F1 (macro)": f"{f1:.4f}"
    })

result_df = pd.DataFrame(results)
print(result_df.to_string(index=False))