數(shù)據(jù)預測與回歸 2024-03-24

在數(shù)據(jù)處理中常會需要快速查看各數(shù)據(jù)之間的關系,能否通過歷史預測未來糕再。
這里把這種分析“歷史”到預測“未來”的叫做回歸(regression)送悔,當然有些地方也會叫做擬合。
常見的回歸方式有線性回歸和非線性回歸梨熙。在本文中線性回歸以嶺回歸為代表开镣,非線性委會使用了高斯回歸為代表,順帶還介紹了下基于神經網絡的回歸算法咽扇。

數(shù)據(jù)準備

為簡單起見邪财,這里給出了帶高斯噪聲的一維正弦函數(shù)為基礎數(shù)據(jù)進行分析,具體構造代碼如下:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler  
from sklearn.neural_network import MLPRegressor

# 定義數(shù)據(jù)
x_data = np.linspace(0, 10, 100)
y_data = np.sin(x_data) + np.random.normal(0, 0.1, 100)

如果使用所有的數(shù)據(jù)來訓練會有過擬合問題(overfit)质欲,這里切分出80%的數(shù)據(jù)作為訓練集树埠,20%的數(shù)據(jù)作為測試集;

rng = np.random.RandomState(0)
training_sample_indices = rng.choice(np.arange(0, 100), size=80, replace=False)
training_data = x_data[training_sample_indices]
training_noisy_target = y_data[training_sample_indices] + 0.2 * rng.randn(
    len(training_sample_indices)
)

繪制原始數(shù)據(jù)如下:

import numpy as np

plt.figure("Gaussian Regression")
plt.plot(x_data, y_data, 'bo', label='gt signal')
#plt.plot(x_data, y_data, label="gt signal", linewidth=2)
plt.scatter(
    training_data,
    training_noisy_target,
    color="black",
    label="Noisy measurements",
)
plt.legend()
plt.xlabel("data")
plt.ylabel("target")
_ = plt.title(
    "Gaussian Regression process"
)

plt.show()

線性回歸

ridge 回歸

#%% lieanr model
from sklearn.linear_model import Ridge

rng = np.random.RandomState(0)
training_sample_indices = rng.choice(np.arange(0, 100), size=60, replace=False)
training_data = x_data[training_sample_indices]
training_noisy_target = y_data[training_sample_indices] + 0.2 * rng.randn(
    len(training_sample_indices)
)

ridge = Ridge().fit(training_data, training_noisy_target)

plt.figure("Ridge Regression")
plt.plot(x_data, y_data, 'bo', label='gt signal')

plt.scatter(
    training_data,
    training_noisy_target,
    color="black",
    label="Noisy measurements",
)
plt.plot(x_data, ridge.predict(x_data), label="Ridge regression")
plt.legend()
plt.xlabel("data")
plt.ylabel("target")
_ = plt.title("Limitation of a linear model such as ridge")
plt.show()

對于添加kernal后線性回歸的能力會產生質的飛躍:

#%%  ridge kernal
from sklearn.gaussian_process.kernels import ExpSineSquared
from sklearn.kernel_ridge import KernelRidge

rng = np.random.RandomState(0)
training_sample_indices = rng.choice(np.arange(0, 100), size=60, replace=False)
training_data = x_data[training_sample_indices]
training_noisy_target = y_data[training_sample_indices] + 0.2 * rng.randn(
    len(training_sample_indices)
)

kernel_ridge = KernelRidge(kernel=ExpSineSquared())
kernel_ridge.fit(training_data, training_noisy_target)

plt.figure("Kernal Ridge Regression")
plt.plot(x_data, y_data, 'bo', label='gt signal')
plt.scatter(
    training_data,
    training_noisy_target,
    color="black",
    label="Noisy measurements",
)
plt.plot(
    x_data,
    kernel_ridge.predict(x_data),
    label="Kernel ridge",
    linewidth=2,
    linestyle="dashdot",
)

from scipy.stats import loguniform
from sklearn.model_selection import RandomizedSearchCV
#random kernal
param_distributions = {
    "alpha": loguniform(1e0, 1e3),
    "kernel__length_scale": loguniform(1e-2, 1e2),
    "kernel__periodicity": loguniform(1e0, 1e1),
}
kernel_ridge_tuned = RandomizedSearchCV(
    kernel_ridge,
    param_distributions=param_distributions,
    n_iter=500,
    random_state=0,
)

kernel_ridge_tuned.fit(training_data, training_noisy_target)

predictions_kr = kernel_ridge_tuned.predict(x_data)

plt.plot(
    x_data,
    predictions_kr,
    label="Kernel ridge tuned hyperparameters",
    linewidth=2,
    linestyle="dashdot",
)
plt.legend(loc="lower right")
plt.xlabel("data")
plt.ylabel("target")
_ = plt.title(
    "Kernel ridge regression with an exponential sine squared"
)

非線性回歸

高斯回歸

高斯回歸也是使用了離散采樣的和核心點作為種子回歸高斯模型嘶伟。

