モデルとモダリティの実践ガイド2026年11月10日Flatkey Team

Pythonで学ぶ機械学習:最初のモデルとGPUを使うタイミング

scikit-learnを使ったCPUでの実践チュートリアル。エラー評価と実際の作業に基づくインフラ選定を解説し、始めるのにGPUは不要です。

Pythonで学ぶ機械学習:最初のモデルとGPUを使うタイミング

Pythonで機械学習を始めるには、小さなタスクを選び、学習データとテストデータを分け、シンプルなモデルを基本的なベースラインと比較します。最初の演習のためにGPUを借りる必要はありません。このガイドでは、CPU上で完全な分類器を構築し、その誤りを解釈して、インフラを変更するのが妥当なタイミングを判断します。

目標は、繰り返して実行でき、説明できる実験を行うことです。単発の予測を的中させることよりも、モデルがどのデータを見たのか、どのように評価されたのか、どこで失敗するのかを把握するほうが有用です。

Pythonで機械学習を行う際に最初に学ぶべきこと

教師あり学習プロジェクトには、特徴量と呼ばれる入力と、ターゲットと呼ばれる既知の答えがあります。この記事の例では、特徴量は花の測定値であり、ターゲットは種です。モデルは学習セットを用いて関係を学習し、その後、分けておいた例を分類しようとします。

ライブラリを選ぶ前に、答えたい問いを書き出しましょう。

タスク 回答の種類 可能な最初の実験
観測値を分類する カテゴリ ロジスティック回帰または決定木
量を推定する 数値 線形回帰と誤差の分析
ラベルのないグループを見つける クラスタ クラスタリング手法とグループの確認
大規模な画像または言語を扱う より複雑な表現と予測 評価を定義した後に、適切なディープラーニングライブラリを使用する

より高度に見えるという理由だけでニューラルネットワークを選ばないでください。シンプルな解決策が必要なコストと期限の範囲内でタスクを解決できるなら、それは後続のあらゆる代替案にとって重要なベースラインになります。

隔離された環境を準備する

scikit-learnに対応したPythonのインストールと、ターミナルへのアクセスが必要です。他のプロジェクトとの競合を避けるため、作業フォルダと仮想環境を作成します。

python -m venv .venv

macOSまたはLinuxでは、source .venv/bin/activateで有効化します。WindowsのPowerShellでは、ローカルのターミナルポリシーに従って.venv\Scripts\Activate.ps1を使用します。次にライブラリをインストールし、バージョンを記録します。

python -m pip install scikit-learn
python -m pip freeze > requirements.txt

お使いのコンピューターで実行ファイル名がpythonではない場合は、代わりにpython3を使用してください。依存関係ファイルは環境の再作成に役立ちます。Pythonのバージョン、コード、実験の設定も保存してください。

最初の完全なモデル:花の分類

scikit-learnのIrisデータセットには、150件の観測値、4つの数値特徴量、3つのクラスが含まれています。小さく、ワークフローを学ぶのに適していますが、システムが実データに対応できることを示すものではありません。

以下のコードをexemplo_iris.pyとして保存し、python exemplo_iris.pyを実行してください。120件の観測値を学習用、30件をテスト用に使用します。層化分割によりクラスの構成比が維持され、固定シードによって同じ分割を再現できます。

import platform
from time import perf_counter
import sklearn
from sklearn.datasets import load_iris
from sklearn.dummy import DummyClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, f1_score, confusion_matrix
from sklearn.model_selection import train_test_split
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler

X, y = load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.20, random_state=42, stratify=y
)
models = {
    "baseline": DummyClassifier(strategy="most_frequent"),
    "logistica": make_pipeline(
        StandardScaler(), LogisticRegression(max_iter=1000)
    ),
}
for name, model in models.items():
    start = perf_counter()
    model.fit(X_train, y_train)
    train_seconds = perf_counter() - start
    pred = model.predict(X_test)
    print(name, "acuracia=", round(accuracy_score(y_test, pred), 3),
          "f1_macro=", round(f1_score(
              y_test, pred, average="macro", zero_division=0
          ), 3))
    print("matriz de confusao:", confusion_matrix(y_test, pred).tolist())
    print("tempo de treino (s):", round(train_seconds, 6))
