【问题标题】:Residual plot diagnostic and how to improve the regression model残差图诊断以及如何改进回归模型
【发布时间】:2020-10-09 01:59:21
【问题描述】:

在为这个housing dataset 创建回归模型时,我们可以绘制残差与实际值的函数。

from sklearn.linear_model import LinearRegression

X = housing[['lotsize']]
y = housing[['price']]

model = LinearRegression()
model.fit(X, y)

plt.scatter(y,model.predict(X)-y)

我们可以清楚地看到,差异(预测 - 实际价值)对于较低的价格主要是正的,而对于较高的价格,差异是负的。

线性回归确实如此,因为模型针对 RMSE 进行了优化(因此不考虑残差的符号)。

但是在做KNN的时候

from sklearn.neighbors import KNeighborsRegressor
model = KNeighborsRegressor(n_neighbors = 3)

我们可以找到类似的情节。

在这种情况下,我们可以给出什么样的解释,以及如何改进模型。

编辑:我们可以使用所有其他预测器,结果相似。

housing = housing.replace(to_replace='yes', value=1, regex=True)
housing = housing.replace(to_replace='no', value=0, regex=True)
X = housing[['lotsize','bedrooms','stories','bathrms','bathrms','driveway','recroom',
        'fullbase','gashw','airco','garagepl','prefarea']]

下图是具有 3 个邻居的 KNN。有 3 个邻居,可能会出现过度拟合,我不明白为什么会出现这种趋势。

【问题讨论】:

    标签: python regression linear-regression knn


    【解决方案1】:

    如果你看合身:

    plt.scatter(X,y)
    plt.plot(X,model.predict(X), '--k')
    

    对于较高的 y 值,您会得到负值,因为在 x=8000 附近有一组数据,其中 y 值与您的预期相差很大。

    现在,如果您进行 knn,请记住您的自变量只是一维的,这意味着您正在根据您的手数定义邻居,并且您使用组的平均值作为预测值。对于 x=8000 左右的高异常值,它们将与低于它们的值组合在一起,使差异为负数

    如果你把它画出来:

    plt.scatter(X,y)
    plt.scatter(X,model.predict(X))
    

    如何改进模型?只有一个预测器,您无能为力,也许可以归类为lotsize,但我怀疑它会发生很大变化。您很可能需要其他变量来查看导致lotsize = 8000 左右的颠簸的原因,然后您可以更好地对因变量建模。

    【讨论】:

    • 感谢愚蠢狼的回答。您可以添加其他预测变量。它确实改变了很多结果。
    • 抱歉有一个错字,它不会改变太多的结果。
    • 在真实值函数中绘制残差时有明显的趋势。
    • 抱歉,您的问题非常广泛。查看数据,您看到的那些高价格值,它们可能是异常值,并且没有变量可以解释它。因此,无论是 knn 还是线性回归,没有什么可以将这些值与其他值区分开来
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-23
    相关资源
    最近更新 更多