scikit-learn报”ValueError: The number of features in X is different from the number of features of the fitted data. The model has {n_features} features and the training data has {n_train_features} features.”的原因以及解决办法

  • Post category:Python

这个错误通常是由于用于预测的特征数据中包含了与拟合模型时使用的特征数量不相符的特征,或者因为没有在预测时正确地缩放数据而导致了特征数量不匹配的问题。

scikit-learn模型在拟合数据时会通过训练集中的特征数量记录模型的特征数量。如果在进行预测时数据中的特征数量与训练数据中的特征数量不一致,则会产生上述错误。

为了解决这个问题,可以执行以下操作:

  1. 确保用于预测的特征数据包含与拟合模型时使用的特征数量相同的特征列。可以使用df.columns方法来查看数据框中所有的列,从而确定是否存在不匹配的列名。

  2. 如果使用了数据缩放器(例如StandardScaler),则必须使用相同的缩放器在预测时缩放新的特征数据。可以使用fit_transform方法在训练集上拟合并缩放数据,在测试集上仅使用transform方法来缩放数据。

下面提供一个例子,演示了如何使用一个标准化器在训练集上拟合并缩放数据,并在测试集上仅使用transform方法来缩放数据:

from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression

# 假设我们有一个训练集 X_train 和一个测试集 X_test,以及对应的目标变量 y_train 和 y_test,

# 使用标准化器对训练集数据进行拟合和缩放
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)

# 用相同的标准化器对测试集数据进行缩放
X_test_scaled = scaler.transform(X_test)

# 训练和评估模型
model = LogisticRegression()
model.fit(X_train_scaled, y_train)
score = model.score(X_test_scaled, y_test)

通过这种方式缩放数据,可以确保新的输入数据包含与模型拟合时使用的特征数量相匹配的特征,并且此特征的缩放也与原始测试集数据匹配。