我正在使用 pywebio 为我的机器学习程序创建一个小型脚本运行用户界面。当不使用小型 UI 时,运行线性回归
predict()
函数时不会出现任何错误。
UI 从用户处检索两个数字,an
'age'
和 a
'salary'
这两个数字被输入到 numpy 数组中,并且 numpy 数组已从一维数组重新调整为二维数组,因为我收到了有关 numpy 数组形状的错误。
现在,我收到一条错误消息当 sklearn 文档指出线性回归
predict()
方法始终获取“自身”和另一个特征时,
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.
错误信息表明你的线性回归模型
regr
在训练时被训练为接受了 2 个特征,但你却只提供了一个特征。虽然你在 UI 中收集了年龄和薪水,但
entry.reshape(-1, 1)
这一行却将数据转换为一个包含 2 行和 1 列的形状,这意味着它将年龄和薪水视为同一个特征的两个样本,而不是两个不同的特征。
要解决这个问题,你应该将
entry
重塑为具有 1 行和 2 列的形状,方法如下:
reshaped_entry = entry.reshape(1, -1)
这样一来,
reshaped_entry
将是一个包含 1 行和 2 列的二维数组,其中一列代表年龄,另一列代表薪水,这与你的线性回归模型期望的输入相匹配。
以下是更正后的代码:
import numpy as np
from sklearn.linear_model import LinearRegression
# ... (加载模型的代码)
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) # 重塑为 1 行和 2 列
estimate = regr.predict(reshaped_entry)
通过这个更改,你的代码应该可以正常工作,而不会出现
ValueError
。