Skip to content

付録 ソースコード一覧

Web付録「機械学習アプリの作り方」で解説しているソースコードの一覧です。上のバッジから、まとめて実行できる Google Colab ノートブックを開けます。

pickleによるモデルの保存

import pickle
import seaborn as sns
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split

# モデルの学習(iris は seaborn 版で読み込み)
df_iris = sns.load_dataset("iris")
feature_cols = ["sepal_length", "sepal_width", "petal_length", "petal_width"]
X_train, X_test, y_train, y_test = train_test_split(
    df_iris[feature_cols].values, df_iris["species"],
    test_size=0.2, random_state=42
)
model = RandomForestClassifier(n_estimators=100, random_state=42)
model.fit(X_train, y_train)
print(f"学習時の精度: {model.score(X_test, y_test):.4f}")

# モデルをファイルに保存
with open("iris_model.pkl", "wb") as f:
    pickle.dump(model, f)
print("モデルを iris_model.pkl に保存しました")

保存したモデルの読み込みと予測

import pickle
import numpy as np

# モデルの読み込み
with open("iris_model.pkl", "rb") as f:
    loaded_model = pickle.load(f)

# 読み込んだモデルで予測
sample = np.array([[5.1, 3.5, 1.4, 0.2]])
prediction = loaded_model.predict(sample)
proba = loaded_model.predict_proba(sample)

print(f"予測結果: {prediction[0]}")
print(f"確率: {dict(zip(loaded_model.classes_, proba[0].round(4).tolist()))}")

joblibによるモデルの保存と読み込み

import joblib

# モデルの保存
joblib.dump(model, "iris_model.joblib")
print("モデルを iris_model.joblib に保存しました")

# モデルの読み込み
loaded_model = joblib.load("iris_model.joblib")
print(f"読み込んだモデルの精度: {loaded_model.score(X_test, y_test):.4f}")

ペンギン分類モデルの学習と保存

# train_penguin.py
import seaborn as sns
import joblib
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import RandomForestClassifier

# データの準備(推論時は NumPy 配列を渡すため、.values で学習しておく)
penguins = sns.load_dataset("penguins").dropna()
X = penguins[["bill_length_mm", "bill_depth_mm",
              "flipper_length_mm", "body_mass_g"]].values
y = penguins["species"]

# パイプラインの構築と学習
pipeline = Pipeline([
    ("scaler", StandardScaler()),
    ("classifier", RandomForestClassifier(
        n_estimators=100, random_state=42
    ))
])
pipeline.fit(X, y)

# モデルの保存
joblib.dump(pipeline, "penguin_model.joblib")
print("モデルを保存しました")
print(f"クラス: {list(pipeline.classes_)}")

推論関数predict_penguinの作成

# predict.py
import joblib
import numpy as np

# モデルの読み込み(アプリ起動時に1回だけ実行する想定)
model = joblib.load("penguin_model.joblib")

# 特徴量からペンギンの種類と各クラスの確率を返す
def predict_penguin(bill_length, bill_depth,
                    flipper_length, body_mass):
    features = np.array([[bill_length, bill_depth,
                          flipper_length, body_mass]])
    prediction = model.predict(features)[0]
    probabilities = model.predict_proba(features)[0]
    proba_dict = {
        species: round(float(prob), 4)
        for species, prob in zip(model.classes_, probabilities)
    }
    return prediction, proba_dict

# 動作確認
species, proba = predict_penguin(39.1, 18.7, 181.0, 3750.0)
print(f"予測結果: {species}")
print(f"確率: {proba}")

感情分析パイプラインの学習と保存(書籍第13章のモデル)

# train_sentiment.py
import pickle
import MeCab
import pandas as pd
from urllib.request import urlretrieve
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import Pipeline

# データの読み込み(第13章と同じ映画レビュー)
url = "https://ml.kano.ac/chapters/data/movie_reviews.csv"
urlretrieve(url, "movie_reviews.csv")
df = pd.read_csv("movie_reviews.csv")

# MeCabで分かち書き(アプリ側でも入力に同じ処理を行う)
tagger = MeCab.Tagger("-Owakati")
df["wakati"] = [tagger.parse(text).strip() for text in df["text"]]

# ラベルを数値に変換(positive=1, negative=0)
df["label_num"] = (df["label"] == "positive").astype(int)

# 訓練データとテストデータに分割
X_train, X_test, y_train, y_test = train_test_split(
    df["wakati"], df["label_num"], test_size=0.2, random_state=42
)

# TF-IDFベクトル化と分類器をパイプラインにまとめて学習
pipeline = Pipeline([
    ("tfidf", TfidfVectorizer()),
    ("classifier", LogisticRegression(max_iter=1000)),
])
pipeline.fit(X_train, y_train)
print(f"テスト精度: {pipeline.score(X_test, y_test):.2%}")

# パイプラインごと保存(ベクトル化と分類器がセットで保存される)
with open("sentiment_pipeline.pkl", "wb") as f:
    pickle.dump(pipeline, f)
print("保存しました: sentiment_pipeline.pkl")