【问题标题】:Mean squared error returning unreasonably high numbers均方误差返回不合理的高数字
【发布时间】:2018-08-07 06:49:02
【问题描述】:

我试图预测每部电影在 IMDb 上的利润。

我的数据框和特征如下:

   Actor1  Actor2  Actor3  Actor4   Day  Director  Genre1  Genre2  Genre3  \
0       0       0       0       0  19.0         0       0       0       0   
1       1       1       1       1   6.0         1       1       1       1   
2       2       2       2       2  20.0         2       0       2       2   
3       3       3       3       3   9.0         3       2       0      -1   
4       4       4       4       4   9.0         4       3       3       3   

   Language  Month  Production  Rated  Runtime  Writer    Year    BoxOffice  

0         1      0           0      0    118.0       0  2007.0   37500000.0  

1         2      1           1      0    151.0       1  2006.0  132300000.0  

2         1      1           2      1    130.0       2  2006.0   53100000.0  

3         1      2           1      0    117.0       3  2007.0  210500000.0  

4         4      3           3      2    117.0       4  2006.0  244052771.0 

我试图预测的值(目标)是 BoxOffice。

我正在按照原样关注 sklearn 的文档 (http://scikit-learn.org/stable/modules/generated/sklearn.metrics.mean_squared_error.html#sklearn.metrics.mean_squared_error)

from sklearn import preprocessing, linear_model
from sklearn.metrics import mean_squared_error, r2_score
from sklearn.model_selection import train_test_split, cross_val_score

X = dataset[:,0:16] # Features
Y = dataset[:,16] #Target

X_train, X_test, Y_train, Y_test = train_test_split(X,Y, test_size=0.33)

regr = linear_model.LinearRegression()
regr.fit(X_train,Y_train)
mean_squared_error(Y_test, regr.predict(X_test))

并且输出总是类似于:11385650623660550($11,385,650,623,660,500.00)

虽然 BoxOffice 的平均值为: 107989121

等等。

我尝试了多种不同的方法、交叉验证以及其他模型 (keras),感觉我已经尝试了所有方法。

返回的总和非常高,这让我怀疑问题不在于模型或数据,而是我缺少的其他东西。

【问题讨论】:

  • 您的模型似乎总是在猜测 0,这会导致非常高的 MSE。您提供的误差值的平方根正好在您规定的平均值附近。
  • 您好,我不认为是这种情况,因为如果我打印单个 preidcitions:a = regr.predict(X_test) print(a[0]) 我会得到例如:96267029
  • 也许你的模型真的很糟糕 :( MSE 很容易计算,你可以自己确认mean_squared_error 的输出来验证。这个错误与你的数据的数量级相匹配。不是不合理高考虑数据并假设一个可怕的模型。
  • 如中,没有什么可以从数据中学习的吗?与票房无关?在最坏的情况下,我难道不能为我的数据过度拟合我的模型并获得某种准确性吗?
  • 当前模型表现不佳的事实并不意味着没有什么可学的。您可以生成完美的线性数据,但仍然可以生成大量错误率极低的模型。这只是意味着需要调整一些东西。

标签: python machine-learning scikit-learn linear-regression


【解决方案1】:

我认为,您的问题与均方误差无关,而是模型本身。

对于您的分类特征,我建议您尝试另一种编码方法,例如 OneHotEncoder。 LabelEncoder 不是线性回归的好选择。

(欲了解更多信息:http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.OneHotEncoder.html

https://hackernoon.com/what-is-one-hot-encoding-why-and-when-do-you-have-to-use-it-e3c6186d008f)

在训练您的模型之前,请查看您的数字特征与目标变量的相关性,其中一些可能不相关,对于分类特征,您可以尝试不同的方法来分析它们与目标变量的关系(如箱线图)

线性回归需要连续变量,因此您可能还想尝试其他算法。只需确保您有足够的背景后再应用即可。

【讨论】:

  • 感谢您的意见,我会试一试,看看能不能得到更好的结果。我的问题是,为什么 OneHotEncoding 在每种情况下都不会更好?我们希望对分类数据进行编码并同时将它们视为数值的情况是什么? (日期?)
  • 这取决于哪种编码方法好。 Labelencode 可用于 {Yes,No} = {1,0} 或分类变量可以分层分类 {Good,Average,Bad} = {3,2,1} 的情况(这些只是其他情况可能需要的示例不同的方法)最后,为什么这种编码方法不适合线性回归让我们说英语=4和西班牙语=1,线性回归方程是y=ax1+...+c Eng: y=4a+...+c Span: y =1a+...+c 当语言是 eng y(目标变量)会更多,因为它是 4 当其他功能相同时不合逻辑,希望这会有所帮助。
【解决方案2】:

尝试标准化您的输出(或 Y)变量并将它们置于 0 和 1 之间。

【讨论】:

  • 这在一定程度上改善了结果,但我不明白为什么?我们不是将数据标准化,以便与其他数据相比,它都处于相同的“规模”上,但如果我只有一种类型的数据有什么好处?
  • 如果你规范化你的数据,你也将规范化你的 MSE。您是说标准化改善了您的错误超出了您的预期?
  • 这不一定是真的。您可以使用转换数据,然后使用 MinMaxScaler 对其进行逆变换。看看这个:scikit-learn.org/stable/modules/generated/…
  • 是的,这就是我所做的,对 MSE 进行逆变换。这使我的 MSE 从 0.0100734 下降到 $9,438,990.00 ,这是一个合理的结果。
【解决方案3】:

您能检查模型的准确性吗?我猜它非常低,因此您的均方误差很高。由于预测票房和实际票房之间的模型差异非常低并且平方变得更大。

rgr.score(X_test,Y_test)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-29
    • 1970-01-01
    • 2018-10-16
    • 2020-07-14
    • 2019-04-23
    • 2019-03-09
    • 2015-07-11
    相关资源
    最近更新 更多