使用Pandas数据框计算均方根误差

5
我试图计算pandas数据框中的均方根误差。我查看了之前在stacked overflow上的链接,例如Python中的均方根误差和scikit learn文档http://scikit-learn.org/stable/modules/generated/sklearn.metrics.mean_squared_error.html。我希望有人能够指出我做错了什么。这是数据集。这是我的代码。
import pandas as pd
import numpy as np
sales = pd.read_csv("home_data.csv")

from sklearn.cross_validation import train_test_split
train_data,test_data = train_test_split(sales,train_size=0.8)

from sklearn.linear_model import LinearRegression
X = train_data[['sqft_living']]
y=train_data.price
#build the linear regression object
lm=LinearRegression()
# Train the model using the training sets
lm.fit(X,y)
#print the y intercept
print(lm.intercept_)
#print the coefficents
print(lm.coef_)

lm.predict(300)



from math import sqrt
from sklearn.metrics import mean_squared_error
y_true=train_data.price.loc[0:5,]
test_data=test_data[['price']].reset_index()
y_pred=test_data.price.loc[0:5,]
predicted =y_pred.as_matrix()
actual= y_true.as_matrix()
mean_squared_error(actual, predicted)

编辑

这是我成功的做法。我需要将测试数据集中的sqft living值从行转换为列。

from sklearn.linear_model import LinearRegression
X = train_data[['sqft_living']]
y=train_data.price
#build the linear regression object
lm=LinearRegression()
# Train the model using the training sets
lm.fit(X,y)

新代码

test_X = test_data.sqft_living.values
print(test_X)
print(np.shape(test_X))
print(len(test_X))
test_X = np.reshape(test_X, [4323, 1])
print(test_X)
from sklearn.metrics import mean_squared_error
from sklearn.metrics import explained_variance_score
MSE = mean_squared_error(y_true = test_data.price.values, y_pred = lm.predict(test_X))
MSE
MSE**(0.5)

1
训练数据或测试数据不再是pandas数据框,而是numpy.mdarray类型。 - Zero
你的代码没有预测任何东西:你只是将数据分成两部分,然后比较标签。由于这些部分大小不同,"mean_squared_error"无法进行比较。你能描述一下你希望这段代码做什么吗? - jakevdp
@jakevdp 我稍微修改了一下我的代码。我基于训练数据创建了一个线性回归模型。我想看看测试数据与预测训练数据的接近程度。 - Zaynaib Giwa
1个回答

16
你正在比较测试集标签和训练集标签。我认为你实际想要做的是将测试集标签与预测的测试集标签进行比较。
例如:
import pandas as pd
import numpy as np
from sklearn.metrics import mean_squared_error
from sklearn.linear_model import LinearRegression
from sklearn.cross_validation import train_test_split

sales = pd.read_csv("home_data.csv")
train_data, test_data = train_test_split(sales,train_size=0.8)

# Train the model
X = train_data[['sqft_living']]
y = train_data.price
lm = LinearRegression()
lm.fit(X, y)

# Predict on the test data
X_test = test_data[['sqft_living']]
y_test = test_data.price
y_pred = lm.predict(X_test)

# Compute the root-mean-square
rms = np.sqrt(mean_squared_error(y_test, y_pred))
print(rms)
# 260435.511036

请注意,scikit-learn通常可以处理Pandas的DataFrame和Series输入,无需显式转换为numpy数组。您问题中代码片段的错误与传递给mean_squared_error()的两个数组大小不同有关。


谢谢!我对你发布的代码进行了微调。我必须使用np.reshape来转换X_test。另外,您知道在pandas中使用双括号的重要性吗?我知道您可以使用它们选择多行。 - Zaynaib Giwa
7
df[['col']] 将返回一个数据框(DataFrame)。而 df['col'] 则会返回一个系列(Series)。 - jakevdp
我非常感谢你的帮助。谢谢。 - Zaynaib Giwa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接