2017-03-27 56 views
0

我对这个coursera当然线性回归(https://www.coursera.org/specializations/machine-learning线性回归的过度拟合

我已经解决使用graphlab训练,但想尝试的经验和学习sklearn追求课程2。我为此使用了sklearn和熊猫。

该模型过度适用于数据。我怎样才能解决这个问题?这是代码。

这些是我得到的系数。

[-3.33628603e-13 1.00000000e + 00]

poly1_data = polynomial_dataframe(sales["sqft_living"], 1) 
poly1_data["price"] = sales["price"] 
model1 = LinearRegression() 
model1.fit(poly1_data, sales["price"]) 
print(model1.coef_) 
plt.plot(poly1_data['power_1'], poly1_data['price'], '.',poly1_data['power_1'], model1.predict(poly1_data),'-') 
plt.show() 

绘制的线是这样的。如你所见,它连接每个数据点。 enter image description here ,这是输入数据 enter image description here

+3

也许你想问你的问题上stats.stackexchange,因为它是不是一个真正的编程问题。 避免在线性回归中避免过度使用损失函数,通常使用Ridge或Lasso回归。 最后,如果你的训练和测试集之间有完美的相关性,我建议检查一下你是否使用相同的数据为两者;) – LoicM

+0

感谢您的建议,将在那里提出我的问题。另外,我只是试图从训练模型的系数中画出线。但是创建的这条线甚至不是一条直线。这是如何发生的?给定一个截距和一个斜坡。 –

+0

请为此提出一个单独的问题,说明您使用的代码,捕获您获得的内容以及它与预期结果的差异。 我(和其他很多人)会很乐意帮助! – LoicM

回答

2

我不会称之为过度拟合的曲线。我会说你没有做你认为你应该做的事。特别是,你忘了的1的列添加到您的设计矩阵,十,例如:

# generate some univariate data 
x = np.arange(100) 
y = 2*x + x*np.random.normal(0,1,100) 
df = pd.DataFrame([x,y]).T 
df.columns = ['x','y'] 

你做以下几点:

model1 = LinearRegression() 
X = df["x"].values.reshape(1,-1)[0] # reshaping data 
y = df["y"].values.reshape(1,-1)[0] 
model1.fit(X,y) 

导致:

plt.plot(df['x'].values, df['y'].values,'.') 
plt.plot(X[0], model1.predict(X)[0],'-') 
plt.show() 

enter image description here

相反,你要1周的一列添加到您的设计矩阵(X):

X = np.column_stack([np.ones(len(df['x'])),df["x"].values.reshape(1,-1)[0]]) 
y = df["y"].values.reshape(1,-1) 
model1.fit(X,y) 

和(后一些整形),您将获得:

plt.plot(df['x'].values, df['y'].values,'.') 
plt.plot(df['x'].values, model1.predict(X),'-') 
plt.show() 

enter image description here

+0

谢谢!这是我试图完成的练习,因为我只是开始回归。我看到我出错的地方。 –