手动和 cross_val_score 预测的 Python 不同结果

Posted

技术标签:

【中文标题】手动和 cross_val_score 预测的 Python 不同结果【英文标题】:Python different results for manual and cross_val_score prediction 【发布时间】:2018-07-20 03:29:18 【问题描述】:

我有一个问题,我正在尝试实现KFoldcross_val_score。 我的目标是计算mean_squared_error,为此我使用了以下代码:

from sklearn import linear_model
import numpy as np
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import KFold, cross_val_score

x = np.random.random((10000,20))
y = np.random.random((10000,1))

x_train = x[7000:]
y_train = y[7000:]

x_test = x[:7000]
y_test = y[:7000]

Model = linear_model.LinearRegression()
Model.fit(x_train,y_train)

y_predicted  = Model.predict(x_test)

MSE = mean_squared_error(y_test,y_predicted)
print(MSE)

kfold = KFold(n_splits = 100, random_state = None, shuffle = False)

results = cross_val_score(Model,x,y,cv=kfold, scoring='neg_mean_squared_error')
print(results.mean())

我觉得这里没问题,我得到了以下结果:

结果:0.0828856459279 和 -0.083069435946

但是当我尝试在其他示例(来自 Kaggle 房价的数据)上执行此操作时,它无法正常工作,至少我认为是这样..

train = pd.read_csv('train.csv')

Insert missing values...
...

train = pd.get_dummies(train)
y = train['SalePrice']
train = train.drop(['SalePrice'], axis = 1)

x_train = train[:1000].values.reshape(-1,339)
y_train = y[:1000].values.reshape(-1,1)
y_train_normal = np.log(y_train)

x_test = train[1000:].values.reshape(-1,339)
y_test = y[1000:].values.reshape(-1,1)

Model = linear_model.LinearRegression()
Model.fit(x_train,y_train_normal)

y_predicted = Model.predict(x_test)
y_predicted_transform = np.exp(y_predicted)

MSE = mean_squared_error(y_test, y_predicted_transform)
print(MSE)

kfold = KFold(n_splits = 10, random_state = None, shuffle = False)

results = cross_val_score(Model,train,y, cv = kfold, scoring = "neg_mean_squared_error")
print(results.mean())

在这里我得到以下结果:0.912874946869-6.16986926564e+16

显然,“手动”计算的mean_squared_error 与通过KFold 计算的mean_squared_error 不同。

我对我犯错的地方感兴趣?

【问题讨论】:

请不要做import ...,明确写包。只需要几行代码就可以帮助记录任何可能回复的人 我更正了 【参考方案1】:

差异是因为,与您的第一种方法(训练/测试集)相比,在您的 CV 方法中,您使用 unnormalized y 数据来拟合回归,因此您的 MSE 很大。要获得可比较的结果,您应该执行以下操作:

y_normal = np.log(y)
y_test_normal = np.log(y_test)

MSE = mean_squared_error(y_test_normal, y_predicted) # NOT y_predicted_transform
results = cross_val_score(Model, train, y_normal, cv = kfold, scoring = "neg_mean_squared_error")

【讨论】:

我试过了,但结果还是不一样。926.857139601-7.68871709526e+13 还是谢谢你。 @DejanSamardžija 很难说清楚,因为您甚至没有显示数据样本;您可能还需要在 CV 案例中执行一些 reshape 操作。无论如何,请确保两种情况下数据的格式相同

以上是关于手动和 cross_val_score 预测的 Python 不同结果的主要内容,如果未能解决你的问题,请参考以下文章

sklearn cross_val_score 的准确性低于手动交叉验证

cross_val_score的用法

sklearn中模型评估和预测

使用joblib在sklearn中重用由cross_val_score拟合的模型

matlab中自动预测和手动预测的区别

cross_val_score 和 gridsearchCV 是如何工作的?