我训练了一个Logistic模型,交叉验证并使用joblib模块将其保存到文件中。现在我想加载这个模型并用它预测新数据。 这是正确的方法吗?特别是标准化。我也应该在我的新数据上使用scaler.fit()吗?在我接下来的教程中,scaler.fit仅用于训练集,所以我在这里有点迷失。
这是我的代码:
#Loading the saved model with joblib
model = joblib.load('model.pkl')
# New data to predict
pr = pd.read_csv('set_to_predict.csv')
pred_cols = list(pr.columns.values)[:-1]
# Standardize new data
scaler = StandardScaler()
X_pred = scaler.fit(pr[pred_cols]).transform(pr[pred_cols])
pred = pd.Series(model.predict(X_pred))
print pred
答案 0 :(得分:16)
不,这是不正确的。应使用列车数据拟合所有数据准备步骤。否则,您冒着应用错误转换的风险,因为StandardScaler
估算的均值和方差可能在列车和测试数据之间有所不同。
同时训练,保存,加载和应用所有步骤的最简单方法是使用管道:
在培训中:
# prepare the pipeline
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.externals import joblib
pipe = make_pipeline(StandardScaler(), LogisticRegression)
pipe.fit(X_train, y_train)
joblib.dump(pipe, 'model.pkl')
预测:
#Loading the saved model with joblib
pipe = joblib.load('model.pkl')
# New data to predict
pr = pd.read_csv('set_to_predict.csv')
pred_cols = list(pr.columns.values)[:-1]
# apply the whole pipeline to data
pred = pd.Series(pipe.predict(pr[pred_cols]))
print pred