機械学習モデルの精度を上げる10のコツ【実務で使える手法】

機械学習モデルの精度を上げる10のコツ【実務で使える手法】 AIツール・レビュー

はじめに

機械学習モデルを作ったはいいけれど「なかなか精度が上がらない」という悩みは、初心者だけでなく経験者にもよくあることです。

僕もSignateのコンペや実務のプロジェクトで何度も壁にぶつかりました。そこで試行錯誤しながら学んだ「精度を上げるための実践的なコツ」を10個まとめます。

① まずデータを徹底的に理解する

モデルを急いで作りたくなりますが、最初にデータの中身をしっかり確認することが結果的に最短ルートです。

  • 各特徴量の分布を確認する(ヒストグラム・箱ひげ図)
  • 目的変数との相関を確認する
  • 欠損値・外れ値の存在を把握する
  • カテゴリ変数の種類数を確認する
import pandas as pd
import matplotlib.pyplot as plt

df.describe()  # 基本統計量
df.isnull().sum()  # 欠損値の数
df.hist(figsize=(15, 10))  # 分布の確認
plt.show()

② 前処理を丁寧にやる

「前処理が8割」とも言われるように、前処理の質がモデルの精度を大きく左右します。欠損値・外れ値・スケーリング・エンコーディングを適切に行うだけで、精度が大きく変わることがあります。

③ ベースラインを素早く作る

最初からモデルを複雑にしようとせず、まずシンプルなモデルでベースラインを作りましょう。ロジスティック回帰や決定木など、シンプルなモデルから始めることで、後から複雑なモデルと比較しやすくなります。

from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score

# シンプルなベースライン
baseline = RandomForestClassifier(n_estimators=100, random_state=42)
baseline.fit(X_train, y_train)
print(f"ベースライン精度: {accuracy_score(y_test, baseline.predict(X_test)):.3f}")

④ 交差検証で評価する

train_test_splitだけで評価すると、分け方によって結果がブレます。k分割交差検証を使うことで、安定した評価が得られます。また、データリークにも注意しましょう。

⑤ 特徴量エンジニアリングを試す

アルゴリズムを変えてもスコアが上がらないとき、特徴量の工夫が突破口になることがあります。日時データから曜日・時間帯を生成したり、2変数の比や積を新しい特徴量として追加してみましょう。

⑥ ハイパーパラメータをチューニングする

Optunaはベイズベースのハイパーパラメータチューニングツールです。GridSearchよりも効率的に最適なパラメータを探索できます。

import optuna

def objective(trial):
    n_estimators = trial.suggest_int('n_estimators', 50, 500)
    max_depth = trial.suggest_int('max_depth', 3, 20)
    
    model = RandomForestClassifier(
        n_estimators=n_estimators,
        max_depth=max_depth,
        random_state=42
    )
    score = cross_val_score(model, X_train, y_train, cv=5).mean()
    return score

study = optuna.create_study(direction='maximize')
study.optimize(objective, n_trials=100)
print(f"最良パラメータ: {study.best_params}")

⑦ アンサンブル学習を試す

複数のモデルの予測を組み合わせることで、単体より精度が上がります。代表的な方法はVoting(多数決)とStacking(予測値を新しい特徴量にする)です。

from sklearn.ensemble import VotingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC

voting = VotingClassifier(
    estimators=[
        ('rf', RandomForestClassifier(n_estimators=100)),
        ('lr', LogisticRegression()),
        ('svc', SVC(probability=True))
    ],
    voting='soft'
)
voting.fit(X_train, y_train)

⑧ 不均衡データに対処する

クラスのデータ数に偏りがある場合(例:正常品99%・不良品1%)、精度が高く見えても実は少数クラスを全く予測できていないことがあります。

  • 評価指標をAccuracyではなくF1スコアやAUCに変更する
  • class_weight=’balanced’を設定する
  • オーバーサンプリング(SMOTE)を使う
from imblearn.over_sampling import SMOTE

smote = SMOTE(random_state=42)
X_resampled, y_resampled = smote.fit_resample(X_train, y_train)

⑨ 評価指標を問題に合わせて選ぶ

精度(Accuracy)が必ずしも正しい評価指標とは限りません。問題の性質に合わせて指標を選ぶことが重要です。

  • 不均衡データ → F1スコア・AUC
  • 偽陰性のコストが高い(病気の見逃し)→ 再現率(Recall)
  • 偽陽性のコストが高い(誤検知)→ 適合率(Precision)
  • 回帰問題 → RMSE・MAE・R²

⑩ LightGBMを試す

テーブルデータであれば、LightGBMは最も精度が出やすいアルゴリズムのひとつです。XGBoostよりも高速で、大規模データでも扱いやすいです。

import lightgbm as lgb

model = lgb.LGBMClassifier(
    n_estimators=1000,
    learning_rate=0.05,
    random_state=42
)
model.fit(
    X_train, y_train,
    eval_set=[(X_test, y_test)],
    callbacks=[lgb.early_stopping(50)]
)

まとめ

精度向上のコツを10個挙げましたが、すべてを一度にやろうとすると混乱します。まずはデータ理解→前処理→ベースライン→交差検証の流れをしっかり固めることが大切です。その上で、特徴量エンジニアリングやアンサンブルを少しずつ試してみてください。

💼 ITエンジニア転職特化

自分らしく働けるエンジニア転職を目指すなら【strategy career】

年収1000万・残業月30時間以下・リモート可の求人多数

💼 無料で転職相談する →

※アフィリエイト広告を含みます

※本記事にはアフィリエイトリンクが含まれます。

コメント

タイトルとURLをコピーしました