Python 带Scikit学习的加权线性回归

Python 带Scikit学习的加权线性回归,python,python-2.7,machine-learning,scikit-learn,regression,Python,Python 2.7,Machine Learning,Scikit Learn,Regression,我的数据: State N Var1 Var2 Alabama 23 54 42 Alaska 4 53 53 Arizona 53 75 65 Var1和Var2是州一级的聚合百分比值N是每个州的参与者人数。我想在Var1和Var2之间运行一个线性回

我的数据:

State           N           Var1            Var2
Alabama         23          54              42
Alaska          4           53              53
Arizona         53          75              65
Var1
Var2
是州一级的聚合百分比值
N
是每个州的参与者人数。我想在
Var1
Var2
之间运行一个线性回归,将
N
作为Python2.7中sklearn的权重

总的路线是:

fit(X, y[, sample_weight])
假设使用Pandas将数据加载到
df
,并且
N
变为
df[“N”]
,我是简单地将数据放入下一行,还是需要在将N用作命令中的
样本权重之前以某种方式进行处理

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

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

因此,重要的是权重的相对比例<代码>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();


(将
Var1
Var2
传递到
fit
似乎也是必要的)

这取决于您想如何衡量事物,但基本上,是的,您可以按原样使用值:亚利桑那州的数据将比阿拉斯加的数据加权更多。(例如,如果N是标准偏差,您可能希望使用
1/N**2
作为权重)。您可能希望确保数据都是浮点值,而不是整数。也许
fit
可以确保这一点,但文档中没有提到这一点,因此您必须查看scikit中的代码才能了解这一点。我知道了,谢谢你的确认。我真不知道你是怎么知道的?我试图参考scikit在线学习的文档,但他们没有具体说明(或者我遗漏了什么)。知道吗?线性回归/卡方拟合中的权重通常以相同的方式使用。看看numpy's或scipy's之类的东西。sci kit learn可能会将实际配件交给polyfit或类似公司。