對于多元多項式回歸:

關鍵有3點

  1. 防止過擬合: 高次項的引入可能導致過擬合,因此需要謹慎選擇多項式的次數。
  2. 選擇最佳次數: 可以使用交叉驗證或學習曲線來選擇最合適的多項式次數。
  3. 特征縮放:?在使用多項式回歸前,通常需要進行特征縮放,確保不同特征的尺度一致。

2. 變換方法(對數變換等)

變換方法通過對原始數據進行某種數學變換,使數據更符合線性關系。對數變換是其中一種常見的方法,尤其適用于數據呈指數增長的情況。

對數變換:

關鍵有2點:

  1. 對數變換的條件: 適用于正數數據,特別是在數據存在指數增長趨勢時。
  2. 恢復變換后的預測值: 對數變換后的預測值需要通過指數函數進行逆變換,以獲得原始的預測值。 

注意點和一些建議:

  1. 探索性數據分析(EDA): 在應用多項式回歸或變換方法前,進行探索性數據分析以了解數據的分布和特性。
  2. 嘗試不同方法: 在處理非線性關系時,嘗試多項式回歸和變換方法,并根據模型性能選擇最適合的方法。
  3. 注意異常值: 非線性關系的發現可能受到異常值的影響,因此在進行建模前要處理異常值。
  4. 模型評估: 使用適當的評估指標(如均方誤差、R平方等)來評估模型性能,確保選擇的方法在測試數據上也表現良好。

總體而言,當數據關系非線性時,多項式回歸和變換方法是常見的處理手段,但在使用它們時需要謹慎選擇并進行適當的模型評估。

如果有問題,評論區可以繼續探討~

# 區分L1和L2正則化

下面聊一聊,大家一起深入了解它們的區別和對回歸模型的影響。

1. 區別

a. 正則化項的形式:

L2正則化(嶺回歸):?使用的是模型參數的平方和的平方根(L2范數)作為正則化項。

b. 特征選擇:

c. 解的穩定性:

2. 影響回歸模型的方式

a. 參數收縮:

b. 模型復雜度:

3. 注意點和一些建議

  1. 超參數調整: 選擇合適的正則化強度參數((\lambda))很重要,通常通過交叉驗證來確定。
  2. 問題特征:?根據問題特征的性質選擇正則化方法。如果認為只有少數特征對問題有貢獻,可以考慮使用L1正則化(LASSO)。
  3. 綜合考慮: 有時候,也可以同時使用L1和L2正則化,稱為彈性網絡(Elastic Net),以綜合利用它們的優勢。

總的來說,L1和L2正則化是在回歸模型中用于控制模型復雜度的有效手段,選擇取決于具體問題和數據的性質。

# 學習曲線和驗證曲線的解讀

下面我會分別介紹學習曲線驗證曲線,并說明它們能告訴我們的信息以及如何根據它們來調整模型參數。

學習曲線

學習曲線(Learning Curve)是一種用于分析模型性能的圖表,它展示了訓練數據大小與模型性能之間的關系。通常,學習曲線會隨著訓練數據量的增加而變化。學習曲線的兩個關鍵指標是訓練集上的性能和驗證集上的性能。

學習曲線能告訴我們的信息:

如何根據學習曲線調整模型參數:

驗證曲線

驗證曲線(Validation Curve)是一種圖表,用于分析模型性能與某一參數(例如正則化參數、模型復雜度等)之間的關系。通過在不同參數取值下評估模型的性能,我們可以找到最優的參數取值。

驗證曲線能告訴我們的信息:

如何根據驗證曲線調整模型參數:

這里,用代碼演示了使用學習曲線和驗證曲線來評估回歸模型,并調整模型參數,可以作為參考~

from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt
import numpy as np
from sklearn.model_selection import learning_curve, validation_curve

# 生成隨機回歸數據
X, y = make_regression(n_samples=1000, n_features=20, noise=0.2, random_state=42)

# 劃分訓練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 定義線性回歸模型
estimator = LinearRegression()

