回归是一项建模任务,涉及根据输入预测数值。
用于回归任务的算法也称为“回归”算法,其中最广为人知且也许最成功的是线性回归。
线性回归拟合一条直线或超平面,以最佳地描述输入和目标数值之间的线性关系。如果数据包含异常值,则直线可能会产生偏差,从而导致预测性能下降。鲁棒回归是指在一组算法,它们在训练数据中存在异常值的情况下具有鲁棒性。
在本教程中,您将了解机器学习的鲁棒回归算法。
完成本教程后,您将了解:
- 鲁棒回归算法可用于输入或目标值包含异常值的数据。
- 如何评估回归预测建模任务的鲁棒回归算法。
- 如何通过在数据集上拟合最佳拟合线来比较鲁棒回归算法。
让我们开始吧。

Python 中用于机器学习的稳健回归
照片作者:Lenny K Photography,部分权利保留。
教程概述
本教程分为四个部分;它们是
- 带异常值的回归
- 带异常值的回归数据集
- 鲁棒回归算法
- 比较鲁棒回归算法
带异常值的回归
回归预测建模涉及根据某些输入(通常是数值输入)预测数值变量。
用于回归预测建模任务的机器学习算法也称为“回归”或“回归算法”。最常见的方法是线性回归。
许多回归算法是线性的,因为它们假定输入变量或变量与目标变量之间的关系是线性的,例如二维空间中的直线、三维空间中的平面以及高维空间中的超平面。对于许多预测任务来说,这是一个合理的假设。
线性回归假定每个变量的概率分布都表现良好,例如服从高斯分布。数据集中特征的概率分布表现越差,线性回归找到良好拟合的可能性就越小。
使用线性回归时,概率分布的一个特定问题是异常值。这些是超出预期分布的观测值。例如,如果一个变量具有高斯分布,那么与均值相差 3 或 4(或更多)个标准差的观测值就被认为是异常值。
数据集可能在输入变量或目标变量上存在异常值,这两种情况都会给线性回归算法带来问题。
数据集中的异常值会扭曲为变量计算的摘要统计量,例如均值和标准差,这反过来又可能使模型偏向异常值,偏离观测值的中心质量。这会导致模型试图在异常值和正常数据之间取得平衡,但总体上在两者上的表现都会更差。
替代的解决方案是使用线性回归的修改版本,这些版本专门处理数据集中异常值的预期。这些方法被称为鲁棒回归算法。
带异常值的回归数据集
我们可以使用 make_regression() 函数定义一个合成回归数据集。
在这种情况下,我们希望有一个易于绘制和理解的数据集。这可以通过使用单个输入变量和单个输出变量来实现。我们不希望任务过于简单,因此我们将添加大量的统计噪声。
1 2 |
... X, y = make_regression(n_samples=100, n_features=1, tail_strength=0.9, effective_rank=1, n_informative=1, noise=3, bias=50, random_state=1) |
获得数据集后,我们可以通过添加异常值来增强它。具体来说,我们将向输入变量添加异常值。
这可以通过将一些输入变量的值更改为距离均值标准差的倍数(例如 2 到 4)来实现。我们将向数据集中添加 10 个异常值。
1 2 3 4 5 6 7 8 |
# 添加一些人工异常值 seed(1) for i in range(10): factor = randint(2, 4) if random() > 0.5: X[i] += factor * X.std() else: X[i] -= factor * X.std() |
我们可以将这些内容整合到一个函数中来准备数据集。然后可以调用此函数,并绘制数据集,将输入值作为 x 轴,将目标或结果作为 y 轴。
下面列出了准备和绘制数据集的完整示例。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
# 创建一个带异常值的回归数据集 from random import random from random import randint from random import seed from sklearn.datasets import make_regression from matplotlib import pyplot # 准备数据 定义 获取_数据集(): X, y = make_regression(n_samples=100, n_features=1, tail_strength=0.9, effective_rank=1, n_informative=1, noise=3, bias=50, random_state=1) # 添加一些人工异常值 seed(1) for i in range(10): factor = randint(2, 4) if random() > 0.5: X[i] += factor * X.std() else: X[i] -= factor * X.std() 返回 X, y # 加载数据集 X, y = get_dataset() # 总结形状 print(X.shape, y.shape) # 输入与输出的散点图 pyplot.scatter(X, y) pyplot.show() |
运行示例会创建合成回归数据集并添加异常值。
然后绘制数据集,我们可以清楚地看到数据中的线性关系、统计噪声以及远离数据主体的大量异常点。

