線形回帰の完全な分析: 基本理論から Python 実装まで

概要

線形回帰は統計と機械学習の基礎です。最も単純な単一変数の線形回帰から、より複雑な多変数の線形回帰まで、このメソッドは強力なツールを提供します。データ内の関係を理解し​​、知識に基づいた予測を行うことができます。

機械学習の線形回帰
この記事では、Xiaobi が回帰の基本理論を詳細に紹介し、Python での実際のケースを通じてそれを実証します。機械学習の初心者であっても、線形回帰をより深く理解したい場合でも、この記事は洞察を提供します。そして指導。

線形回帰とは何ですか?

線形回帰は、機械学習の分野で最も広く使用されているよく知られたアルゴリズムの 1 つです。線形回帰は推定値 Aたとえば、休日の予測では、過去の休日とそれに関連するさまざまな要素 (住宅面積、築年数など) を導き出すと、線形回帰を使用して将来の住宅価格を予測できます。あ>

主要な概念

従属変数

従属変数 従属変数は、予測したい変数であり、私たちが関心を持つ主なターゲットです。

例えば、住宅価格を予測したい場合、住宅価格を従属変数(従属変数)とし、要因(特徴)(住宅面積、建築年など)から予測する必要があります。

適切な従属変数は回帰分析の最初のステップであり、目標が何か、成功を測定する方法が確実にわかります。

独立変数

独立変数は、従属変数を予測するために使用する変数であり、独立変数は従属変数に影響を与えますが、従属変数の影響は受けません。

例:住宅価格を予測する例では、住宅の面積、立地、学校の近さ、築年数などはすべて独立変数(独立変数)であり、これらはすべて住宅価格に影響を与える可能性のある要素です。

線形回帰モデルの有効性を確保するには、正しい独立変数を選択することが重要です。無関係または冗長な独立変数を選択すると、モデルのパフォーマンスが低下し、モデルの結果を解釈することが難しくなります。

線形関係

線形回帰の中心となる考え方は、独立変数と従属変数の間の関係を記述するために最適な直線を使用することです。この線は回帰直線とも呼ばれます。線形回帰では、次の関係があると仮定します。独立変数と従属変数 この関係は線形です。つまり、独立変数を変更すると、従属変数も線形に変化します。

データ ポイントの分布を表す直線を見つけることは、関係を予測して説明するために重要です。この線は最良適合線と呼ばれ、直線からの各データ ポイントの距離を最小化します。これらの距離はバイアスと呼ばれます。)。

公式:
y = w x + b y = wx + b そして=wx+b

簡単なケースを次に示します。

データ: 給与と年齢 (2 つの特徴)
目標: 銀行が融資してくれる金額を予測する (ラベル)

給料 クォータ
4000 25 20000
8000 30 70000
5000 28 35000
7500 33 50000
12000 40 85000

給与と年齢は最終的な銀行ローンの結果に影響しますが、それぞれどの程度の影響があるのでしょうか?

X1、X2 は年齢と給与という 2 つの特性を表し、Y は最終的に銀行が貸してくれる金額を表します。

以下に示すように、データ ポイントに最もよく適合する最も適切な線 (高次元を想像してください) を見つけます。

線形回帰

基本的な一次方程式

表現理解

y = w 0 + w 1 x 1 + w 2 x 2 y =w_0 + w_1x_1 + w_2x_2そして=0 +1 バツ1 +2 バツ2

  • w0w_00 はオフセット上部であり、C と同等です
  • x1、x2は独立変数(Dependent Variable)であり、予測に使用される要素です。
  • そしてそしてy は従属変数 (独立変数)、つまり予測する値です。
  • w1w_11 w 2 w_2 2 は傾きで、x1 と x2 が 1 単位増加したときの y の期待値の変化を表します。

