STREAMLIT:ValueError:功能名称应与拟合期间传递的功能名称相匹配。特征名称的顺序必须与拟合时的顺序相同

问题描述 投票:0回答:1

我的 Streamlit 有一个错误(我使用 VS Code 编写代码),

我在我的笔记本上运行了几个预测模型(带有 Anaconda Navigator 的 Jupyter Notebook), 我下载了其中之一:

我的笔记本上的代码

lr = LinearRegression()
lr.fit(X_train,y_train)

from joblib import dump, load
dump(lr, 'LinearRegression.joblib') 

完成此操作后,我将排序后的 DataFrame 导入到 Streamlit 中,这是在启动模型之前对数据进行编码和标准化的代码,最后是模型本身。

我的 Streamlit 上的代码

df = pd.read_csv("df_clean.csv", low_memory = False, index_col = 0)
Linear_Regression = load('LinearRegression.joblib') 

# Separation 
target_1 = df["AttendanceTimeSeconds"]
df_att = df.drop(["AttendanceTimeSeconds"], axis=1)

X_train, X_test, y_train, y_test = train_test_split(df_att, target_1, test_size=0.20, random_state = 42)

X_train = X_train.reset_index(drop=True)
X_test = X_test.reset_index(drop=True)
y_train = y_train.reset_index(drop=True)
y_test = y_test.reset_index(drop=True)

columns = df_att.columns
num = df_att._get_numeric_data().columns
cat = list(set(columns) - set(num))
num= list(num)

# Standardisation 
sc = StandardScaler()

X_train[num] = sc.fit_transform(X_train[num])
X_test[num] = sc.transform(X_test[num])

# Encoding
ohe = OneHotEncoder(drop="first", sparse=False, handle_unknown='ignore')

X_train_encoded = ohe.fit_transform(X_train[cat])
X_test_encoded = ohe.transform(X_test[cat])

X_train_encoded = pd.DataFrame(data=X_train_encoded, columns=ohe.get_feature_names_out(cat))
X_test_encoded = pd.DataFrame(data=X_test_encoded, columns=ohe.get_feature_names_out(cat))

#Reconstitution of X_train and X_test
X_train = pd.concat ([X_train[num].reset_index(drop=True) , X_train_encoded.reset_index(drop=True)], axis =1)
X_test = pd .concat ([X_test[num].reset_index(drop=True), X_test_encoded.reset_index(drop=True) ], axis =1)

y_pred_lr = Linear_Regression.predict(X_test) # prédictions Linear Regression
 

但是,我的 Streamlit 页面上显示此错误消息。

Screenshot of my Streamlit page

我知道这是与我的变量相关的问题,它们在模型和数据帧之间没有相同的顺序。然而我用的DataFrame是一模一样的,分割、编码、标准化的代码也是一模一样的。所以我不明白列顺序的这种差异从何而来。

我尝试了另一种方法,在笔记本中完成分割、编码和标准化后,我下载并将 X_train、X_test、y_train 和 y_test 导入到我的 Streamlit 代码中:

Screenshot of my VS code

但我仍然收到相同的错误消息。

于是我去检查X_train中各列的显示:

笔记本

Screenshot of X_train columns from Notebook

流光

Screenshot of X_train columns from Streamlit

确实,列的顺序不一样,但这怎么可能呢?我的 Streamlit 中的 X_train 来自笔记本。这是我在笔记本中用于提取它的代码:

X_train.to_csv("X_train.csv")

在下载初始 DataFrame 或 X_train、X_test...DataFrame 时,或者使用 joblib 下载模型时,是否应该添加任何参数?

供您参考,在分割和编码之前,DataFrame 的形状为 (1295782, 18)。 分割和编码后: (1036625, 349) (259157, 349) (1036625,) (259157,)

因此,使用 joblib 似乎更相关,它可以更好地处理大量数据。

预先感谢您的帮助。

python jupyter-notebook linear-regression streamlit valueerror
1个回答
0
投票

为了确保训练模型中使用的特征能够在测试集中发挥作用,从 .joblib 文件加载训练后的模型后,您可以提取用于训练模型的特征(如下所示的

LR_features
)并将其与测试数据框,使它们包含相同的集合。

Linear_Regression = load('LinearRegression.joblib') 
LR_features = Linear_Regression.feature_names

接下来,我建议跳过标准化阶段,而是通过仅选择

LR_features
中列出的列来对测试数据帧进行子集化。这应该能够为您提供测试数据框和训练模型的相同列集。

希望这有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.