scikit-learn:如何缩减“y”预测结果

Posted

技术标签:

【中文标题】scikit-learn:如何缩减“y”预测结果【英文标题】:scikit-learn: how to scale back the 'y' predicted result 【发布时间】:2016-10-29 18:02:35 【问题描述】:

我正在尝试使用波士顿住房数据集来学习 scikit-learn 和机器学习。

# I splitted the initial dataset ('housing_X' and 'housing_y')
from sklearn.cross_validation import train_test_split
X_train, X_test, y_train, y_test = train_test_split(housing_X, housing_y, test_size=0.25, random_state=33)

# I scaled those two datasets
from sklearn.preprocessing import StandardScaler
scalerX = StandardScaler().fit(X_train)
scalery = StandardScaler().fit(y_train)
X_train = scalerX.transform(X_train)
y_train = scalery.transform(y_train)
X_test = scalerX.transform(X_test)
y_test = scalery.transform(y_test)

# I created the model
from sklearn import linear_model
clf_sgd = linear_model.SGDRegressor(loss='squared_loss', penalty=None, random_state=42) 
train_and_evaluate(clf_sgd,X_train,y_train)

基于这个新模型clf_sgd,我试图根据X_train的第一个实例来预测y

X_new_scaled = X_train[0]
print (X_new_scaled)
y_new = clf_sgd.predict(X_new_scaled)
print (y_new)

但是,结果对我来说很奇怪(1.34032174,而不是20-30,房子的价格范围)

[-0.32076092  0.35553428 -1.00966618 -0.28784917  0.87716097  1.28834383
  0.4759489  -0.83034371 -0.47659648 -0.81061061 -2.49222645  0.35062335
 -0.39859013]
[ 1.34032174]

我想这个1.34032174 值应该缩小,但我试图弄清楚如何做到这一点但没有成功。欢迎任何提示。非常感谢。

【问题讨论】:

我认为您不需要对目标变量应用缩放。缩放和其他特征工程技术仅应用于特征向量。 【参考方案1】:

游戏有点晚了: 只是不要缩放你的 y。通过缩放 y,您实际上会松开您的单位。回归或损失优化实际上是由特征之间的相对差异决定的。顺便说一句,对于房价(或任何其他货币价值),取对数是常见的做法。然后你显然需要做一个 numpy.exp() 来回到实际的美元/欧元/日元......

【讨论】:

【参考方案2】:

您可以通过scalery 对象使用inverse_transform

y_new_inverse = scalery.inverse_transform(y_new)

【讨论】:

谢谢。有用。事实上(而且很明显),结果与 'y_train' 的值完全相同。 现在还有一个元估计器可以自动处理这个问题,请参阅TransformedTargetRegressor

以上是关于scikit-learn:如何缩减“y”预测结果的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 scikit-learn PCA 进行特征缩减并知道哪些特征被丢弃

scikit-learn 回归预测结果太好了。我搞砸了啥?

scikit-learn的线性回归模型

scikit-learn MLPRegressor 预测结果总是变化且不一致

scikit-learn画ROC图

Scikit-Learn SVR 预测总是给出相同的值