線形モデル、ベクトル w 値。予測における各属性の重要性を客観的に表現するため、線形モデルは解釈可能性が高い。この種の「多特徴予測」、つまり (重線形回帰) の場合、線形回帰はこれらを取得することです。これに基づいて w 値を計算し、これらの値を使用してモデルを構築し、データを事前テストします。簡単に言えば、実際の出力ラベルをできるだけ正確に予測するために線形モデルを学習することです。

次に、多変数線形回帰の場合、θ 値と特徴 X 値の関係をベクトルで表現できます。
ここに画像の説明を挿入します
2 つのベクトルを乗算すると、結果は 1 になります。整数は推定値です。ここで、すべての特徴セットの最初の固有値 x 0 = 1 x_0=1 バツ0 =1 の場合、一般的なベクトル式で性的モデルを表現できます。

h θ ( x ) = ∑ i = 0 n θ i x i = θ T x h_\theta(x)=\sum\limits_{i=0}^{n}\theta_ix_i = \theta^Txhθ (x)=i=0n i バツi =Tx

多変数回帰

多変数線形回帰では、複数の変数が存在します。方程式は次のように表すことができます:
y = w 0 + w 1 x 1 + w 2 x 2 + w 3 x 3 + . . . + w n x n y = w_0 + w_1x_1 + w_2x_2 + w_3x_3 + ... + w_nx_n そして=0 +1 バツ1 +2 バツ2 +3 バツ3 +...+n バツn

上の式では n 個の独立変数があり、それぞれに対応する係数 (重み) があるため、モデル内でより多くの影響要因を考慮できるようになり、予測の精度が向上します。

誤差項と損失関数

エラー

モデルがすべてのデータ ポイントに完全に適合しない場合、主にデータ内に存在するノイズや観測値に影響を与える要因が原因です。誤差項は、この不確実性を定量化するのに役立ちます。

平均二乗誤差 (MSE)

MSE (平均二乗誤差) は、Mo モデルのパフォーマンスを評価するための重要な指標であり、予測値と実際の値の差の尺度です。

公式:
M S E = 1 n ∑ i = 1 n ( y i − y ^ i ) 2 MSE = \frac{1}{n}\sum\limits_{i= 1}^{n}(y_i - \^y_i)^2 MSE=n1 i=1n (yi そして^ i )2

  • yiy_iそしてi : は実際の値です
  • y ^ i \^y_iそして^ i : は予測値です

MSE が小さいほど、モデルの精度は高くなります。

最小二乗法

最小二乗法とは何ですか

最小二乗法 (Least Squares) は、統計および数値解析における古典的な手法であり、回帰分析やカーブ フィッティングで広く使用されています。最小二乗法の中心的な考え方は、明確な基準に基づいて位置パラメータを決定することです。トレーニング データに対するモデルの予測誤差の二乗和が最小化されていることを確認します。

公式:
S = ∑ i = 1 n ( y i − ( w 0 + w 1 x 1 ) ) 2 S = \sum\limits_{i=1}^{ n}(y_i -(w_0 + w_1x_1))^2 S=i=1n (yi (w0 +1 バツ1 ))2

最小二乗法の考え方

最も単純な線形回帰モデルを考えます。モデルは次のとおりです。
y = w 0 + w 1 x 1 y =w_0 + w_1x_1 そして=0 +1 バツ1

私たちの目標は、二乗誤差の合計を最小限に抑えることです。
S = ∑ i = 1 n ( y i − ( w 0 + w 1 x 1 ) ) 2 S = \sum \ 制限_{i=1}^{n}(y_i -(w_0 + w_1x_1))^2 S=i=1n (yi (w0 +1 バツ1 ))2

S の値を最小にする w0 と w1 の偏導関数を見つけて 0 に設定する必要があります。これにより一連の方程式が得られます。方程式を解くことで、それぞれ w0 と w1 を取得できます。これらの値二乗誤差を最小にする値です。

詳細な導出

w0 の偏導関数を求めます。

w0 に関する S の偏導関数を求めるには、接続規則、二乗の導関数を使用する必要があります。 ( u 2 ) ' = 2 u d u = 2 u (u^2)' = 2udu = 2u (u2)=2udu=2u:

