
如何高效爬取全球新闻网站 – 整合Scrapy、Selenium与Mediastack API实现自动化新闻采集
多项式回归通过引入原始特征的高次幂,将线性模型扩展到非线性关系。
例如,对于一个特征 ,多项式回归可以考虑添加 、 等项。
对于一元多项式回归(二次多项式):
对于多元多项式回归:
关键有3点
2. 变换方法(对数变换等)
变换方法通过对原始数据进行某种数学变换,使数据更符合线性关系。对数变换是其中一种常见的方法,尤其适用于数据呈指数增长的情况。
对数变换:
关键有2点:
注意点和一些建议:
总体而言,当数据关系非线性时,多项式回归和变换方法是常见的处理手段,但在使用它们时需要谨慎选择并进行适当的模型评估。
如果有问题,评论区可以继续探讨~
下面聊一聊,大家一起深入了解它们的区别和对回归模型的影响。
1. 区别
a. 正则化项的形式:
L2正则化(岭回归): 使用的是模型参数的平方和的平方根(L2范数)作为正则化项。
b. 特征选择:
c. 解的稳定性:
2. 影响回归模型的方式
a. 参数收缩:
b. 模型复杂度:
3. 注意点和一些建议
总的来说,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