带异常值的回归数据集的散点图
现在我们有了数据集,让我们在上面拟合不同的回归模型。
鲁棒回归算法
在本节中,我们将考虑数据集的不同鲁棒回归算法。
线性回归(非鲁棒)
在深入研究鲁棒回归算法之前,让我们先从线性回归开始。
我们可以使用重复 k 折交叉验证在带异常值的回归数据集上评估线性回归。我们将测量平均绝对误差,这将为我们期望某些鲁棒回归算法能够超越的模型性能提供一个下限。
1 2 3 4 5 6 7 8 |
# 评估模型 def evaluate_model(X, y, model): # 定义模型评估方法 cv = RepeatedKFold(n_splits=10, n_repeats=3, random_state=1) # 评估模型 scores = cross_val_score(model, X, y, scoring='neg_mean_absolute_error', cv=cv, n_jobs=-1) # 将分数强制为正数 return absolute(scores) |
我们还可以绘制模型的最佳拟合线。为此,我们首先在整个训练数据集上拟合模型,然后创建一个跨越整个输入域的网格输入数据集,为每个数据点进行预测,然后绘制输入和预测输出的线。
此图显示了模型如何“看待”问题,特别是输入变量和输出变量之间的关系。其思想是,在使用线性回归时,这条线会被异常值扭曲。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# 绘制数据集和模型的最佳拟合线 def plot_best_fit(X, y, model): # 在所有数据上拟合模型 model.fit(X, y) # 绘制数据集 pyplot.scatter(X, y) # 绘制最佳拟合线 xaxis = arange(X.min(), X.max(), 0.01) yaxis = model.predict(xaxis.reshape((len(xaxis), 1))) pyplot.plot(xaxis, yaxis, color='r') # 显示图表 pyplot.title(type(model).__name__) pyplot.show() |
将这些内容结合起来,下面列出了线性回归的完整示例。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
# 带异常值的回归线性回归 from random import random from random import randint from random import seed from numpy import arange from numpy import mean from numpy import std from numpy import absolute from sklearn.datasets import make_regression 来自 sklearn.linear_model 导入 LinearRegression from sklearn.model_selection import cross_val_score from sklearn.model_selection import RepeatedKFold from matplotlib import pyplot # 准备数据 定义 获取_数据集(): X, y = make_regression(n_samples=100, n_features=1, tail_strength=0.9, effective_rank=1, n_informative=1, noise=3, bias=50, random_state=1) # 添加一些人工异常值 seed(1) for i in range(10): factor = randint(2, 4) if random() > 0.5: X[i] += factor * X.std() else: X[i] -= factor * X.std() 返回 X, y # 评估模型 def evaluate_model(X, y, model): # 定义模型评估方法 cv = RepeatedKFold(n_splits=10, n_repeats=3, random_state=1) # 评估模型 scores = cross_val_score(model, X, y, scoring='neg_mean_absolute_error', cv=cv, n_jobs=-1) # 将分数强制为正数 return absolute(scores) # 绘制数据集和模型的最佳拟合线 def plot_best_fit(X, y, model): # 在所有数据上拟合模型 model.fit(X, y) # 绘制数据集 pyplot.scatter(X, y) # 绘制最佳拟合线 xaxis = arange(X.min(), X.max(), 0.01) yaxis = model.predict(xaxis.reshape((len(xaxis), 1))) pyplot.plot(xaxis, yaxis, color='r') # 显示图表 pyplot.title(type(model).__name__) pyplot.show() # 加载数据集 X, y = get_dataset() # 定义模型 模型 = LinearRegression() # 评估模型 results = evaluate_model(X, y, model) print('平均 MAE: %.3f (%.3f)' % (mean(results), std(results))) # 绘制最佳拟合线 plot_best_fit(X, y, model) |
运行示例首先报告模型在该数据集上的平均 MAE。
我们可以看到线性回归在该数据集上实现了约 5.2 的 MAE,这提供了误差的上限。
1 |
平均 MAE: 5.260 (1.149) |
接下来,数据集以散点图的形式绘制,显示异常值,并叠加了线性回归算法的最佳拟合线。
在这种情况下,我们可以看到最佳拟合线与数据不符,并且已被异常值扭曲。反过来,我们预计这会导致模型在该数据集上的性能比预期差。