print("Python:", platform.python_version(),
      "scikit-learn:", sklearn.__version__)

DummyClassifierは、特徴量とクラスの間の関係を学習しない比較対象を提供します。ここで使用する戦略では、学習データ内で最も頻度の高いクラスを予測します。より高度なモデルがこのようなベースラインを改善できない場合は、より多くのリソースを使う前に、データ、目的、評価を調査してください。戦略については、DummyClassifierのドキュメントを参照してください。

ロジスティック回帰は、Pipelineを介してデータを受け取ります。最初に標準化を行い、その後に分類器を適用します。変換は学習時に適合され、テスト時に再適用されます。これにより、評価用に保持すべき情報を使ってスケールを計算することを防げます。これは一般的なデータリークの一形態です。scikit-learnのベストプラクティスのドキュメントで、この注意点が説明されています。

出力を誤解せずに解釈する方法

CPU上でPython 3.14.4およびscikit-learn 1.9.1を使用してこの例を実行したところ、以下の結果が得られました。これらはこの演習とこのデータ分割における結果であり、別のデータセットに対する保証ではありません。

モデル テスト精度 マクロF1
最頻クラスのベースライン 0,333 0,167
標準化 + ロジスティック回帰 0,933 0,933

2つ目のモデルの行列は[[10, 0, 0], [0, 9, 1], [0, 1, 9]]でした。テスト用の30本の花のうち2本は、最後の2クラスの間で取り違えられました。これは、モデルの正解率がおよそ93%だったとだけ述べるよりも多くの情報を示します。

精度は、評価対象のデータセットにおける正しい予測の割合を示します。マクロF1は各クラスのF1を計算し、最も頻度の高いクラスに大きな重みを与えずに平均します。混同行列は、どのクラス同士が混同されたかを示します。最大の数値だけを探すのではなく、これら3つの観点を使って挙動を理解してください。

出力される時間は、そのコンピュータ上でのその実行における学習時間にすぎません。このように小さいデータセットでは、マシンや計測ノイズによって変動します。この数値をクラウドコストの削減を約束するためや、CPUとGPUを比較するために使用しないでください。

Irisの結果も、あなたの製品で期待できる精度として扱うべきではありません。独自データでは、分布、ラベルの品質、エラーのコストがまったく異なる可能性があります。まれな失敗が、数十件の容易な正解より重要になることもあります。

アルゴリズムを変更する前に、次の点を確認してください。

  1. モデルは、まったく同じテストを使って基本的なベースラインを上回りましたか?
  2. どのクラスにエラーが集中しており、そのエラーはタスクにどのような影響を与えますか?
  3. 入力に、予測後にしか利用できない情報が含まれていませんか?
  4. テストは新しいサンプルを表していますか、それとも学習データと関連する重複や観測値を含んでいますか?
  5. パフォーマンスは、他の有効なデータ分割でも維持されますか?

演習から実際のデータセットへ

ランダム分割はIrisには便利です。しかし、将来のイベントを予測する場合、顧客ごとに複数の行がある場合、または同じ観測値のコピーが見つかる場合には不適切なことがあります。そのような場合は、モデルの利用方法に応じて、時系列分割またはグループ分割を検討してください。random_stateパラメータは、概念的に誤った分割を修正するものではありません。train_test_splitのリファレンスでは、この単純な分割で利用できる制御項目を説明しています。

設定の選択には検証用データを確保し、最終テストは別に維持してください。次の調整を決めるためにテストを繰り返し参照すると、テストが選択に影響を与えるようになります。小規模なプロジェクトであっても、実験用のスプレッドシートが役立ちます。

