使用 Scikit-learn 进行加权线性回归

Posted

技术标签:

【中文标题】使用 Scikit-learn 进行加权线性回归【英文标题】:Weighted linear regression with Scikit-learn 【发布时间】:2016-05-16 04:17:51 【问题描述】:

我的数据:

State           N           Var1            Var2
Alabama         23          54              42
Alaska          4           53              53
Arizona         53          75              65

Var1Var2 是州级别的聚合百分比值。 N 是每个州的参与者数量。我想在Var1Var2 之间进行线性回归,并考虑N 作为Python 2.7 中sklearn 的权重。

一般线路是:

fit(X, y[, sample_weight])

假设使用 Pandas 将数据加载到 df 并且 N 变为 df["N"],我只是将数据放入以下行还是需要在将其用作 sample_weight 之前以某种方式处理 N在命令中?

fit(df["Var1"], df["Var2"], sample_weight=df["N"])

【问题讨论】:

这取决于您想如何衡量事物,但基本上,是的,您可以按原样使用这些值:亚利桑那州的数据将比阿拉斯加的数据加权得多。 (例如,如果 N 是标准差,您可能希望使用 1/N**2 作为权重)。 您可能希望确保您的数据都是浮点值,而不是整数。也许fit 会确保这一点,但文档没有提到这一点,所以你必须查看 scikit-learn 中的代码才能知道这一点。最好让自己漂浮起来。 我明白了,谢谢您的确认。我很奇怪你是怎么知道的?我试图在网上参考 scikit-learn 的文档,他们没有指定(或者我可能遗漏了一些东西)。 知道吗?线性回归/卡方拟合中的权重通常以相同的方式使用。参见 numpy 的 polyfit 或 scipy 的 curve_fit。 sci-kit learn 可能会将实际拟合分配给 polyfit 等。 【参考方案1】:

权重可以训练出对某些输入值更准确的模型(例如,错误成本更高)。在内部,权重 w 乘以损失函数中的残差 [1]:

因此,重要的是权重的相对比例。 N 可以按原样传递,如果它已经反映了优先级。统一缩放不会改变结果。

这是一个例子。在加权版本中,我们强调最后两个样本周围的区域,模型在那里变得更加准确。并且,正如预期的那样,缩放不会影响结果。

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

# Load the diabetes dataset
X, y = datasets.load_diabetes(return_X_y=True)
n_samples = 20

# Use only one feature and sort
X = X[:, np.newaxis, 2][:n_samples]
y = y[:n_samples]
p = X.argsort(axis=0)
X = X[p].reshape((n_samples, 1))
y = y[p]

# Create equal weights and then augment the last 2 ones
sample_weight = np.ones(n_samples) * 20
sample_weight[-2:] *= 30

plt.scatter(X, y, s=sample_weight, c='grey', edgecolor='black')

# The unweighted model
regr = LinearRegression()
regr.fit(X, y)
plt.plot(X, regr.predict(X), color='blue', linewidth=3, label='Unweighted model')

# The weighted model
regr = LinearRegression()
regr.fit(X, y, sample_weight)
plt.plot(X, regr.predict(X), color='red', linewidth=3, label='Weighted model')

# The weighted model - scaled weights
regr = LinearRegression()
sample_weight = sample_weight / sample_weight.max()
regr.fit(X, y, sample_weight)
plt.plot(X, regr.predict(X), color='yellow', linewidth=2, label='Weighted model - scaled', linestyle='dashed')
plt.xticks(());plt.yticks(());plt.legend();

(this transformation 似乎也需要将Var1Var2 传递给fit

【讨论】:

以上是关于使用 Scikit-learn 进行加权线性回归的主要内容,如果未能解决你的问题,请参考以下文章

使用 scikit-learn 训练线性回归模型后,如何对原始数据集中不存在的新数据点进行预测?

带加权样本的弹性网络回归或套索回归(sklearn)

scikit-learn的线性回归模型

拓端tecdat|R语言编程指导用线性模型进行臭氧预测: 加权泊松回归,普通最小二乘,加权负二项式模型,多重插补缺失值

局部加权线性回归(Local Weighted Linear Regression)+局部加权回归+局部线性回归

局部加权回归法是啥