機械学習で精度の高いモデルを構築しようとするとき、「特徴量が多すぎて、どれが本当に重要なのか分からない」と感じた経験はありませんか?多くの特徴量は情報量を増やす一方で、ノイズや過学習の原因となり、かえってモデルの性能を低下させることがあります。
この記事では、そうした課題を解決するための強力な手法「Lasso(ラッソ)回帰」の基礎理論から、Pythonの定番ライブラリScikit-learnを使った実践的な実装方法までを網羅的に解説します。
この記事を読み終える頃には、Lasso回帰を使ってモデルから不要な特徴量を自動的に削り、よりシンプルで解釈しやすいモデルを構築するスキルが身についているはずです。
はじめに:なぜLasso回帰が重要なのか?
モデルの性能を向上させるためには、単に多くの情報を与えるだけでなく、**質の高い情報だけを選択する「特徴量選択」**のプロセスが極めて重要です。
Lasso回帰は、回帰分析の手法の一つでありながら、この特徴量選択をアルゴリズムの内部で自動的に行ってくれるという優れた特性を持っています。
- モデルのシンプル化: 不要な特徴量を取り除くことで、モデルが何を重視しているのかが分かりやすくなります。
- 過学習の抑制: 訓練データにのみ過剰に適合してしまう現象を防ぎ、未知のデータに対する予測性能(汎化性能)を高めます。
- 次元削減: 特徴量が非常に多い(高次元な)データセットでも、計算コストを抑えつつ効果的なモデルを構築できます。
それでは、Lasso回帰がどのようにしてこれらの課題を解決するのか、その仕組みから見ていきましょう。
Lasso回帰のキホン:L1正則化とスパース性
結論から言うと、Lasso回帰は予測に貢献しない特徴量の係数(重要度)を、文字通り「0」にすることができます。
通常の線形回帰(最小二乗法)は、すべての特徴量を使い、予測誤差が最も小さくなるように係数を調整します。一方、Lasso回帰はそれに加えて「L1正則化」と呼ばれるペナルティ項を課します。これは、係数の絶対値の合計が大きくなりすぎないように制限をかける仕組みです。
このL1正則化の働きにより、予測への影響が小さいと判断された特徴量の係数は、積極的に0へと押し込まれます。 係数が0になった特徴量は、実質的にモデルから除外されたことと同じです。この性質を「スパース性(疎性)」と呼び、Lasso回帰による特徴量選択の根幹をなす概念です。
よく似た手法「Ridge回帰」との決定的な違い
Lassoとよく比較される手法に「Ridge(リッジ)回帰」があります。Ridge回帰も係数が大きくなりすぎるのを防ぐ(L2正則化)点は同じですが、係数を0に近づけるだけで、完全に0にすることはありません。
- Lasso回帰: 不要な特徴量の係数を完全に0にし、特徴量選択(次元削減)を行える。
- Ridge回帰: すべての特徴量を使いつつ、係数の大きさを全体的に抑えることで過学習を防ぐ。
「どの特徴量が予測に不要かを知りたい」「モデルをできるだけシンプルにしたい」という明確な目的がある場合、Lasso回帰は非常に強力な選択肢となります。
Scikit-learnを使ったLasso回帰の基本的な使い方
結論として、sklearn.linear_model.Lassoをインポートすれば、数行のコードでLasso回帰を実践できます。
ここからは、カリフォルニアの住宅価格データセットを例に、PythonコードでLasso回帰を実装する方法をステップバイステップで見ていきましょう。
H3: 環境準備とデータの用意
まず、必要なライブラリをインポートし、データを準備します。Lasso回帰を適用する上で、事前に各特徴量のスケールを揃える「標準化」が非常に重要なステップとなります。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import Lasso
from sklearn.datasets import fetch_california_housing
from sklearn.metrics import mean_squared_error
# 1. データの読み込み
california = fetch_california_housing()
X = pd.DataFrame(california.data, columns=california.feature_names)
y = pd.Series(california.target)
# 2. 訓練データとテストデータに分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 3. データを標準化
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
# スケール後のデータをDataFrameに戻して確認
X_train_scaled = pd.DataFrame(X_train_scaled, columns=X.columns)
print("--- 標準化後の訓練データ ---")
print(X_train_scaled.head())H3: モデルの学習と予測
Lassoクラスのインスタンスを作成し、学習(fit)と予測(predict)を行います。インスタンス化の際にalphaという引数を指定しますが、これはL1正則化の強さを決める重要なハイパーパラメータです。
# 4. Lassoモデルのインスタンス化と学習
# alphaは正則化の強さを決めるパラメータ。大きいほど係数が0になりやすい。
lasso = Lasso(alpha=0.1, random_state=42)
# 標準化された訓練データでモデルを学習
lasso.fit(X_train_scaled, y_train)
# 5. テストデータで予測
y_pred = lasso.predict(X_test_scaled)
# 6. モデルの評価(平均二乗誤差)
mse = mean_squared_error(y_test, y_pred)
print(f"\n平均二乗誤差 (MSE): {mse:.4f}")H3: 結果の確認:どの特徴量が選ばれたか?
学習後のlassoオブジェクトのcoef_属性を調べることで、各特徴量に割り当てられた係数を確認できます。係数が0になった特徴量が、Lassoによって「不要」だと判断され削られたものです。
# 7. 学習された係数(重み)の確認
coefficients = lasso.coef_
coef_series = pd.Series(coefficients, index=X.columns)
print("\n--- Lasso回帰によって学習された係数 ---")
print(coef_series)
# 係数が0でない特徴量(選択された特徴量)を抽出
selected_features = coef_series[coef_series != 0]
print(f"\n元の特徴量の数: {len(coef_series)}")
print(f"選択された特徴量の数: {len(selected_features)}")
print("\n--- 選択された特徴量とその係数 ---")
print(selected_features.sort_values(ascending=False))この結果から、alpha=0.1と設定した場合、いくつかの特徴量の係数が0になり、モデルから除外されたことが明確に分かります。
Lasso回帰の性能を最大限に引き出すalphaの調整
結論として、alphaの値をデータに応じて最適化することで、Lasso回帰の予測性能は格段に向上します。
H3: ハイパーパラメータalphaとは?
alphaはL1正則化のペナルティの強さを決めるパラメータです。この値のバランスがモデルの性能を左右します。
alphaが大きい: ペナルティが強い。係数を0にする力が強く働き、非常にシンプルなモデル(選択される特徴量が少ない)になる。alphaが小さい: ペナルティが弱い。より多くの特徴量がモデルに残り、通常の線形回帰の振る舞いに近づく。
最適なalphaは手探りで探すこともできますが、非効率です。そこでLassoCVが役立ちます。
H3: 最適なalphaを見つける方法:LassoCV
LassoCVは、クロスバリデーション(データを複数に分割し、汎化性能を評価する手法)を行いながら、最も性能が高くなるalphaを自動で探索してくれる非常に便利なクラスです。
from sklearn.linear_model import LassoCV
# LassoCVで最適なalphaを探索
# cv=5はデータを5分割してクロスバリデーションを行う設定
lasso_cv = LassoCV(cv=5, random_state=42, n_jobs=-1) # n_jobs=-1で並列計算
# 最適なalphaを探しながらモデルを学習
lasso_cv.fit(X_train_scaled, y_train)
# 見つかった最適なalphaの値
print(f"LassoCVによって見つかった最適なalpha: {lasso_cv.alpha_:.5f}")
# 最適なモデルでの評価
y_pred_cv = lasso_cv.predict(X_test_scaled)
mse_cv = mean_squared_error(y_test, y_pred_cv)
print(f"LassoCVによるMSE: {mse_cv:.4f}")
# 最適化後の係数を確認
coef_cv_series = pd.Series(lasso_cv.coef_, index=X.columns)
print("\n--- 最適化後に選択された特徴量 ---")
print(coef_cv_series[coef_cv_series != 0].sort_values(ascending=False))LassoCVを用いることで、クロスバリデーションに基づいた客観的な指標で最適なalphaを見つけ出し、より信頼性の高いモデルを構築することができました。
まとめ:Lasso回帰を理解して、より良いモデルを作ろう!
今回は、PythonのScikit-learnを用いてLasso回帰の基礎理論と実践的な活用法を解説しました。
- Lasso回帰の基礎: L1正則化の力で、不要な特徴量の係数を完全に0にし、自動的な特徴量選択を実現する。
- Lasso回帰の実践:
Lassoクラスで簡単に実装可能。ただし、事前のデータ標準化が極めて重要。 - 性能の最大化:
LassoCVを用いることで、データに最適な正則化の強さ(alpha)を自動で探索し、モデルの汎化性能を高めることができる。
特徴量をただ増やすだけでなく、Lasso回帰のように「賢く削る」技術を身につけることで、あなたの機械学習モデルは次のレベルへと進化するでしょう。ぜひ、この強力な手法をあなたのデータ分析プロジェクトで活用してみてください。


コメント