∂ S ∂ w 0 ( y i − ( w 0 + w 1 x 1 ) ) 2 = 2 ( y i − w 0 − w 1 x 1 ) d ( − w 0 ) = 2 ( y i − w 0 − w 1 x 1 ) × ( − 1 ) = 2 ( w 0 + w 1 x 1 − y i ) \frac{\partial S}{\partial w_0} (y_i -(w_0 + w_1x_1))^2\\= 2(y_i - w_0) - w_1x_1)d(-w_0) \\= 2(y_i - w_0 - w_1x_1) \times (-1) \\= 2(w_0 + w_1x_1 - y_i)0 S (yi (w0 +1 バツ1 ))2=2(yi 0 1 バツ1 )d(w0 )=2(yi 0 1 バツ1 )×(1)=2(w0 +1 バツ1 そしてi )

S を最小化するには、上記の偏導関数を 0 に等しくします。

2 ∑ i = 1 n ( w 0 + w 1 x 1 − y i ) = 0 2\sum\limits_{i=1}^{n}(w_0 + w_1x_1 - y_i) = 02i=1n (w0 +1 バツ1 そしてi )=0

線形回帰のモデルの仮定

線形関係

線形回帰モデルは、従属変数と独立変数の間に線形関係があることを判断します。つまり、2 つの関係には 1 つ以上の係数 (w1、w2) と予測子変数 (x1、x2) を乗算することができます。プラス (w0) を表す定数。これは線形回帰モデルの基礎であり、この仮定に違反するとモデルの予測力の低下につながる可能性があります。

線形関係は線形回帰の名前の由来です。この仮定が満たされない場合、線形回帰モデルは適切な選択ではありません。従属変数と独立変数の間の関係を直線で正確に捉えることができないためです。

線形関係かどうかを判断する方法:

"""
@Module Name: 通过残差图判断线性关系.py
@Author: CSDN@我是小白呀
@Date: October 17, 2023

Description:
通过残差图判断线性关系
"""
from sklearn.linear_model import LinearRegression
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

plt.style.use("fivethirtyeight")  # 设置绘图样式
plt.rcParams['font.sans-serif'] = ['SimHei']  # 设置中文字体 'SimHei'
plt.rcParams['axes.unicode_minus']=False

# 设置随机数种子
np.random.seed(0)

# 模拟线性数据 y = 3x + b
X_linear = np.random.rand(100, 1) * 10  # 100个样本, 范围0-10
y_linear = 3 * X_linear + np.random.randn(100, 1) * 2  # 线性关系 + 噪声 (0-1)

# 模拟非线性数据 y = 3x^2 + b
X_non_linear = np.random.rand(100, 1) * 10  # 100个样本, 范围0-10
y_non_linear = 3 * X_non_linear**2 + np.random.randn(100, 1) * 2  # 二次方关系 + 噪声 (0-1)


# 实例化线性回归模型
model = LinearRegression()

# 训练线性
model.fit(X_linear, y_linear)  # 训练
y_linear_pred = model.predict(X_linear)  # 预测
residuals_linear = y_linear - y_linear_pred  # 计算残差

# 训练非线性
model.fit(X_non_linear, y_non_linear)  # 训练
y_non_linear_pred = model.predict(X_non_linear)  # 预测
residuals_non_linear = y_non_linear - y_non_linear_pred  # 计算残差

# 绘制残差图
f, ax = plt.subplots(1, 2, figsize=(16, 8))
f.suptitle('残差图')

# 线性残差图
sns.residplot(ax=ax[0], x=y_linear_pred.flatten(), y=residuals_linear.flatten(), lowess=True, line_kws={'color': 'red', 'lw': 1})
ax[0].axhline(y=0, color='gray', linestyle='--')
ax[0].set_xlabel('预测值')
ax[0].set_ylabel('残差')
ax[0].set_title('线性数据残差图')

