【问题标题】:Scikit-learn: My linear regression is not a straight line, it is messyScikit-learn:我的线性回归不是一条直线,它是凌乱的
【发布时间】:2020-04-07 19:13:30
【问题描述】:

我试图简单地绘制一条回归线,但是我得到了凌乱的线条。是因为我为模型安装了 2 个特征,所以唯一合适的可视化是 3d 平面?

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_boston
from sklearn.linear_model import LinearRegression

# prepare data
boston = load_boston()
X = pd.DataFrame(boston.data, columns=boston.feature_names)[['AGE','RM']]
y = boston.target

# split dataset into training and test data
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.20, random_state=33)

# apply linear regression on dataset
lm = LinearRegression()
lm.fit(X_train, y_train)
pred_train = lm.predict(X_train)
pred_test = lm.predict(X_test)

#plot relationship between RM and price
plt.scatter(X_train['RM'],
            y_train,
            c='g',
            s=40,
            alpha=0.5)
plt.plot(X_train['RM'], pred_train, color='r')
plt.title('Relationship between RM and Price')
plt.ylabel('Price')
plt.xlabel('RM')

【问题讨论】:

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


    【解决方案1】:

    你是对的。您正在训练多个功能,即 AGE 和 RM。但是你正在绘制一个只有一个特征的二维图,即 RM。尝试获得 3D 情节。通常,具有两个特征的线性回归会产生一个平面。这仍然是一个线性回归。这就是我们使用“超平面”一词的原因。它解析为单个特征的线,两个特征的平面等等。

    这是 3D 的输出:

    plt3d = plt.figure().gca(projection='3d')
    plt3d.view_init(azim=135)
    plt3d.plot_trisurf(X_train['RM'].values, X_train['AGE'].values, pred_train, alpha=0.7, antialiased=True)
    

    【讨论】:

      【解决方案2】:

      问题在于,当您绘制时,您必须对参数进行排序。

      'plt.plot(np.sort(X_train['RM']), np.sort(pred_train), color='r')'

      import numpy as np
      import pandas as pd
      import matplotlib.pyplot as plt
      from sklearn.datasets import load_boston
      from sklearn.linear_model import LinearRegression
      
      # prepare data
      boston = load_boston()
      X = pd.DataFrame(boston.data, columns=boston.feature_names)[['AGE','RM']]
      y = boston.target
      
      # split dataset into training and test data
      from sklearn.model_selection import train_test_split
      X_train, X_test, y_train, y_test = train_test_split(
          X, y, test_size=0.20, random_state=33)
      
      # apply linear regression on dataset
      lm = LinearRegression()
      lm.fit(X_train, y_train)
      pred_train = lm.predict(X_train)
      pred_test = lm.predict(X_test)
      
      #plot relationship between RM and price
      plt.scatter(X_train['RM'],
                  y_train,
                  c='g',
                  s=40,
                  alpha=0.5)
      plt.plot(np.sort(X_train['RM']), np.sort(pred_train), color='r')
      plt.title('Relationship between RM and Price')
      plt.ylabel('Price')
      plt.xlabel('RM')
      plt.show()
      

      结果: output-plot

      如果你做一个 3d 绘图,你可能会很容易地看到协变量 RM 和年龄之间的关系3d-plot

      【讨论】:

      猜你喜欢
      • 2019-05-14
      • 2017-12-25
      • 2018-07-31
      • 2016-05-10
      • 2021-04-01
      • 2017-03-26
      • 2016-07-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多