如何为sklearn的线性回归预测添加范围

时间:2018-07-13 03:40:36

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

我想知道是否有一种方法可以在拟合模型之前为预测添加范围。

火车数据中有问题的变量从技术上讲是百分比得分,但是当我预测测试集时,我会得到负值或> 100的值。

目前,我正在手动将预测列表标准化。我也曾经剪掉负数和> 100,然后分配0和100。

但是,只有让fit函数知道此约束才有意义,对吧?

这是数据的示例行:

test_df = pd.DataFrame([[0, 40, 28, 30, 40, 22, 60, 40, 21, 0, 85, 29, 180, 85, 36, 741, 25.0]], columns=['theta_1', 'phi_1', 'value_1', 'theta_2', 'phi_2', 'value_2', 'theta_3', 'phi_3', 'value_3', 'theta_4', 'phi_4', 'value_4', 'theta_5', 'phi_5', 'value_5', 'sum_readings', 'estimated_volume'])

我一直在阅读,很多人认为这不是线性回归问题,但是他们的逻辑并不健全。另外,有人说可以应用对数刻度,但仅在与阈值进行比较的情况下才有效,即手动分类,即对逻辑回归问题使用线性回归!就我而言,我需要百分比,因为它们是必需的输出。

非常感谢您的反馈/想法。

1 个答案:

答案 0 :(得分:1)

某些算法不会提出超出范围的预测值,例如sklearn.neighbors.KNeighborsRegressor或sklearn.ensemble.RandomForestRegressor。

线性回归器可以给出超出目标范围的值,此处为示例:

from sklearn.ensemble import RandomForestRegressor
import numpy as np
from sklearn.linear_model import LinearRegression

y = np.linspace(0,1,100)
X = 2* y
X = X.reshape(-1,1)

>>>> rf.predict(np.array([[4.]])), lr.predict(np.array([[4.]]))
# (array([0.9979798]), array([2.]))

但是您可以使用一个技巧:您可以将[0,1]空间映射到[-inf,inf]空间,并在预测后返回初始空间。

以下是使用sigmoid的示例:

def sigmoid(x):
    return 1/(1+np.exp(-x))

def sigmoid_m1(x):
    return -np.log((1/x)-1)

rf = RandomForestRegressor()
lr = LinearRegression()
rf.fit(X,sigmoid_m1(y*0.9+0.05))
lr.fit(X,sigmoid_m1(y*0.9+0.05))
>>>> sigmoid(rf.predict(np.array([[4.]]))), sigmoid(lr.predict(np.array([[4.]])))
# (array([0.9457559]), array([0.99904361]))

使用这种解决方案要当心,因为您完全改变了数据的分布,并且会带来很多问题。