# 非线性残差图
sns.residplot(ax=ax[1], x=y_non_linear_pred.flatten(), y=residuals_non_linear.flatten(), lowess=True, line_kws={'color': 'red', 'lw': 1})
ax[1].axhline(y=0, color='gray', linestyle='--')
ax[1].set_xlabel('预测值')
ax[1].set_ylabel('残差')
ax[1].set_title('非线性数据残差图')

plt.show()

出力結果:
残差プロット

残差プロットとは、目標値と予測値の差である残差 (Residual) を縦軸、その他の指定された数量を横軸とした散布図のことです。上の図の左側は 0 の平均値です。ホワイト ノイズ分布では、残差値が右側の図に存在します。線形関係の残差図には、予測可能な情報が含まれていてはなりません。

独立

誤差項は独立している必要があります。これは、各データの誤差が他のデータの誤差に関連していないことを意味します。誤差が独立していない場合、モデルに特定の情報が不足し、予測バイアスが生じる可能性があります。

独立性の判断方法:
ダービン-ワトソン検定は、連続観測における誤差の連続性を検出するために使用される一般的な方法です。ダービン-ワトソン値の範囲は 0 ~ 4、 1.5 未満は正の自己相関を表し、1.5 を超えると負の自己相関を表し、1.5 ~ 2.5 は自己相関がないことを示します。

判断の独立性:

"""
@Module Name: 通过残差图判断独立性.py
@Author: CSDN@我是小白呀
@Date: October 17, 2023

Description:
通过残差图判断独立性
"""
import numpy as np
import statsmodels.api as sm
from statsmodels.regression.linear_model import OLS
import matplotlib.pyplot as plt
import seaborn as sns

plt.style.use("fivethirtyeight")  # 设置绘图样式
plt.rcParams['font.sans-serif'] = ['SimHei']  # 设置中文字体 'SimHei'
plt.rcParams['axes.unicode_minus']=False


# 设置随机数种子
np.random.seed(0)

# 独立残差数据
X = np.random.rand(100, 1) * 10  # 100个样本, 范围0-10
y = 3 * X + np.random.randn(100, 1) * 2  # 线性关系 + 噪声 (0-1)

# 残差正相关数据
X_positive = np.arange(100)
y_positive = np.array([1 for _ in range(100)])

# 正相关数据残差
model = OLS(y, X).fit()  # 使用 statsmodels 进行线性回归
residuals = model.resid  # 获取残差

# 独立数据残差
model = OLS(y_positive, X_positive).fit()  # 使用 statsmodels 进行线性回归
residuals_positive = model.resid  # 获取残差

# 进行Durbin-Watson测试
dw = sm.stats.durbin_watson(residuals)
dw_positive = sm.stats.durbin_watson(residuals_positive)

# 调试输出
print("独立残差数据 Durbin-Watson值:", dw)
print("正自相关残差数据 Durbin-Watson值:", dw_positive)

# 绘制残差图
f, ax = plt.subplots(1, 2, figsize=(16, 8))
f.suptitle('Durbin-Watson 自相关性 (独立性)')

# 线性残差图
sns.scatterplot(ax=ax[0], x=[i for i in range(100)], y=residuals)
ax[0].axhline(y=0, color='gray', linestyle='--')
ax[0].set_ylabel('残差')
ax[0].set_title('无自相关性')

# 非线性残差图
sns.scatterplot(ax=ax[1], x=[i for i in range(100)], y=residuals_positive)
ax[1].axhline(y=0, color='gray', linestyle='--')
ax[1].set_ylabel('残差')
ax[1].set_title('正自相关性')

plt.show()

出力結果:

画像の説明を追加してください

独立残差数据 Durbin-Watson值: 2.100345841035149
正自相关残差数据 Durbin-Watson值: 0.0008866112741927459

