我正在使用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.
型
1条答案
按热度按时间ldxq2e6h1#
LinearRegression模型是在2列数据上训练的(大概是
age
和salary
),所以任何要输入predict()
方法的新数据也必须有2列。错误基本上是说模型需要2个特征/列的输入。要使其工作,整形方法调用应该是
.reshape(1, -1)
。一个完整的例子来说明这一点:
字符串
这是因为给定一个看起来像
array([5, 50])
的数组,.reshape(-1, 1)
将其转换为以下内容(单个列/列向量):型
而
.reshape(1, -1)
将其转换为(两列/行向量):型
这是所需的形状。
如果您得到相同的错误,但具有意外的高数量的功能,
型
那么有可能你一开始就给模型输入了一个形状不正确的输入,特别是如果输入应该有一个单一的特征。
下面的例子说明了这一点。将shape(1,5)的数组传递给模型,而不是shape(5,1)的数组,这样模型现在需要5个特征而不是1个。然后,当我们尝试使用1个特征进行预测时,我们会得到一个错误。要解决这个问题,请使用正确形状的输入重新拟合模型。
型