#%%
from sklearn.gaussian_process import GaussianProcessRegressor
from sklearn.gaussian_process.kernels import WhiteKernel

kernel = 1.0 * ExpSineSquared(1.0, 5.0, periodicity_bounds=(1e-2, 1e1)) + WhiteKernel(
    1e-1
)
gaussian_process = GaussianProcessRegressor(kernel=kernel)
gaussian_process.fit(training_data, training_noisy_target)

mean_predictions_gpr, std_predictions_gpr = gaussian_process.predict(
    x_data,
    return_std=True,
)

plt.figure("Kernal Gaussian Regression")
plt.plot(x_data, y_data, label="True signal", linewidth=2, linestyle="dashed")
plt.scatter(
    training_data,
    training_noisy_target,
    color="black",
    label="Noisy measurements",
)

# Plot the predictions of the gaussian process regressor
plt.plot(
    x_data,
    mean_predictions_gpr,
    label="Gaussian process regressor",
    linewidth=2,
    linestyle="dotted",
)
plt.fill_between(
    x_data.ravel(),
    mean_predictions_gpr - std_predictions_gpr,
    mean_predictions_gpr + std_predictions_gpr,
    color="tab:green",
    alpha=0.2,
)
plt.legend(loc="lower right")
plt.xlabel("data")
plt.ylabel("target")
_ = plt.title("gaussian process regressor")

神經網絡

這里使用了sklearn內的多層感知機模型(MLP),給出計算結果

#%% MLP
from sklearn.preprocessing import StandardScaler  
from sklearn.neural_network import MLPRegressor

scaler = StandardScaler() 
scaler.fit(training_data)  
x_data_mlp = scaler.transform(training_data)
# 定義模型
mlp = MLPRegressor(hidden_layer_sizes=(100,),  # 一個隱藏層怎憋,包含100個神經元
                   max_iter=1000,  # 最大迭代次數(shù)
                   activation='relu',  # 激活函數(shù)使用ReLU
                   solver='adam',  # 優(yōu)化算法使用Adam
                   alpha=0.00001,  # L2正則化參數(shù)
                   random_state=42)

# trian
mlp.fit(x_data_mlp, training_noisy_target)
# predict
y_pred = mlp.predict(scaler.transform(x_data))

# plot resut
plt.figure("MLP regression")
plt.plot(x_data, y_data, 'bo', label='gt signal')
plt.plot(x_data, y_pred, 'r-', label='pred result')
plt.scatter(
    training_data,
    training_noisy_target,
    color="black",
    label="Noisy measurements",
)
plt.legend()
plt.xlabel("data")
plt.ylabel("target")
_ = plt.title(
    "MLP trainning result")

計算結果如下:

參考文件

ref: https://scikit-learn.org/stable/auto_examples/gaussian_process/plot_compare_gpr_krr.html#sphx-glr-auto-examples-gaussian-process-plot-compare-gpr-krr-py

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市九昧,隨后出現(xiàn)的幾起案子绊袋,更是在濱河造成了極大的恐慌,老刑警劉巖铸鹰,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件癌别,死亡現(xiàn)場離奇詭異,居然都是意外死亡掉奄,警方通過查閱死者的電腦和手機规个,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來姓建,“玉大人诞仓,你說我怎么就攤上這事∷偻茫” “怎么了墅拭?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長涣狗。 經常有香客問我谍婉,道長舒憾,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任穗熬,我火速辦了婚禮镀迂,結果婚禮上,老公的妹妹穿的比我還像新娘唤蔗。我一直安慰自己探遵,他們只是感情好,可當我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布妓柜。 她就那樣靜靜地躺著箱季,像睡著了一般。 火紅的嫁衣襯著肌膚如雪棍掐。 梳的紋絲不亂的頭發(fā)上藏雏,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天,我揣著相機與錄音作煌,去河邊找鬼掘殴。 笑死,一個胖子當著我的面吹牛最疆,可吹牛的內容都是我干的杯巨。 我是一名探鬼主播,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼努酸,長吁一口氣:“原來是場噩夢啊……” “哼服爷!你這毒婦竟也來了?” 一聲冷哼從身側響起获诈,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤仍源,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后舔涎,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體笼踩,經...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年亡嫌,在試婚紗的時候發(fā)現(xiàn)自己被綠了嚎于。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡挟冠,死狀恐怖于购,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情知染,我是刑警寧澤肋僧,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響嫌吠,放射性物質發(fā)生泄漏止潘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一辫诅、第九天 我趴在偏房一處隱蔽的房頂上張望凭戴。 院中可真熱鬧,春花似錦泥栖、人聲如沸簇宽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至譬嚣,卻和暖如春钢颂,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背拜银。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工殊鞭, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人尼桶。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓操灿,卻偏偏與公主長得像,于是被迫代替她去往敵國和親泵督。 傳聞我的和親對象是個殘疾皇子趾盐,可洞房花燭夜當晚...
    茶點故事閱讀 44,871評論 2 354

推薦閱讀更多精彩內容