注: 正の自己相関とは、データが明確な線形の増加または減少傾向を示していることを意味します。つまり、各データがランダム ノイズではなく、前後のデータと高度に相関しています。左側の図はランダム ノイズであり、自己相関はありません。ダービン-ワトソン値は 1.5 ~ 2.5 であり、右側の図は高度な正の自己相関を示しています。

等分散性

等分散性とは、予測変数の値に関係なくモデルの等分散性が一定に保たれることを意味します。等分散性は回帰分析に安定性と効率性をもたらします。等分散性が満たされない場合、回帰モデルは特定の観測値に偏り、それによって全体的な予測効果に影響を与える可能性があります。不均一分散性がある場合

ここに画像の説明を挿入します
残差は等分散性を検証するための一般的なツールです。残差プロットをプロットすることで、分布が一様であるかどうかを確認できます。残差プロット内の点が 0 線に沿ってランダムに分布している場合、等分散性が成立し、点が 0 の場合はその逆が当てはまります。プロット内 予測値が大きくなるにつれて広がるなど、一定のパターンを示すのが不均一分散性で、上の図の左側が等分散性、右側が不均一分散性に属します。

正規分布誤差

誤差の正規性とは、正規分布に従うべき線形回帰におけるモデルの誤差または残差を指します。

例:

"""
@Module Name: 通过残差图判断正态分布.py
@Author: CSDN@我是小白呀
@Date: October 17, 2023

Description:
通过残差图判断正态分布
"""
from sklearn.linear_model import LinearRegression
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

plt.style.use("fivethirtyeight")  # 设置绘图样式
plt.rcParams['font.sans-serif'] = ['SimHei']  # 设置中文字体 'SimHei'
plt.rcParams['axes.unicode_minus']=False

# 设置随机数种子
np.random.seed(0)

# 模拟线性数据 y = 3x + b
X_linear = np.random.rand(1000, 1) * 10  # 1000个样本, 范围0-10
y_linear = 3 * X_linear + np.random.randn(1000, 1) * 2  # 线性关系 + 噪声 (0-1)

# 模拟非线性数据 y = 3x^2 + b
X_non_linear = np.random.rand(1000, 1) * 10  # 1000个样本, 范围0-10
y_non_linear = 3 * X_non_linear**2 + np.random.randn(1000, 1) * 2  # 二次方关系 + 噪声 (0-1)


# 实例化线性回归模型
model = LinearRegression()

# 训练线性
model.fit(X_linear, y_linear)  # 训练
y_linear_pred = model.predict(X_linear)  # 预测
residuals_linear = y_linear - y_linear_pred  # 计算残差

# 训练非线性
model.fit(X_non_linear, y_non_linear)  # 训练
y_non_linear_pred = model.predict(X_non_linear)  # 预测
residuals_non_linear = y_non_linear - y_non_linear_pred  # 计算残差

# 绘制残差图
f, ax = plt.subplots(1, 2, figsize=(16, 8))
f.suptitle('正态分布')

# 最大残差
print("线性残差范围:", residuals_linear.min(), "-", residuals_linear.max())
print("非线性残差范围:", residuals_non_linear.min(), "-", residuals_non_linear.max())

# 线性残差图
sns.histplot(ax=ax[0], data=residuals_linear.flatten(), bins=20)
ax[0].set_xlabel('残差值')
ax[0].set_ylabel('数量')
ax[0].set_title('线性数据正态分布图')

# 非线性残差图
sns.histplot(ax=ax[1], data=residuals_non_linear.flatten(), bins=20)
ax[1].set_xlabel('残差值')
ax[1].set_ylabel('数量')
ax[1].set_title('非线性数据正态分布图')

plt.show()

出力結果:
画像の説明を追加してください

线性残差范围: -6.064887209285082 - 6.284146438819695
非线性残差范围: -30.07255606488623 - 53.966957811451316

線形関係に一致するデータ残差は正規分布に一致しますが、線形関係に一致するデータ残差は正規分布に一致しないことがわかります。

勾配降下法