def plot_learning_curve(estimator, title, X, y, ylim=None, cv=None, n_jobs=None, train_sizes=np.linspace(.1, 1.0, 5)):
plt.figure()
plt.title(title)
if ylim is not None:
plt.ylim(*ylim)
plt.xlabel("Training examples")
plt.ylabel("Score")
train_sizes, train_scores, test_scores = learning_curve(estimator, X, y, cv=cv, n_jobs=n_jobs, train_sizes=train_sizes)
train_scores_mean = np.mean(train_scores, axis=1)
train_scores_std = np.std(train_scores, axis=1)
test_scores_mean = np.mean(test_scores, axis=1)
test_scores_std = np.std(test_scores, axis=1)
plt.grid()

plt.fill_between(train_sizes, train_scores_mean - train_scores_std,
train_scores_mean + train_scores_std, alpha=0.1,
color="r")
plt.fill_between(train_sizes, test_scores_mean - test_scores_std,
test_scores_mean + test_scores_std, alpha=0.1, color="g")
plt.plot(train_sizes, train_scores_mean, 'o-', color="r",
label="Training score")
plt.plot(train_sizes, test_scores_mean, 'o-', color="g",
label="Cross-validation score")

plt.legend(loc="best")
return plt

def plot_validation_curve(estimator, title, X, y, param_name, param_range, cv=None, scoring=None):
train_scores, test_scores = validation_curve(
estimator, X, y, param_name=param_name, param_range=param_range,
cv=cv, scoring=scoring)
train_scores_mean = np.mean(train_scores, axis=1)
train_scores_std = np.std(train_scores, axis=1)
test_scores_mean = np.mean(test_scores, axis=1)
test_scores_std = np.std(test_scores, axis=1)

plt.title(title)
plt.xlabel(param_name)
plt.ylabel("Score")
plt.ylim(0.0, 1.1)
lw = 2
plt.plot(param_range, train_scores_mean, label="Training score",
color="darkorange", lw=lw)
plt.fill_between(param_range, train_scores_mean - train_scores_std,
train_scores_mean + train_scores_std, alpha=0.2,
color="darkorange", lw=lw)
plt.plot(param_range, test_scores_mean, label="Cross-validation score",
color="navy", lw=lw)
plt.fill_between(param_range, test_scores_mean - test_scores_std,
test_scores_mean + test_scores_std, alpha=0.2,
color="navy", lw=lw)
plt.legend(loc="best")
return plt

# 使用示例
plot_learning_curve(estimator, "Learning Curve", X_train, y_train, cv=5)
plt.show()

在這段代碼中,我們首先定義了一個線性回歸模型?LinearRegression(),然后將其傳遞給了?plot_learning_curve?函數。這樣就可以成功繪制學習曲線了。

# 非線性回歸模型的例子

下面我介紹幾種常見的非線性回歸模型,并與線性回歸進行對比。這樣可以更容易理解。

1. 多項式回歸

多項式回歸是一種將自變量的高次項加入模型的方法,例如:

這與線性回歸的不同之處在于,自變量??的冪次不僅限于一次。通過增加高次項,模型能夠更好地擬合非線性關系。

2. 指數回歸

指數回歸是一種通過指數函數來建模的方法,例如:

這種模型表達了因變量隨自變量呈指數增長或指數衰減的趨勢。

3. 對數回歸

對數回歸是一種通過對自變量或因變量取對數來建模的方法,例如:

或者

這種方法適用于當數據呈現出指數增長或衰減的趨勢時。

4. 廣義可加模型(Generalized Additive Models, GAM)

GAM 是一種更一般化的非線性回歸模型,它使用非線性函數來擬合每個自變量,例如:

這里的  是非線性函數,可以是平滑的樣條函數或其他靈活的函數形式。

這些非線性回歸模型與線性回歸的主要不同之處在于它們允許了更加靈活的自變量和因變量之間的關系。線性回歸假設了自變量和因變量之間的關系是線性的,而非線性回歸模型通過引入非線性函數來更好地擬合真實世界中更為復雜的數據關系。這使得非線性模型能夠更準確地描述數據,但也可能導致更復雜的模型結構和更難以解釋的結果。

下面是一個使用多項式回歸的代碼~

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures

# 生成帶噪聲的非線性數據
np.random.seed(0)
X = np.linspace(-3, 3, 100)
y = 2 * X**3 - 3 * X**2 + 4 * X - 5 + np.random.normal(0, 10, 100)

# 將 X 轉換成矩陣形式
X = X[:, np.newaxis]

