第 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による一括評価¶
入力 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))