带异常值的回归数据集的线性回归最佳拟合线
Huber 回归
Huber 回归是一种鲁棒回归,它能意识到数据集中可能存在异常值,并为它们分配比数据集中其他样本更小的权重。
我们可以通过 scikit-learn 中的 HuberRegressor 类来使用 Huber 回归。“epsilon”参数控制什么被视为异常值,其中较小的值考虑更多的异常值,从而使模型对异常值更加鲁棒。默认值为 1.35。
下面的示例在带异常值的回归数据集上评估 Huber 回归,首先使用重复交叉验证评估模型,然后绘制最佳拟合线。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
# 带异常值的回归 Huber 回归 from random import random from random import randint from random import seed from numpy import arange from numpy import mean from numpy import std from numpy import absolute from sklearn.datasets import make_regression from sklearn.linear_model import HuberRegressor from sklearn.model_selection import cross_val_score from sklearn.model_selection import RepeatedKFold from matplotlib import pyplot # 准备数据 定义 获取_数据集(): X, y = make_regression(n_samples=100, n_features=1, tail_strength=0.9, effective_rank=1, n_informative=1, noise=3, bias=50, random_state=1) # 添加一些人工异常值 seed(1) for i in range(10): factor = randint(2, 4) if random() > 0.5: X[i] += factor * X.std() else: X[i] -= factor * X.std() 返回 X, y # 评估模型 def evaluate_model(X, y, model): # 定义模型评估方法 cv = RepeatedKFold(n_splits=10, n_repeats=3, random_state=1) # 评估模型 scores = cross_val_score(model, X, y, scoring='neg_mean_absolute_error', cv=cv, n_jobs=-1) # 将分数强制为正数 return absolute(scores) # 绘制数据集和模型的最佳拟合线 def plot_best_fit(X, y, model): # 在所有数据上拟合模型 model.fit(X, y) # 绘制数据集 pyplot.scatter(X, y) # 绘制最佳拟合线 xaxis = arange(X.min(), X.max(), 0.01) yaxis = model.predict(xaxis.reshape((len(xaxis), 1))) pyplot.plot(xaxis, yaxis, color='r') # 显示图表 pyplot.title(type(model).__name__) pyplot.show() # 加载数据集 X, y = get_dataset() # 定义模型 model = HuberRegressor() # 评估模型 results = evaluate_model(X, y, model) print('平均 MAE: %.3f (%.3f)' % (mean(results), std(results))) # 绘制最佳拟合线 plot_best_fit(X, y, model) |
运行示例首先报告模型在该数据集上的平均 MAE。
我们可以看到 Huber 回归在该数据集上实现了约 4.435 的 MAE,性能优于上一节的线性回归模型。
1 |
平均 MAE: 4.435 (1.868) |
接下来,数据集以散点图的形式绘制,显示异常值,并叠加了算法的最佳拟合线。
在这种情况下,我们可以看到最佳拟合线与数据的主体更好地对齐,并且似乎没有明显受到存在的异常值的影响。

