我的 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 页面上显示此错误消息。
我知道这是与我的变量相关的问题,它们在模型和数据帧之间没有相同的顺序。然而我用的DataFrame是一模一样的,分割、编码、标准化的代码也是一模一样的。所以我不明白列顺序的这种差异从何而来。
我尝试了另一种方法,在笔记本中完成分割、编码和标准化后,我下载并将 X_train、X_test、y_train 和 y_test 导入到我的 Streamlit 代码中:
但我仍然收到相同的错误消息。
于是我去检查X_train中各列的显示:
笔记本
流光
确实,列的顺序不一样,但这怎么可能呢?我的 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 似乎更相关,它可以更好地处理大量数据。
预先感谢您的帮助。
为了确保训练模型中使用的特征能够在测试集中发挥作用,从 .joblib 文件加载训练后的模型后,您可以提取用于训练模型的特征(如下所示的
LR_features
)并将其与测试数据框,使它们包含相同的集合。
Linear_Regression = load('LinearRegression.joblib')
LR_features = Linear_Regression.feature_names
接下来,我建议跳过标准化阶段,而是通过仅选择
LR_features
中列出的列来对测试数据帧进行子集化。这应该能够为您提供测试数据框和训练模型的相同列集。
希望这有帮助。