【Python × 機械学習入門】Lasso回帰で売上を予測してみよう【初心者向け】

【Python × 機械学習入門】Lasso回帰で売上を予測してみよう【初心者向け】

この記事では、Pythonのscikit-learnを用いて、Lasso回帰による回帰モデルを初心者向けに解説します。

この記事の対象読者と前提知識

  • Pythonの基本的な文法(print文、リスト、関数など)を理解している
  • データ分析や機械学習に興味があるが、まだ本格的に始めていない方
  • 線形回帰や回帰モデルについて、ざっくりとした理解がある方

Lasso回帰とは?アルゴリズムの基本

Lasso回帰(Least Absolute Shrinkage and Selection Operator)は、特徴量の選択正則化(Overfitting抑制)を同時に行う線形回帰モデルの一種です。

通常の線形回帰では、目的変数を説明するためにすべての特徴量を使用しますが、 Lasso回帰はL1ノルムのペナルティ項を追加することで、重要でない特徴量の係数をゼロにして除外します。

主な特徴:

  • 過学習(Overfitting)を防止:モデルの複雑さにペナルティを与える
  • スパース性:特徴量のうち、影響の少ないものを自然に排除
  • 解釈性が高い:選ばれた特徴量のみに注目すればよい

これは、高次元データ(特徴量が多い、例:Webデータや金融時系列など)において特に有効です。

初心者向け用語解説(Lasso回帰関連)

用語意味
LassoL1ノルムを用いた線形回帰モデル。特徴量選択も可能。
正則化(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はどうやって選べばいいですか?

通常は GridSearchCVLassoCV で複数のalpha候補から自動選定します。
手動調整の場合は 0.01〜10 の範囲でログスケールに試すのが一般的です。

関連手法との比較(Lasso vs Ridge vs 決定木)

項目Lasso回帰Ridge回帰決定木
モデルのタイプ線形回帰 + L1正則化線形回帰 + L2正則化非線形分岐モデル
過学習対策L1正則化L2正則化剪定、木の深さ制御
特徴量選択可能(係数ゼロ化)不可(全特徴量使用)条件分岐で暗黙的に選択
解釈性中〜高高(ホワイトボックス)
非線形性への対応✕(線形)✕(線形)○(非線形対応)
データ量の適性小〜中規模中規模少量〜中規模
PoC向きか?◎(高速・単純)◎(視覚的)

ChatGPTを使ってこの分析を依頼するには?(プロンプト例)

以下のようなプロンプトを使えば、Lasso回帰のコードをChatGPTに生成依頼できます:

「CSVデータを使って、Lasso回帰で売上を予測するPythonコードを作成してください。
特徴量は '月', '来店回数'、目的変数は '購入金額(円)' です。」

さらに、以下のような追加指示を出すことで精度検証やチューニングも可能です:

  • 「alphaの最適値をグリッドサーチで求めてください」
  • 「Ridge回帰と比較してください」
  • 「特徴量の係数を可視化してください」

次にやってみよう!(学習の発展提案)

  • Ridge回帰やElasticNetへの発展
  • LassoCVによる交差検証付きチューニング
  • 特徴量数が多い実務データセットでの適用

ライセンスと転載について

転載は可能ですが、以下の条件を守ってください:

  • 出典の明記(例:「出典:AI × Data Science by Shuu」)
タイトルとURLをコピーしました