本記事は「【成功の秘訣】現場で使えるデータ分析手順を体系的に解説」で紹介したモデル作成に関する具体的な手順とPythonのサンプルコードを紹介しています。
モデル作成とは

特徴量エンジニアリングにより準備したデータ(学習データ)を使ってモデルを学習させ、テストデータを用いて性能評価を行う作業です。また、モデルごとに用意されている設定値(ハイパーパラメータ)を調整し、モデルの精度を高める作業も行います。
作成したモデルの精度が低い場合、データの前処理が不十分だったり、特徴量エンジニアリングの考慮が不足している可能性があります。
また、選定したモデルやアルゴリズムが適切でないことも考えられます。このような場合には、追加のデータを収集することを含め、前工程に戻って作業をやり直すことが重要です。
モデル作成は「教師なし学習」と「教師あり学習」では手順が少し異なります。
教師なし学習
全てのデータを使ってモデルを学習させます。
あらかじめ独自の評価指標を決めておき、それに基づいて結果を評価します。
教師あり学習
データを学習データと検証データに分割し、学習データだけを使ってモデルを学習します。
出来上がったモデルに検証データを投入し、精度を評価します。
モデルの精度を高めたい場合、モデルごとのハイパーパラメータを調整します。
モデル作成の手順

モデルのプログラム作成
実際にモデルを作成するために、必要となるモジュール(scikit learn など)の入手とコーディングを行います。
よく使われるモデルについては「【成功の秘訣】モデルの選定手順と方法を解説(コピペで使えるPythonサンプルコード付き)」にまとめていますので、参考にしてください。
scikit learn を使えば数多くのモデルを作成できますが、もちろん万能ではありません。これ以外にも様々なモデルが存在しているため、Google検索や生成AI(Chat GPT,Gemini,CoPilotなど)を使ってモデルを探し、必要なプログラムを入手(作成)してください。

モデルの学習
クラスタリング、異常検知、次元削減などの「教師なし学習」では、すべてのデータを使ってモデルを学習させます。一方、「教師あり学習」においては、データを学習用と検証用に分割し、学習用のデータだけを使ってモデルを学習します。
モデルの学習方法はモデルごとに異なるため、scikit learn などモデル別の公開情報を見ていただくとして、ここでは学習用と検証用に分割する方法について紹介しておきます。
単純なランダムサンプリングによる学習データと検証データの分割
データセットをランダムにサンプリングして、学習用データと検証用データに分割します。この方法では、データがランダムに選ばれるため、偏りが少なくなります。一般的に、データセットの70-80%を学習用データとして使用し、残りの20-30%を検証用データとして割り当てます。
from sklearn.model_selection import train_test_split, StratifiedShuffleSplit
from sklearn.datasets import load_iris
# Irisデータセットを読み込む
iris = load_iris()
X = iris.data
y = iris.target
# 単純なランダムサンプリングでデータを分割
X_train_simple, X_test_simple, y_train_simple, y_test_simple = train_test_split(X, y, test_size=0.3, random_state=42)
層化サンプリングによる学習データと検証データの分割
クラスごとにデータを層別化してからランダムにサンプリングする方法です。この方法は、クラスの分布が不均衡な場合や、クラスごとのサンプル数が異なる場合に特に有効です。層化サンプリングを使用すると、各クラスが学習用データと検証用データの両方に適切に含まれることが保証されます。
from sklearn.model_selection import train_test_split, StratifiedShuffleSplit
from sklearn.datasets import load_iris
# Irisデータセットを読み込む
iris = load_iris()
X = iris.data
y = iris.target
# 層化サンプリングでデータを分割
stratified_split = StratifiedShuffleSplit(n_splits=1, test_size=0.3, random_state=42)
for train_index, test_index in stratified_split.split(X, y):
X_train_strat, X_test_strat = X[train_index], X[test_index]
y_train_strat, y_test_strat = y[train_index], y[test_index]
時系列データにおける学習データと検証データの分割
時系列データの場合、通常、時間軸に沿ってデータを分割します。過去のデータを学習用に使用し、未来のデータを検証用に使用することが一般的です。これにより、モデルが未来のデータに対して適切に汎化されることが期待されます。
import numpy as np
# サンプルの時系列データを作成
time_series_data = np.random.rand(100) # サンプルの時系列データ(100個のデータポイント)
# 時系列データを学習用データと検証用データに分割
split_index = int(len(time_series_data) * 0.8) # 80%を学習用データとする
X_train, y_train = time_series_data[:split_index], time_series_data[1:split_index+1] # 学習用データ
X_test, y_test = time_series_data[split_index:-1], time_series_data[split_index+1:] # 検証用データ
# 分割結果を表示
print("学習用データ(X):", X_train)
print("学習用データ(y):", y_train)
print("検証用データ(X):", X_test)
print("検証用データ(y):", y_test)
クロスバリデーション(交差検証)による学習データと検証データの分割
データセットを複数の部分に分割し、各部分を順番に検証用データとして使用し、残りの部分を学習用データとして使用します。これにより、複数のモデルを構築し、それぞれを評価することができます。
代表的なクロスバリデーション手法には、k分割交差検証やLeave-One-Out交差検証があります。
from sklearn.model_selection import cross_val_score
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
# Irisデータセットを読み込む
iris = load_iris()
X = iris.data
y = iris.target
# 決定木分類器を使用してk分割交差検証を行う
clf = DecisionTreeClassifier()
scores = cross_val_score(clf, X, y, cv=5) # cvは分割数を指定します
# 各分割ごとの検証スコアを表示
print("Cross-Validation Scores:", scores)
# 平均スコアを計算して表示
print("Average Score:", scores.mean())
モデルの評価
モデルの評価とは、学習後のモデルがどれくらい賢くなったかを計測し、当初の目標に達しているか、学習の継続が必要を見極める作業です。
「教師なし」と「教師あり」では評価の方法が異なります。
教師なしの評価方法
評価方法 | 概要 | 主な指標 |
---|---|---|
クラスタリング | シルエット係数 | 各データポイントのクラスタ内の密度と、最も近い他のクラスタとの距離を基に計算される。係数の範囲は[-1, 1]であり、1に近いほどクラスタ内のデータが密集し、他のクラスタとは離れていることを示す。 |
ダビース・ボルディン指数 | クラスタ内のデータポイントの密度と、異なるクラスタ間の距離を基に計算される。指数が小さいほど、クラスタ内のデータが密に配置され、クラスタ間の距離が大きいことを示す。 | |
調整ランダ指数 | クラスタリング結果と事前に定義された基準ラベルとの一致度を測る指標。1に近い値が理想的であり、0に近い値はランダムなクラスタリングと同等であることを示す。 | |
次元削減 | 可視化 | 高次元データを低次元空間に射影し、データの構造やパターンを視覚的に理解する。主成分分析(PCA)、t分布確率的近傍埋め込み(t-SNE)などの手法が使用される。 |
再構成誤差 | 元の高次元データと、次元削減後の低次元表現から再構成されたデータの差異を評価する。再構成誤差が小さいほど、次元削減が元のデータを良好に捉えていることを示す。 | |
異常検知 | 異常スコアの分布 | 正常データと異常データのスコアの分布を比較し、異常スコアの閾値を設定することで異常検知を行う。異常スコアが高いほど、データが正常から外れていることを示す。 |
精度、再現率、F1スコア | 異常検知モデルの性能を評価するための教師あり学習の指標。異常データがラベル付けされている場合に使用される。 |
from sklearn.datasets import load_iris
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score, davies_bouldin_score
# データを読み込む
iris = load_iris()
X = iris.data
# モデルを学習する
kmeans = KMeans(n_clusters=3, random_state=42)
kmeans.fit(X)
labels = kmeans.labels_
# 評価する
print("Silhouette Score:", silhouette_score(X, labels))
print("Davies-Bouldin Index:", davies_bouldin_score(X, labels))
教師ありの評価方法
概要 | 式 | |
---|---|---|
分類問題 | 正解率(Accuracy) | 正しく分類されたデータの割合。 |
適合率(Precision) | 真の陽性と予測されたデータの割合。 | |
再現率(Recall) | 真の陽性と実際の陽性データの割合。 | |
F1スコア | 適合率と再現率の調和平均。 | |
ROC曲線(ROC Curve)とAUC | 偽陽性率と真陽性率のトレードオフを表示し、AUCはその曲線の下の面積。 | |
混同行列(Confusion Matrix) | 各クラスの予測結果を集計したマトリックス。 | |
回帰問題 | 誤差の絶対値の平均。 | 誤差の絶対値の平均。 |
平均二乗誤差(MSE) | 誤差の二乗の平均。 | |
二乗平均平方根誤差(RMSE) | MSEの平方根。 | |
決定係数(R^2スコア) | 予測の精度を測る指標。 |
もっと詳しい情報や、サンプルプログラムが必要な方は下記の記事をご覧ください。
【Python実践】機械学習による分類モデルの予測精度を定量的に評価する [Accuracy,Precision,Recall,F1,ROC](コピペで使えるサンプルコード付き)