# 使用多項式特征進行變換
poly = PolynomialFeatures(degree=3)
X_poly = poly.fit_transform(X)

# 構建并擬合多項式回歸模型
model = LinearRegression()
model.fit(X_poly, y)

# 繪制原始數據和擬合曲線
plt.scatter(X, y, color='blue')
plt.plot(X, model.predict(X_poly), color='red')
plt.title('Polynomial Regression')
plt.xlabel('X')
plt.ylabel('y')
plt.show()

這段代碼使用了?PolynomialFeatures?來對自變量進行多項式特征變換,然后使用?LinearRegression?擬合多項式回歸模型,并繪制了原始數據和擬合曲線的圖像。

如果有問題,隨時再反饋~

# 自相關性

今天先聊聊自相關性。時間序列數據中的自相關指的是數據中同一變量在不同時間點之間的相關性。換句話說,它衡量了時間序列中一個時間點的觀測值與另一個時間點的觀測值之間的相關程度。自相關通常在時間序列數據分析中被用來檢測數據中的周期性或趨勢性。

如果數據存在自相關,會對回歸模型造成一些影響。具體來說,自相關可能導致模型中的殘差(預測值與實際值之間的差異)不再獨立,從而違反了線性回歸模型的基本假設之一,即殘差之間相互獨立。這會導致模型的系數估計不準確,使得模型預測能力下降,同時可能增加對時間序列中隨機波動的敏感性。

在檢測和處理自相關性方面,通常有 4 種方法:

1. 自相關函數(ACF)和偏自相關函數(PACF):通過繪制數據的自相關函數圖和偏自相關函數圖,可以直觀地查看時間序列數據中自相關的模式。ACF和PACF可以幫助確定時間序列中的階數,從而選擇合適的自回歸(AR)和移動平均(MA)模型。

2. 差分法(Differencing):通過對時間序列數據進行一階或多階差分,可以消除或減弱數據中的自相關性。差分法的基本思想是通過計算相鄰時間點之間的差異來去除趨勢和季節性,從而使得數據更加平穩。

3. 自回歸移動平均模型(ARMA):ARMA模型是一種結合了自回歸和移動平均的模型,可以用來建模時間序列數據中的自相關性。通過擬合ARMA模型,可以估計出數據中的自相關結構,并進一步進行預測。

4. 自回歸積分移動平均模型(ARIMA):ARIMA模型在ARMA的基礎上引入了差分法,可以處理非平穩的時間序列數據。ARIMA模型可以有效地消除數據中的自相關性,并提高模型的準確性。

下面,咱們實現一個利用差分法來處理自相關性的代碼~

import torch
import numpy as np
import matplotlib.pyplot as plt

# 生成示例時間序列數據
np.random.seed(0)
n = 100
t = np.arange(n)
y = 0.5 * t + 0.3 * np.sin(0.1 * t) + np.random.normal(0, 1, n)

# 繪制原始時間序列圖
plt.figure(figsize=(10, 4))
plt.plot(t, y, label='Original Time Series')
plt.xlabel('Time')
plt.ylabel('Value')
plt.title('Original Time Series Data')
plt.legend()
plt.grid(True)
plt.show()

# 計算一階差分
diff_y = np.diff(y)

# 繪制一階差分后的時間序列圖
plt.figure(figsize=(10, 4))
plt.plot(t[1:], diff_y, label='First Difference')
plt.xlabel('Time')
plt.ylabel('Value')
plt.title('First Difference Time Series Data')
plt.legend()
plt.grid(True)
plt.show()

在上面的示例中,我們首先生成了一個示例的時間序列數據。

然后計算了這個時間序列數據的一階差分,并繪制了原始時間序列數據和一階差分后的時間序列數據。通過一階差分,我們可以看到原始數據中的趨勢和季節性被去除,從而減弱了數據中的自相關性。

本文章轉載微信公眾號@深夜努力寫Python

上一篇:

超全總結!Pythorch 構建Attention-lstm相關模型?。?/h5>

下一篇:

機器學習各個算法優缺點??!
#你可能也喜歡這些API文章!

我們有何不同?

API服務商零注冊

多API并行試用

數據驅動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內容創意新穎性、情感共鳴力、商業轉化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費