勾配降下法は関数を最適化するための反復手法です。機械学習や深層学習では、損失関数を最小化 (最大化) してモデルの最適なパラメーターを見つけるために勾配降下法をよく使用します。

動作原理

勾配降下の中心的な考え方はシンプルです。損失関数の傾き (勾配) を見つけ、傾きの反対方向に沿ってモデルのパラメーターを更新して、損失を徐々に低減します。

ここに画像の説明を挿入します

勾配降下の公式

公式:
w n e x t = w − l r × ∂ l o s s ∂ w w_{next} = w - lr\times \frac{\partial loss}{\partial w} next =lr×loss

  • w n x t w_{次}next : は勾配降下プロセスの次の重みです
  • lr: Learning Rate 学習率
  • ∂ l o s s ∂ w \frac{\partial loss}{\partial w}loss : 誤差関数の導関数

下面我们来推导一下:
我们已知: M S E = 1 n ∑ i = 1 n ( y i − y ˆ i ) 2 y = w 0 + w 1 x 1 MSE = \frac{1}{n}\sum\limits_{i=1}^{n}(y_i - \^y_i)^2\\y = w_0 + w_1x_1 MSE=n1 i=1n (yi そして^ i )2そして=0 +1 バツ1

勾配降下法では、モデル パラメーター (重みとバイアス、w と b または w0) を調整して損失関数を最小化することが目標であるため、モデル パラメーター (w と w0) の偏導関数を取得する必要があります。

w1 (权重) 求导:
∂ M S E ∂ w 1 = 1 n ∑ i = 1 n ( w 0 + w 1 x 1 ) 2 d w = 2 n ∑ i = 1 n x ( w 0 + w 1 x 1 ) \frac{\partial MSE}{\partial w_1} = \frac{1}{n}\sum\limits_{i=1}^{n}(w_0 + w_1x_1 )^2dw \\=\frac{2}{n}\sum\limits_{i=1}^{n}x(w_0 + w_1x_1) 1 MSE =n1 i=1n (w0 +1 バツ1 )2dw=n2 i=1n x(w0 +1 バツ1 )

w0 (偏置) 要求:
∂ M S E ∂ w 0 = 1 n ∑ i = 1 n ( w 0 + w 1 x 1 ) 2 d w = 2 n ∑ i = 1 n ( w 0 + w 1 x 1 ) \frac{\partial MSE}{\partial w_0} = \frac{1}{n}\sum\limits_{i=1}^{n}(w_0 + w_1x_1)^2dw \\=\frac{2}{n}\sum\limits_{i=1}^{n}(w_0 + w_1x_1) 0 MSE =n1 i=1n (w0 +1 バツ1 )2dw=n2 i=1n (w0 +1 バツ1 )

w2、w3などがある場合はここには書きません。

新しい重みを計算し、上記の導関数を勾配降下の式に代入すると、次のようになります。
w 1 n e x t = w 1 − l r × ∂ l o s s ∂ w 1 = w 1 − l r × 2 n ∑ i = 1 n x ( w 0 + w 1 x 1 ) w_{1next} = w_1 - lr\times \frac{\partial loss}{\partial w_1} \\=w_1 - lr\times\frac {2}{n}\sum\limits_{i=1}^{n}x(w_0 + w_1x_1) 1next =1 lr×1 loss =1 lr×n2 i=1n x(w0 +1 バツ1 )

同理:
w 0 n e x t = w 0 − l r × ∂ l o s s ∂ w 0 = w 1 − l r × 2 n ∑ i = 1 n ( w 0 + w 1 x 1 ) w_{0next} = w_0 - lr\times \frac{\partial loss}{\partial w_0} \\=w_1 - lr\times\frac{2}{n}\sum\limits_{i=1} ^{n}(w_0 + w_1x_1) 0next =0 lr×0 loss =1 lr×n2 i=1n (w0 +1 バツ1 )

コード内:

# 计算w的导, w的导 = 2x(wx+b-y)
 w_gradient += (2 / N) * x * ((w_current * x + b_current) - y)