記録項目 記録する内容
データ 出所、日付、サイズ、列、除外ルール
分割 時系列、グループ別、またはランダム。該当する場合はシード
モデル アルゴリズム、パラメータ、依存関係のバージョン
評価 主指標、クラス別のエラー、ベースラインとの比較
運用 時間、メモリ、アーティファクトのサイズ、測定したコスト
判断 改善した点と、未解決のまま残る問題

Irisを独自の表形式データに置き換える場合は、学習前に型、欠損フィールド、カテゴリを検証してください。予測時にも同じデータ準備が使われるよう、変換処理はモデルと一緒に維持してください。コードがそのまま実行され続けていても、単位が変更された列は問題を引き起こす可能性があります。

GPUが役立つ場合と役立たない場合

このガイドの例はCPUで動作します。マシンにGPUを追加しても、scikit-learnのすべてのコードが自動的にそれを使用するわけではありません。このプロジェクトでは、特定の入力やオプションを通じたものを含め、限られた推定器と設定に対するGPUサポートを文書化しています。選択したアルゴリズムで使用される正確な経路を確認してください。

互換性のある実装があり、特定のニューラルネットワークの学習やバッチ処理のようにGPUを活用できるワークロードがある場合は、GPUを試す価値があります。それでも、データ転送、環境準備、インフラコストを上回る効果が必要です。

観測された状況 推奨される次のアクション
データが少なく、CPUでのトレーニングが高速 データ品質と評価を優先する
読み込みまたは準備に大半の時間がかかる ストレージ、読み込み、変換を計測する
GPU互換の経路がないアルゴリズム ライブラリを見直すか、CPUを継続して使用する
GPU互換のトレーニングがサイクルの大部分を占める 候補構成で管理されたテストを実行する
大規模なモデルまたは大量の推論 実際の負荷でメモリ、レイテンシ、同時実行性を計測する

1つの操作の実行時間だけでなく、有用な結果が得られるまでの合計時間を比較してください。インストール、転送、トレーニング、検証、ストレージ、アイドル時間を含めます。必要な品質に到達するまでにより多くの試行を要するなら、エポックごとに高速な選択肢でも劣る場合があります。

プロジェクトがこの段階に達したら、Flatkey Cloud GPUでNVIDIA GPUのレンタルオプションを評価できます。想定する負荷に対して、構成、リージョン、可用性、条件を確認してください。データセットのサイズ、ライブラリ、必要なメモリ、テストの目的を用意してください。このチュートリアルを完了するためにGPUを契約する必要はありません。

モデルを実運用する前に

受け付ける入力形式、無効なフィールドに対する動作、公開後にエラーを追跡する方法を定義してください。モデルのバージョンとデータの前処理は一緒に保管します。スケールについて考える前に、ノートブックの外で代表的なデータを使って予測をテストしてください。

次のステップが自前のインフラで言語モデルを提供することであれば、vLLMのデプロイガイドは別種の負荷を扱っています。小規模な表形式分類器とLLMの運用を混同しないでください。メモリ、評価、サーバーの要件は異なります。

よくある質問

Pythonで機械学習を学ぶのにGPUは必要ですか?

いいえ。提示した例はCPUで実行できます。計測されたボトルネックがあり、それを活用できる実装がある場合に、より大きなインフラを選択してください。

より複雑なモデルの前にベースラインを使うのはなぜですか?

単純なルールで何が得られるかを示してくれます。これにより、モデルが有用なことを学習したかどうか、追加の複雑さが正当化されるかどうかを評価できます。

同じシードなら、どの環境でも同じ結果が保証されますか?

そのパラメータで制御されるランダムな選択を固定します。バージョンと環境も記録してください。実装や実行の違いが結果に影響する場合があります。データ分割の再現性を、性能の普遍的な保証と混同しないでください。

Irisの次に取り組むべきプロジェクトは何ですか?

理解しているデータ、検証可能なターゲット、成功基準を備えた小さなタスクを選んでください。ベースライン、正しい分割、モデル、エラー分析、計測というプロセスを繰り返します。この習慣が、必要になる前にコストを増やすことなく、Pythonでの機械学習を発展させる基盤になります。