带异常值的回归数据集的 Huber 回归最佳拟合线
RANSAC 回归
随机样本一致性,简称 RANSAC,是另一种鲁棒回归算法。
RANSAC 尝试将数据分为异常值和内点,并在内点上拟合模型。
scikit-learn 库通过 RANSACRegressor 类提供了实现。
下面的示例在带异常值的回归数据集上评估 RANSAC 回归,首先使用重复交叉验证评估模型,然后绘制最佳拟合线。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
# 带异常值的回归 RANSAC 回归 from random import random from random import randint from random import seed from numpy import arange from numpy import mean from numpy import std from numpy import absolute from sklearn.datasets import make_regression from sklearn.linear_model import RANSACRegressor from sklearn.model_selection import cross_val_score from sklearn.model_selection import RepeatedKFold from matplotlib import pyplot # 准备数据 定义 获取_数据集(): X, y = make_regression(n_samples=100, n_features=1, tail_strength=0.9, effective_rank=1, n_informative=1, noise=3, bias=50, random_state=1) # 添加一些人工异常值 seed(1) for i in range(10): factor = randint(2, 4) if random() > 0.5: X[i] += factor * X.std() else: X[i] -= factor * X.std() 返回 X, y # 评估模型 def evaluate_model(X, y, model): # 定义模型评估方法 cv = RepeatedKFold(n_splits=10, n_repeats=3, random_state=1) # 评估模型 scores = cross_val_score(model, X, y, scoring='neg_mean_absolute_error', cv=cv, n_jobs=-1) # 将分数强制为正数 return absolute(scores) # 绘制数据集和模型的最佳拟合线 def plot_best_fit(X, y, model): # 在所有数据上拟合模型 model.fit(X, y) # 绘制数据集 pyplot.scatter(X, y) # 绘制最佳拟合线 xaxis = arange(X.min(), X.max(), 0.01) yaxis = model.predict(xaxis.reshape((len(xaxis), 1))) pyplot.plot(xaxis, yaxis, color='r') # 显示图表 pyplot.title(type(model).__name__) pyplot.show() # 加载数据集 X, y = get_dataset() # 定义模型 model = RANSACRegressor() # 评估模型 results = evaluate_model(X, y, model) print('平均 MAE: %.3f (%.3f)' % (mean(results), std(results))) # 绘制最佳拟合线 plot_best_fit(X, y, model) |
运行示例首先报告模型在该数据集上的平均 MAE。
我们可以看到 RANSAC 回归在该数据集上实现了约 4.454 的 MAE,性能优于线性回归模型,但可能不如 Huber 回归。
1 |
平均 MAE: 4.454 (2.165) |
接下来,数据集以散点图的形式绘制,显示异常值,并叠加了算法的最佳拟合线。
在这种情况下,我们可以看到最佳拟合线与数据主体对齐,甚至可能比 Huber 回归的图更好。

带异常值的回归的 RANSAC 回归最佳拟合线
Theil Sen 回归
Theil Sen 回归涉及在训练数据的子集上拟合多个回归模型,并在最后组合系数。
scikit-learn 通过 TheilSenRegressor 类提供实现。
下面的示例在带异常值的回归数据集上评估 Theil Sen 回归,首先使用重复交叉验证评估模型,然后绘制最佳拟合线。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
# 带异常值的回归 TheilSen 回归 from random import random from random import randint from random import seed from numpy import arange from numpy import mean from numpy import std from numpy import absolute from sklearn.datasets import make_regression from sklearn.linear_model import TheilSenRegressor from sklearn.model_selection import cross_val_score from sklearn.model_selection import RepeatedKFold from matplotlib import pyplot # 准备数据 定义 获取_数据集(): X, y = make_regression(n_samples=100, n_features=1, tail_strength=0.9, effective_rank=1, n_informative=1, noise=3, bias=50, random_state=1) # 添加一些人工异常值 seed(1) for i in range(10): factor = randint(2, 4) if random() > 0.5: X[i] += factor * X.std() else: X[i] -= factor * X.std() 返回 X, y # 评估模型 def evaluate_model(X, y, model): # 定义模型评估方法 cv = RepeatedKFold(n_splits=10, n_repeats=3, random_state=1) # 评估模型 scores = cross_val_score(model, X, y, scoring='neg_mean_absolute_error', cv=cv, n_jobs=-1) # 将分数强制为正数 return absolute(scores) # 绘制数据集和模型的最佳拟合线 def plot_best_fit(X, y, model): # 在所有数据上拟合模型 model.fit(X, y) # 绘制数据集 pyplot.scatter(X, y) # 绘制最佳拟合线 xaxis = arange(X.min(), X.max(), 0.01) yaxis = model.predict(xaxis.reshape((len(xaxis), 1))) pyplot.plot(xaxis, yaxis, color='r') # 显示图表 pyplot.title(type(model).__name__) pyplot.show() # 加载数据集 X, y = get_dataset() # 定义模型 model = TheilSenRegressor() # 评估模型 results = evaluate_model(X, y, model) print('平均 MAE: %.3f (%.3f)' % (mean(results), std(results))) # 绘制最佳拟合线 plot_best_fit(X, y, model) |
运行示例首先报告模型在该数据集上的平均 MAE。
我们可以看到 Theil Sen 回归在该数据集上实现了约 4.371 的 MAE,性能优于线性回归模型以及 RANSAC 和 Huber 回归。
1 |
平均 MAE: 4.371 (1.961) |
接下来,数据集以散点图的形式绘制,显示异常值,并叠加了算法的最佳拟合线。
在这种情况下,我们可以看到最佳拟合线与数据的主体对齐。

