【Python × 機械学習入門】Lasso回帰で売上を予測してみよう【初心者向け】
この記事では、Pythonのscikit-learnを用いて、Lasso回帰による回帰モデルを初心者向けに解説します。
この記事の対象読者と前提知識
- Pythonの基本的な文法(print文、リスト、関数など)を理解している
- データ分析や機械学習に興味があるが、まだ本格的に始めていない方
- 線形回帰や回帰モデルについて、ざっくりとした理解がある方
Lasso回帰とは?アルゴリズムの基本
Lasso回帰(Least Absolute Shrinkage and Selection Operator)は、特徴量の選択と正則化(Overfitting抑制)を同時に行う線形回帰モデルの一種です。
通常の線形回帰では、目的変数を説明するためにすべての特徴量を使用しますが、 Lasso回帰はL1ノルムのペナルティ項を追加することで、重要でない特徴量の係数をゼロにして除外します。
主な特徴:
- 過学習(Overfitting)を防止:モデルの複雑さにペナルティを与える
- スパース性:特徴量のうち、影響の少ないものを自然に排除
- 解釈性が高い:選ばれた特徴量のみに注目すればよい
これは、高次元データ(特徴量が多い、例:Webデータや金融時系列など)において特に有効です。
初心者向け用語解説(Lasso回帰関連)
用語 | 意味 |
---|---|
Lasso | L1ノルムを用いた線形回帰モデル。特徴量選択も可能。 |
正則化(Regularization) | モデルの複雑さにペナルティを課し、汎化性能を高める技術。 |
L1ノルム | 係数の絶対値の合計。Lasso回帰で使われ、係数をゼロにできる。 |
スパース性 | 多くの特徴量の重みが0になり、重要な変数のみを使う状態。 |
ハイパーパラメータ(alpha) | 正則化の強さを調整する。大きいとゼロになる特徴量が増える。 |
学習データ/テストデータ | モデルを訓練するデータ/精度を検証する未知のデータ。 |
MSE(平均二乗誤差) | 誤差の2乗の平均。大きな誤差を重視。 |
MAE(平均絶対誤差) | 誤差の絶対値の平均。直感的に理解しやすい。 |
係数(coefficient) | 各特徴量にかかる重み。0ならその特徴量は無視される。 |
Python実装手順(ステップ構成)
ステップ1:ライブラリのインポート
基本的な機械学習の処理に必要なライブラリを読み込みます。Lassoは sklearn.linear_model
に含まれます。
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.linear_model import Lasso
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, mean_absolute_error
ステップ2:データの読み込み
CSVファイルを読み込み、データの構造を確認します。データの欠損や型にも注目しましょう。
df = pd.read_csv("sales_data.csv")
print(df.info())
print(df.head())
ステップ3:特徴量と目的変数の分割
説明変数(特徴量)と予測対象(目的変数)を分けます。今回は「月」「来店回数」で「購入金額(円)」を予測します。
X = df[["月", "来店回数"]]
y = df["購入金額(円)"]
ステップ4:データ分割
訓練データとテストデータに分割します。random_state
を指定すると実験の再現性が保たれます。
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42
)
ステップ5:モデルの学習と評価
Lasso回帰モデルを作成し、学習・予測・評価を行います。 alpha
は正則化の強さを制御するハイパーパラメータで、値が大きいほど係数がゼロに近づきます。
model = Lasso(alpha=0.5, max_iter=1000, random_state=42)
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
print("MSE:", mean_squared_error(y_test, y_pred))
print("MAE:", mean_absolute_error(y_test, y_pred))
🧠 Tips: max_iter
は収束しないときに調整。alpha は GridSearchCV などで最適化するのが実務的。
ステップ6:係数と切片の確認&可視化
どの特徴量がどの程度寄与しているかを確認できます。Lassoでは不要な特徴量の係数がゼロになります。
print("切片 (intercept):", model.intercept_)
print("係数 (coefficients):", model.coef_)
plt.bar(X.columns, model.coef_)
plt.title("Lasso回帰の特徴量係数")
plt.xlabel("特徴量")
plt.ylabel("係数")
plt.tight_layout()
plt.show()
よくあるエラーと対処法(初心者がつまずきやすいポイント)
エラー: Input contains NaN
→ 欠損値が含まれていると学習が失敗します。df.dropna()
や df.fillna()
で前処理を行いましょう。
alphaが大きすぎてすべての係数がゼロになる
→ 正則化が強すぎてすべての特徴量が無視されることがあります。alpha
を 0.01 〜 1.0 程度でチューニングしましょう。
係数が全て0でも予測値がゼロにならない
→ Lassoはintercept_
(切片)を自動的に含むため、予測結果がゼロになるとは限りません。
文字列データを含む特徴量がある
→ scikit-learnはカテゴリ変数をそのまま扱えません。pd.get_dummies()
などで数値化しましょう。
FAQ(よくある質問)
Q1. Lasso回帰はどうして特徴量の数を減らせるのですか?
L1ノルム(絶対値の合計)をペナルティとして加えることで、係数の一部をゼロに収束させます。これにより重要な特徴量だけが残り、モデルの解釈性が向上します。
Q2. LassoとRidgeの使い分けは?
Ridge回帰はL2ノルムを使用してすべての係数を小さく抑えるのに対し、 Lasso回帰は一部の係数をゼロにして不要な特徴量を自動除外できます。
特徴量の選択が必要な場合はLassoが適しています。
Q3. Lassoは少量のデータでも使えますか?
はい。Lassoは高次元・少量データでも動作しやすいモデルです。特徴量数が多い場合に特に効果を発揮します。
Q4. Lassoのalphaはどうやって選べばいいですか?
通常は GridSearchCV
や LassoCV
で複数のalpha候補から自動選定します。
手動調整の場合は 0.01〜10
の範囲でログスケールに試すのが一般的です。
関連手法との比較(Lasso vs Ridge vs 決定木)
項目 | Lasso回帰 | Ridge回帰 | 決定木 |
---|---|---|---|
モデルのタイプ | 線形回帰 + L1正則化 | 線形回帰 + L2正則化 | 非線形分岐モデル |
過学習対策 | L1正則化 | L2正則化 | 剪定、木の深さ制御 |
特徴量選択 | 可能(係数ゼロ化) | 不可(全特徴量使用) | 条件分岐で暗黙的に選択 |
解釈性 | 中〜高 | 中 | 高(ホワイトボックス) |
非線形性への対応 | ✕(線形) | ✕(線形) | ○(非線形対応) |
データ量の適性 | 小〜中規模 | 中規模 | 少量〜中規模 |
PoC向きか? | ◎(高速・単純) | ○ | ◎(視覚的) |
ChatGPTを使ってこの分析を依頼するには?(プロンプト例)
以下のようなプロンプトを使えば、Lasso回帰のコードをChatGPTに生成依頼できます:
「CSVデータを使って、Lasso回帰で売上を予測するPythonコードを作成してください。
特徴量は '月', '来店回数'、目的変数は '購入金額(円)' です。」
さらに、以下のような追加指示を出すことで精度検証やチューニングも可能です:
- 「alphaの最適値をグリッドサーチで求めてください」
- 「Ridge回帰と比較してください」
- 「特徴量の係数を可視化してください」
参考リンク・原典リソース
- 🔗 scikit-learn公式:Lasso回帰
- 📘 Wikipedia: Lasso (statistics)
- 📄 Tibshirani (1996): Regression Shrinkage and Selection via the Lasso
- 📘 Princeton資料:Lasso and Ridge Regression(PDF)
次にやってみよう!(学習の発展提案)
- Ridge回帰やElasticNetへの発展
- LassoCVによる交差検証付きチューニング
- 特徴量数が多い実務データセットでの適用
ライセンスと転載について
転載は可能ですが、以下の条件を守ってください:
- 出典の明記(例:「出典:AI × Data Science by Shuu」)