# 计算b的导, b的导 = 2(wx+b-y)
b_gradient += (2 / N) * ((w_current * x + b_current) - y)

勾配降下のバリエーション

  • バッチ勾配降下法 (BGD、バッチ勾配降下法): このトレーニング セットを使用して毎回勾配を計算します。
  • 確率的勾配降下法 (SGD): 勾配の計算に一度に 1 つのサンプルのみを使用します。
  • ミニバッチ勾配降下法: サンプルのミニバッチを使用して勾配を計算します。

学習率

目的関数の終点である谷の最低点を見つけます (目的関数を極点に到達させることができるパラメーター)

山を下りるのに何歩かかりますか。

  1. 現時点で最適な方向性を見つける
  2. 小さな一歩を踏み出す
  3. 方向とペースに応じてパラメータを更新します

学習率 (learning_rate): 結果に大きな影響を与え、小さいほど優れています。

データ バッチ (batch_size): メモリと効率を優先し、バッチ サイズは二の次です。

機械学習の学習率
適切な学習率を選択することは非常に重要です。

  • 学習率が小さすぎる: 収束が遅い
  • 学習率が大きすぎます: 最小値を逃すか、勾配が爆発します。

一般的な操作は次のとおりです。

  • 学習率の減衰またはコサイン アニーリング。つまり、学習率は反復回数とともに徐々に減少します。

線形回帰によるボストンの休日予測の実装

"""
@Module Name: 线性回归预测波士顿房价.py
@Author: CSDN@我是小白呀
@Date: October 17, 2023

Description:
线性回归预测波士顿房价
"""
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score


# 加载数据集
boston_data = load_boston()
X = boston_data.data
y = boston_data.target

# 调试输出数据基本信息
print("输出特征:", X[:5])
print("输出标签:", y[:5])

# 分割数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

# 实例化模型
lin_reg = LinearRegression()

# 训练模型
lin_reg.fit(X_train, y_train)

# 预测
y_pred = lin_reg.predict(X_test)

# 模型评估
MSE = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)

print("Mean Squared Error (MSE):", MSE)
print("R^2 Score:", r2)

出力結果:

输出特征: [[6.3200e-03 1.8000e+01 2.3100e+00 0.0000e+00 5.3800e-01 6.5750e+00
  6.5200e+01 4.0900e+00 1.0000e+00 2.9600e+02 1.5300e+01 3.9690e+02
  4.9800e+00]
 [2.7310e-02 0.0000e+00 7.0700e+00 0.0000e+00 4.6900e-01 6.4210e+00
  7.8900e+01 4.9671e+00 2.0000e+00 2.4200e+02 1.7800e+01 3.9690e+02
  9.1400e+00]
 [2.7290e-02 0.0000e+00 7.0700e+00 0.0000e+00 4.6900e-01 7.1850e+00
  6.1100e+01 4.9671e+00 2.0000e+00 2.4200e+02 1.7800e+01 3.9283e+02
  4.0300e+00]
 [3.2370e-02 0.0000e+00 2.1800e+00 0.0000e+00 4.5800e-01 6.9980e+00
  4.5800e+01 6.0622e+00 3.0000e+00 2.2200e+02 1.8700e+01 3.9463e+02
  2.9400e+00]
 [6.9050e-02 0.0000e+00 2.1800e+00 0.0000e+00 4.5800e-01 7.1470e+00
  5.4200e+01 6.0622e+00 3.0000e+00 2.2200e+02 1.8700e+01 3.9690e+02
  5.3300e+00]]
输出标签: [24.  21.6 34.7 33.4 36.2]
Mean Squared Error (MSE): 33.4489799976764
R^2 Score: 0.5892223849182523

手こする線形回帰

皆さんの理解を深めるために、最後に、パッケージを使用せずに線形回帰を実装する方法を紹介します。

コード:

