numpy ValueError:X有1个特征,但LinearRegression需要2个特征作为输入

nxagd54h  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(365)

我正在使用pywebio为我的机器学习程序创建一个小的脚本运行用户界面。当不使用小UI时,我在运行线性回归predict()函数时没有任何错误。
UI正在从用户那里检索两个数字,一个'age'和一个'salary'。这两个数字被输入到一个numpy数组中,当我收到numpy数组形状的错误时,numpy数组已经从1D数组整形为2D数组。
现在,当sklearn文档指出线性回归predict()方法总是得到“self”和另一个特征时,我得到了一个关于predict()方法只接收1个特征而不是2个特征的错误消息。我如何修复这个错误?
下面是我的UI代码:

age = int(input("Enter your age:", type=NUMBER))
salary = int(input("Enter your salary:", type=NUMBER))

entry = np.array([age, salary])
reshaped_entry = entry.reshape(-1, 1)

estimate = regr.predict(reshaped_entry)

字符串
下面是错误消息:

ValueError                                Traceback (most recent call last)
Input In [21], in <cell line: 22>()

Input In [21], in retirement_ui()

File ~\anaconda3\lib\site-packages\sklearn\linear_model\_base.py:362, in LinearModel.predict(self, X)
    348 def predict(self, X):
    349     """
    350     Predict using the linear model.
    351 
   (...)
    360         Returns predicted values.
    361     """
--> 362     return self._decision_function(X)

File ~\anaconda3\lib\site-packages\sklearn\linear_model\_base.py:345, in LinearModel._decision_function(self, X)
    342 def _decision_function(self, X):
    343     check_is_fitted(self)
--> 345     X = self._validate_data(X, accept_sparse=["csr", "csc", "coo"], reset=False)
    346     return safe_sparse_dot(X, self.coef_.T, dense_output=True) + self.intercept_

File ~\anaconda3\lib\site-packages\sklearn\base.py:585, in BaseEstimator._validate_data(self, X, y, reset, validate_separately, **check_params)
    582     out = X, y
    584 if not no_val_X and check_params.get("ensure_2d", True):
--> 585     self._check_n_features(X, reset=reset)
    587 return out

File ~\anaconda3\lib\site-packages\sklearn\base.py:400, in BaseEstimator._check_n_features(self, X, reset)
    397     return
    399 if n_features != self.n_features_in_:
--> 400     raise ValueError(
    401         f"X has {n_features} features, but {self.__class__.__name__} "
    402         f"is expecting {self.n_features_in_} features as input."
    403     )

ValueError: X has 1 features, but LinearRegression is expecting 2 features as input.

ldxq2e6h

ldxq2e6h1#

LinearRegression模型是在2列数据上训练的(大概是agesalary),所以任何要输入predict()方法的新数据也必须有2列。错误基本上是说模型需要2个特征/列的输入。
要使其工作,整形方法调用应该是.reshape(1, -1)
一个完整的例子来说明这一点:

from sklearn.linear_model import LinearRegression
from sklearn.datasets import make_regression
import numpy as np

X, y = make_regression(n_features=2)
regr = LinearRegression().fit(X, y)
entry = np.array([5, 50])

reshaped_entry = entry.reshape(-1, 1)      # <---- ValueError
reshaped_entry = entry.reshape(1, -1)      # <---- OK
estimate = regr.predict(reshaped_entry)

字符串
这是因为给定一个看起来像array([5, 50])的数组,.reshape(-1, 1)将其转换为以下内容(单个列/列向量):

array([[ 5],
       [50]])


.reshape(1, -1)将其转换为(两列/行向量):

array([[ 5, 50]])


这是所需的形状。
如果您得到相同的错误,但具有意外的高数量的功能,

ValueError: X has 1 features, but LinearRegression is expecting 5 features as input.


那么有可能你一开始就给模型输入了一个形状不正确的输入,特别是如果输入应该有一个单一的特征。
下面的例子说明了这一点。将shape(1,5)的数组传递给模型,而不是shape(5,1)的数组,这样模型现在需要5个特征而不是1个。然后,当我们尝试使用1个特征进行预测时,我们会得到一个错误。要解决这个问题,请使用正确形状的输入重新拟合模型。

import pandas as pd
from sklearn.linear_model import LinearRegression

ar = pd.DataFrame([[1, 1], [2, 1], [3, 3], [4, 5], [5, 6]]).to_numpy()

X, y = [ar[:, 0]], [ar[:, 1]]            # <--- wrong shaped X (shape=(1, 5))
regr = LinearRegression().fit(X, y)
estimate = regr.predict([[22500]])       # <--- ValueError

X, y = ar[:, [0]], ar[:, 1]              # <--- correct shaped X (shape=(5, 1))
regr = LinearRegression().fit(X, y)
estimate = regr.predict([[22500]])       # <--- OK

相关问题