【问题标题】:ValueError: matmul when trying to fit sklearn's linear regressor to pandas dataframe instansesValueError:matmul 尝试将 sklearn 线性回归拟合到 pandas 数据框实例时
【发布时间】:2020-03-30 23:56:15
【问题描述】:

我一直在尝试使用 sklearn 对一些虚拟数据执行简单的多元线性回归。我最初通过 sklearn.linear_model.LinearRegression.fit numpy 数组并不断收到此错误:

ValueError: matmul: Input operand 1 has a mismatch in its core dimension 0, with gufunc signature (n?,k),(k,m?)->(n?,m?) (size 2 is different from 1)

我认为这是由于我的数组转置或其他原因造成的一些错误,所以我提取了 tutorial that used pandas dataframes 并以相同的方式设置了我的代码:

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

VWC = np.array((0,0.2,0.4,0.6,0.8,1))
Sensor_Voltage = np.array((515,330,275,250,245,240))

X = np.column_stack((VWC,VWC*VWC))
df = pd.DataFrame(X,columns=["VWC","VWC2"])
target = pd.DataFrame(Sensor_Voltage,columns=["Volt"])

model = LinearRegression()
model.fit(df,target["Volt"])
x = np.linspace(0,1,30)
y = model.predict(x[:,np.newaxis])
plt.plot(VWC, Sensor_Voltage)
plt.plot(x,y,dashes=(3,1))
plt.title("Simple Linear Regression")
plt.xlabel("Volumetric Water Content")
plt.ylabel("Sensor response (4.9mV)")
plt.show()

我仍然得到以下回溯:

Traceback (most recent call last):
  File "C:\Users\Vivian Imbriotis\AppData\Local\Programs\Python\Python37\simple_linear_regression.py", line 16, in <module>
    y = model.predict(x[:,np.newaxis])
  File "C:\Users\Vivian Imbriotis\AppData\Local\Programs\Python\Python37\lib\site-packages\sklearn\linear_model\_base.py", line 225, in predict
    return self._decision_function(X)
  File "C:\Users\Vivian Imbriotis\AppData\Local\Programs\Python\Python37\lib\site-packages\sklearn\linear_model\_base.py", line 209, in _decision_function
    dense_output=True) + self.intercept_
  File "C:\Users\Vivian Imbriotis\AppData\Local\Programs\Python\Python37\lib\site-packages\sklearn\utils\extmath.py", line 151, in safe_sparse_dot
    ret = a @ b
ValueError: matmul: Input operand 1 has a mismatch in its core dimension 0, with gufunc signature (n?,k),(k,m?)->(n?,m?) (size 2 is different from 1)

我已经为此努力了好几个小时了,我只是不明白我做错了什么。

Scikit-learn、numpy、pandas 都是最新版本;这是在 python 3.7.3 上

已解决:我非常愚蠢并且误解了 np.newaxis 的工作原理。这里的目标是对数据进行二次拟合,所以我只需要更改:

x = np.linspace(0,1,30)
y = model.predict(x[:,np.newaxis])

x = np.columnstack([np.linspace(0,1,30),np.linspace(0,1,30)**2])
y = model.predict(x)

我确信有一种更优雅的方式来编写它,但是嗯。

【问题讨论】:

    标签: python pandas scikit-learn


    【解决方案1】:

    您使用 (6,2) 数据集的形状训练您的模型。如果您检查 df 的形状

    df.shape = (6,2).

    当您尝试预测时,您正在尝试使用不同形状的数据集。

    x.shape=(30,1)

    你需要的是使用正确的数据集形状。试试这个

    x = np.linspace((0,0),(1,1),30)
    y = model.predict(x) 
    

    【讨论】:

      【解决方案2】:

      我在使用 sklearn 和 LinearRegression 时也遇到了这个错误,原来问题是我将 Y 变量传递给第一个位置的 LinearRegression 对象,而将 X 变量传递给第二个位置。但实际上您首先传递 X 变量,然后传递 Y 变量 - 与您在 R 中使用 R 的 lm() 的顺序相反。

      希望有一天这可以帮助某人。

      【讨论】:

        猜你喜欢
        • 2018-05-08
        • 2020-04-09
        • 2018-11-18
        • 2020-07-21
        • 1970-01-01
        • 2014-05-05
        • 2016-04-25
        • 2020-10-22
        相关资源
        最近更新 更多