"""
@Module Name: 手把手实现线性回归.py
@Author: CSDN@我是小白呀
@Date: October 17, 2023

Description:
手把手实现线性回归算法
"""
class LinearRegression:
    def __init__(self, learning_rate=0.000003, num_iterations=100000):
        """
        初始化线性回归模型
        :param learning_rate: 学习率
        :param num_iterations: 迭代次数
        """
        self.learning_rate = learning_rate
        self.num_iterations = num_iterations
        self.weights = None  # 权重w
        self.bias = None  # 偏置b

    def fit(self, X, y):
        """
        训练模型
        :param X: 训练特征
        :param y: 训练标签
        :return:
        """
        num_samples, num_features = X.shape
        self.weights = [0] * num_features
        self.bias = 0

        # 梯度下降
        for _ in range(self.num_iterations):
            model_output = self._predict(X)

            # 计算梯度
            # 计算w的导, w的导 = 2x(wx+b-y)
            d_weights = (-2/num_samples) * X.T.dot(y - model_output)

            # 计算b的导, b的导 = 2(wx+b-y)
            d_bias = (-2/num_samples) * sum(y - model_output)

            # 更新梯度
            self.weights -= self.learning_rate * d_weights
            self.bias -= self.learning_rate * d_bias

    def predict(self, X):
        return self._predict(X)

    def _predict(self, X):
        return X.dot(self.weights) + self.bias


if __name__ == '__main__':
    import pandas as pd
    from sklearn.datasets import load_boston
    from sklearn.model_selection import train_test_split
    from sklearn.metrics import mean_squared_error, r2_score


    # 加载数据集
    boston_data = load_boston()
    X = boston_data.data
    y = boston_data.target

    # 查看nan
    # print(pd.DataFrame(X).isnull().sum())

    # 调试输出数据基本信息
    print("输出特征:", X[:5])
    print("输出标签:", y[:5])

    # 分割数据集
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

    # 实例化模型
    lin_reg = LinearRegression()

    # 训练模型
    lin_reg.fit(X_train, y_train)

    # 预测
    y_pred = lin_reg.predict(X_test)

    # 模型评估
    MSE = mean_squared_error(y_test, y_pred)
    r2 = r2_score(y_test, y_pred)

    print("Mean Squared Error (MSE):", MSE)
    print("R^2 Score:", r2)

出力結果:

输出特征: [[6.3200e-03 1.8000e+01 2.3100e+00 0.0000e+00 5.3800e-01 6.5750e+00
  6.5200e+01 4.0900e+00 1.0000e+00 2.9600e+02 1.5300e+01 3.9690e+02
  4.9800e+00]
 [2.7310e-02 0.0000e+00 7.0700e+00 0.0000e+00 4.6900e-01 6.4210e+00
  7.8900e+01 4.9671e+00 2.0000e+00 2.4200e+02 1.7800e+01 3.9690e+02
  9.1400e+00]
 [2.7290e-02 0.0000e+00 7.0700e+00 0.0000e+00 4.6900e-01 7.1850e+00
  6.1100e+01 4.9671e+00 2.0000e+00 2.4200e+02 1.7800e+01 3.9283e+02
  4.0300e+00]
 [3.2370e-02 0.0000e+00 2.1800e+00 0.0000e+00 4.5800e-01 6.9980e+00
  4.5800e+01 6.0622e+00 3.0000e+00 2.2200e+02 1.8700e+01 3.9463e+02
  2.9400e+00]
 [6.9050e-02 0.0000e+00 2.1800e+00 0.0000e+00 4.5800e-01 7.1470e+00
  5.4200e+01 6.0622e+00 3.0000e+00 2.2200e+02 1.8700e+01 3.9690e+02
  5.3300e+00]]
输出标签: [24.  21.6 34.7 33.4 36.2]
Mean Squared Error (MSE): 43.28945498976922
R^2 Score: 0.46837424997350163

おすすめ

転載: blog.csdn.net/weixin_46274168/article/details/133881708