Theil Sen 回归最佳拟合线
比较鲁棒回归算法
现在我们熟悉了一些流行的鲁棒回归算法以及如何使用它们,我们可以看看如何直接比较它们。
在同一数据集上直接比较鲁棒回归算法进行实验会很有用。我们可以比较每种方法的平均性能,更重要的是,可以使用箱须图等工具来比较重复交叉验证折叠的分数分布。
完整的示例如下所示。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
# 在带异常值的回归数据集上比较鲁棒回归算法 from random import random from random import randint from random import seed from numpy import mean from numpy import std from numpy import absolute from sklearn.datasets import make_regression from sklearn.model_selection import cross_val_score from sklearn.model_selection import RepeatedKFold 来自 sklearn.linear_model 导入 LinearRegression from sklearn.linear_model import HuberRegressor from sklearn.linear_model import RANSACRegressor from sklearn.linear_model import TheilSenRegressor from matplotlib import pyplot # 准备数据 定义 获取_数据集(): X, y = make_regression(n_samples=100, n_features=1, tail_strength=0.9, effective_rank=1, n_informative=1, noise=3, bias=50, random_state=1) # 添加一些人工异常值 seed(1) for i in range(10): factor = randint(2, 4) if random() > 0.5: X[i] += factor * X.std() else: X[i] -= factor * X.std() 返回 X, y # 模型名称和模型对象的字典 定义 获取_模型(): models = dict() models['Linear'] = LinearRegression() models['Huber'] = HuberRegressor() models['RANSAC'] = RANSACRegressor() models['TheilSen'] = TheilSenRegressor() 返回 模型 # 评估模型 def evalute_model(X, y, model, name): # 定义模型评估方法 cv = RepeatedKFold(n_splits=10, n_repeats=3, random_state=1) # 评估模型 scores = cross_val_score(model, X, y, scoring='neg_mean_absolute_error', cv=cv, n_jobs=-1) # 将分数强制为正数 scores = absolute(scores) 返回 分数 # 加载数据集 X, y = get_dataset() # 检索模型 模型 = 获取_模型() results = dict() for name, model in models.items(): # 评估模型 results[name] = evalute_model(X, y, model, name) # 总结进度 print('>%s %.3f (%.3f)' % (name, mean(results[name]), std(results[name]))) # 绘制模型性能以供比较 pyplot.boxplot(results.values(), labels=results.keys(), showmeans=True) pyplot.show() |
运行示例会依次评估每个模型,报告每个模型的平均和标准差 MAE 分数。
注意:由于学习算法和评估程序的随机性,您的具体结果会有所不同。尝试运行示例几次。
我们可以看到这些分数与上一节报告的分数之间存在一些细微差别,尽管这些差别可能在统计学上显著,也可能不显著。鲁棒回归方法比线性回归表现更好的总体模式仍然成立,TheilSen 的性能优于其他方法。
1 2 3 4 |
>Linear 5.260 (1.149) >Huber 4.435 (1.868) >RANSAC 4.405 (2.206) >TheilSen 4.371 (1.961) |
创建了一个图,显示了总结每个评估算法结果分布的箱须图。
我们可以清楚地看到,鲁棒回归算法的分布位于并且延伸到比线性回归算法更低的位置。