【Python実践】機械学習による回帰モデルの予測精度を定量的に評価する [MAE,MSE,RMSE,R2](コピペで使えるサンプルコード付き)

パラメータ・チューニング
パラメータ(=ハイパーパラメータ)とは、機械学習モデルのアルゴリズムにおいて、学習時の動作を制御するための設定値のことです。ハイパーパラメータは、モデルのトレーニング前に設定され、学習プロセスの外部で調整されるパラメータです。パラメータ・チューニングとは、モデルの性能が最も高くなる「設定値の組み合わせ」を探す行為のことで、これを行うことにより数%から数十%の性能改善が見込めます。
パラメータの変更と学習を繰り返すことでパラメータ・チューニングを行いますが、パラメータ数が多い場合は組み合わせの数が膨大になるため、プログラムによる自動探索方法が良く用いられます。具体的な探索方法としては、グリッドサーチ、ランダムサーチ、ベイズ最適化などがあります。
詳しくは、「【Python実践】ハイパーパラメータチューニング(最適化)3選(グリッド、ランダム、ベイズ)と実務で使えるサンプルコード紹介」の記事にサンプルコード付きで解説していますので、是非ご一読ください。

まとめ
モデル作成とは、学習データを使ってモデルを学習させ、テストデータを用いて性能評価を行う作業です。必要に応じてモデルごとのハイパーパラメータを調整し、モデルの精度を高める作業も行います。
モデルの作成手順は「教師なし学習」と「教師あり学習」では少し異なり、「教師なし学習」では全データを使ってモデルを学習させますが、「教師あり学習」ではデータを学習用と検証用に分割し、学習用データのみでモデルを学習します。
「教師あり学習」のデータ分割方法には次のものがあります。
- 単純なランダムサンプリング: データをランダムに分割します。
- 層化サンプリング: クラスごとにデータを層別化してから分割します。
- 時系列データの分割: 時間軸に沿ってデータを分割します。
- クロスバリデーション(交差検証): データを複数の部分に分割してモデルを評価します。
また、モデルの評価方法についても「教師なし学習」と「教師あり学習」では次のように異なります。
- 教師なし学習: シルエット係数、ダビース・ボルディン指数、調整ランダ指数などの指標を使用します。
- 教師あり学習: 正解率、適合率、再現率、F1スコア、ROC曲線とAUC、混同行列などの指標を使用します。
コメント