鲁棒回归算法 MAE 分数的箱须图
基于它们最佳拟合线的图来比较鲁棒回归算法也可能很有趣。
下面的示例在同一张图中拟合每个鲁棒回归算法,并将其最佳拟合线绘制在整个训练数据集的散点图的上下文中。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
# 绘制多个鲁棒回归算法的最佳拟合线 from random import random from random import randint from random import seed from numpy import arange from sklearn.datasets import make_regression 来自 sklearn.linear_model 导入 LinearRegression from sklearn.linear_model import HuberRegressor from sklearn.linear_model import RANSACRegressor from sklearn.linear_model import TheilSenRegressor from matplotlib import pyplot # 准备数据 定义 获取_数据集(): X, y = make_regression(n_samples=100, n_features=1, tail_strength=0.9, effective_rank=1, n_informative=1, noise=3, bias=50, random_state=1) # 添加一些人工异常值 seed(1) for i in range(10): factor = randint(2, 4) if random() > 0.5: X[i] += factor * X.std() else: X[i] -= factor * X.std() 返回 X, y # 模型名称和模型对象的字典 定义 获取_模型(): models = list() models.append(LinearRegression()) models.append(HuberRegressor()) models.append(RANSACRegressor()) models.append(TheilSenRegressor()) 返回 模型 # 绘制数据集和模型的最佳拟合线 def plot_best_fit(X, y, xaxis, model): # 在所有数据上拟合模型 model.fit(X, y) # 计算域内网格的输出 yaxis = model.predict(xaxis.reshape((len(xaxis), 1))) # 绘制最佳拟合线 pyplot.plot(xaxis, yaxis, label=type(model).__name__) # 加载数据集 X, y = get_dataset() # 定义输入域内的均匀网格 xaxis = arange(X.min(), X.max(), 0.01) for model in get_models(): # 绘制最佳拟合线 plot_best_fit(X, y, xaxis, model) # 绘制数据集 pyplot.scatter(X, y) # 显示绘图 pyplot.title('稳健回归') pyplot.legend() pyplot.show() |
运行此示例将生成一个图,其中将数据集显示为散点图,并显示每种算法的最佳拟合线。
我们可以清楚地看到线性回归算法的离轴线,以及稳健回归算法更好地遵循数据主体部分的线。

稳健回归算法最佳拟合线比较
进一步阅读
如果您想深入了解,本节提供了更多关于该主题的资源。
API
- 线性模型,scikit-learn.
- sklearn.datasets.make_regression API.
- sklearn.linear_model.LinearRegression API.
- sklearn.linear_model.HuberRegressor API.
- sklearn.linear_model.RANSACRegressor API.
- sklearn.linear_model.TheilSenRegressor API.
文章
总结
在本教程中,您了解了机器学习的稳健回归算法。
具体来说,你学到了:
- 鲁棒回归算法可用于输入或目标值包含异常值的数据。
- 如何评估回归预测建模任务的鲁棒回归算法。
- 如何通过在数据集上拟合最佳拟合线来比较鲁棒回归算法。
你有什么问题吗?
在下面的评论中提出你的问题,我会尽力回答。
这是一个相当不错且有趣的线性回归工具教程。但是,它与机器学习有什么联系吗?
谢谢。
机器学习从统计学借鉴预测模型。因此,线性回归可以被称为机器学习。
更多信息在这里
https://machinelearning.org.cn/faq/single-faq/how-are-statistics-and-machine-learning-related
感谢介绍最后两个稳健模型
不客气。
Jason,这篇帖子很棒!我学到了很多。谢谢。
谢谢!
尊敬的Jason博士,
感谢这些教程。
在倒数第三个示例中
为什么您更喜欢 TheiSen 模型 4.371 (1.961),它大于 Huber 4.435 (1.868)?
谢谢你,
悉尼的Anthony
TheilSen 的误差较低,为 4.371 对 4.435。
尊敬的Jason博士,
谢谢,也很抱歉。
悉尼的Anthony
尊敬的Jason博士,
感谢这些教程。写得很清楚,解释也很到位。
不客气!
我从你这里学习永远不会厌倦。感谢你的帖子。
谢谢!
很棒的文章,我学到了很多!我想问一下——如果我们也想为观测值分配不同的权重,应该怎么做?例如,在 3-4 年的时间序列中,我们想为更近的观测值分配更多权重。你能指导我进一步阅读吗?谢谢!!
模型将以最小化误差的方式为您学习这些权重。这就是机器学习的全部意义。
我的意思是,如果你想比较本月和上个月的 12 个月斜率。在这种情况下,你希望斜率受早期观测值的影响较小。
线性模型将为每个滞后观测值学习一个单独的权重——如果你描述的权重是最佳的,模型就会找到它。
首先,感谢您发布这些有趣的方法。我想知道:是否可以将稳健回归插入聚类算法?也就是说,设置一个条件,使一组点属于一个回归估计量,或者基于一个回归量计算一个聚类,然后继续处理其他聚类(这些聚类会有其他回归量)。这或许可以通过为每个聚类设置一个容差角度来实现。拥有这样的功能将非常有趣。
不客气。
我不知道如何实现。但如果你有一些想法,也许可以尝试用原型来验证它们。
我也无法弄清楚如何做到。我猜也许可以通过迭代线性估计操作 N 次在 2D/3D 数组上来实现,其中 N 等于聚类的数量,例如,在 k-means 类型聚类中。但我不太明白在聚类算法代码的哪个位置需要更改什么来放置回归条件。
也许可以通过小型代码原型来探索你的想法,看看它是否可行。
很棒的教程
谢谢!
很棒的教程,感谢您和您在本网站上发表的其他教程。我想知道是否可以使用这些方法对 3D 数据集进行线性回归估计。非常感谢任何建议。谢谢
我看不出有什么理由不能。试试看。
关于如何绘制 3D 结果有什么建议吗?如何绘制最佳拟合平面?谢谢
是的,matplotlib 支持 3D 曲面图。请查看 API 文档。
好文!
我唯一的观察是,HuberRegressor 的速度似乎明显快于 TheilSenRegressor。
谢谢!
确实如此。
绝佳的教程。因为您的知识和善良,世界变得更美好了一点。🙂
你知道是否有任何 Python 库可以做到带 Huber 损失函数的 Lasso 回归吗?谢谢!
谢谢!
手头没有,抱歉。
Jason,这篇帖子很棒。我有一个相关的问题。如何处理数据不嘈杂但目标变量嘈杂的回归问题?我可以使用哪些回归算法?如何为回归去除嘈杂的目标变量?
我建议测试一套不同的算法,并找出最适合您数据集的算法。
如何从模型中获取系数?
调用模型的 get_params() 函数。
您是否可以将 Ransac/Thiel sen 等稳健算法应用于具有异常值且非平稳的时间序列数据?
理论上应该有效,但我没有看到任何现有库实现了这一点。
你好,
这是一篇精彩的读物。很棒的教程,对稳健回归和所有不同算法的解释都非常清晰。
我想知道稳健回归是否存在任何局限性?为什么不一直使用稳健回归,而是使用 OLS 回归模型?
谢谢!
(1) 算法更复杂 (2) 引入随机元素,例如 RANSAC,可能不是您想要的 (3) 模型具有与 OLS 不同的假设
嗨,Jason,
感谢您创建此摘要!我是一名心理学专业的学生,刚开始接触 Python 和统计分析,我想了解是否可以在 Python 中进行稳健的多重线性回归。您对此有什么想法吗?
谢谢!
Maria,以下内容可能对您感兴趣
https://machinelearning.org.cn/multivariate-adaptive-regression-splines-mars-in-python/
非常感谢 James。我认为这可能超出了我(我的需求)目前的理解范围,但我真的很感激 🙂
我在 ValueError Traceback (most recent call last) 中遇到了错误
~\AppData\Local\Temp/ipykernel_18720/1163480024.py in
45 X, y = get_dataset()
46 # define a uniform grid across the input domain
—> 47 xaxis = arange(X.min(), X.max(), 0.01)
48 for model in get_models()
49 # plot the line of best fit
~\Anaconda3\lib\site-packages\pandas\core\generic.py in __nonzero__(self)
1535 @final
1536 def __nonzero__(self)
-> 1537 raise ValueError(
1538 f”The truth value of a {type(self).__name__} is ambiguous. ”
1539 “Use a.empty, a.bool(), a.item(), a.any() or a.all().”
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
ValueError 回溯 (最近一次调用)
~\AppData\Local\Temp/ipykernel_18720/1163480024.py in
45 X, y = get_dataset()
46 # define a uniform grid across the input domain
—> 47 xaxis = arange(X.min(), X.max(), 0.01)
48 for model in get_models()
49 # plot the line of best fit
~\Anaconda3\lib\site-packages\pandas\core\generic.py in __nonzero__(self)
1535 @final
1536 def __nonzero__(self)
-> 1537 raise ValueError(
1538 f”The truth value of a {type(self).__name__} is ambiguous. ”
1539 “Use a.empty, a.bool(), a.item(), a.any() or a.all().”
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
你好 Juji…我很乐意帮忙,但我没有能力帮助你设置或调试你的工作站。
而且,我不是调试工作站和开发环境的专家。
我的材料通常面向那些了解自己工作站并知道如何安装软件的人。
请查看这些教程以设置你的环境
如何使用 Anaconda 设置用于机器学习和深度学习的 Python 环境
如何在 Mac OS X 上为机器学习和深度学习安装 Python 3 环境
如何使用 Python 3 创建用于机器学习开发的 Linux 虚拟机
如果问题持续存在,请考虑将你的问题和情况发布到 StackOverflow。
很棒的帖子,谢谢!请问在逻辑回归中是否存在这些稳健性技术的等效方法或使用方法?
谢谢!
你好 Thb…以下内容可能有助于澄清
https://www.scirp.org/journal/paperinformation.aspx?paperid=98625
这个话题非常有趣,就像你的所有帖子一样。这些 RobReg 模型在现实世界的 ML 用例中是什么样的?我们如何在数据集上利用它们?这些 RobReg 中的任何一个能否用于神经网络?谢谢!
你好 FabianB…请描述你正在考虑的“现实世界 ML 用例”,以便我们能更好地帮助你。
亲爱的 James,
感谢这篇出色的教程。OLS 回归给出了一个 R 平方值,我认为它是一个广义的“准确度估计”。你能为稳健模型获得 R 平方值吗,或者这是不可能的/概念上有缺陷的?
如果 R 平方值不是稳健模型的正确度量,是否有有用的等效项?
谢谢,
Stu
你好 Stu…你非常受欢迎!以下是针对此主题的出色讨论
https://stackoverflow.com/questions/60073531/is-it-appropriate-to-calculate-r-squared-of-robust-regression-using-rlm#:~:text=Now%20coming%20to%20the%20appropriateness,the%20formula%20for%20r%2Dsquared.
感谢 James,这确实非常有帮助。
感谢这篇帖子!
对于自变量或特征,推荐的缩放方法是什么?
使用均值和标准差进行缩放是否合理?还是使用中位数和四分位距更有意义?
你好 A Singh…你可能会觉得以下内容感兴趣
https://machinelearning.org.cn/how-to-improve-neural-network-stability-and-modeling-performance-with-data-scaling/