保存的模型(随机森林)不能用作 "fresh fitted" 模型 - 类别变量问题
Saved model (random forest) doesn't work as "fresh fitted" model - problems with category variables
我在 scikit-learn(随机森林)中构建了一个模型并保存了它。然后我再次加载该模型并尝试将其应用于用于训练的同一数据集。我收到错误消息
"could not convert string to float"
因为我有几个类别变量。但是在我保存模型之前,我能够将这个模型应用于这个数据集而没有错误。问题似乎是关于这对类别变量的信息在我保存模型时没有保存。事实上,我对这些变量使用了 Labelencoder
。有什么方法可以保存有关这些类别变量的信息,以便保存的模型与 "fresh fitted" 模型一样有效?
提前致谢!
这是 pipeline
的典型用例。
将您的工作流程创建为单个管道,然后保存管道。
加载管道时,您可以直接获得对新数据的预测,无需编码。
此外,labelEncoder
不适用于转换输入数据。顾名思义,它是针对目标变量的。
如果您需要将分类变量转换为序数,请使用 OrdinalEncoder
。
玩具示例:
from sklearn.ensemble import RandomForestClassifier
from sklearn.preprocessing import OrdinalEncoder
from sklearn.compose import make_column_transformer
from sklearn.model_selection import train_test_split
from sklearn.pipeline import Pipeline
X = [[1, 'orange', 'yes'], [1, 'apple', 'yes'],
[-1, 'orange', 'no'], [-1, 'apple', 'no']]
y = [[1], [1], [0], [0]]
X_train, X_test, y_train, y_test = train_test_split(X, y,
random_state=42)
pipe = Pipeline(
[('encoder', make_column_transformer((OrdinalEncoder(), [1, 2]),
remainder='passthrough')),
# applies OrdinalEncoder using column transformer for 2nd and 3rd column
('rf', RandomForestClassifier(n_estimators=2,random_state=42))])
pipe.fit(X_train, y_train)
import joblib
joblib.dump(pipe, 'pipe.pkl')
loaded_pipe = joblib.load('pipe.pkl')
loaded_pipe.score(X_test, y_test)
我在 scikit-learn(随机森林)中构建了一个模型并保存了它。然后我再次加载该模型并尝试将其应用于用于训练的同一数据集。我收到错误消息
"could not convert string to float"
因为我有几个类别变量。但是在我保存模型之前,我能够将这个模型应用于这个数据集而没有错误。问题似乎是关于这对类别变量的信息在我保存模型时没有保存。事实上,我对这些变量使用了 Labelencoder
。有什么方法可以保存有关这些类别变量的信息,以便保存的模型与 "fresh fitted" 模型一样有效?
提前致谢!
这是 pipeline
的典型用例。
将您的工作流程创建为单个管道,然后保存管道。
加载管道时,您可以直接获得对新数据的预测,无需编码。
此外,labelEncoder
不适用于转换输入数据。顾名思义,它是针对目标变量的。
如果您需要将分类变量转换为序数,请使用 OrdinalEncoder
。
玩具示例:
from sklearn.ensemble import RandomForestClassifier
from sklearn.preprocessing import OrdinalEncoder
from sklearn.compose import make_column_transformer
from sklearn.model_selection import train_test_split
from sklearn.pipeline import Pipeline
X = [[1, 'orange', 'yes'], [1, 'apple', 'yes'],
[-1, 'orange', 'no'], [-1, 'apple', 'no']]
y = [[1], [1], [0], [0]]
X_train, X_test, y_train, y_test = train_test_split(X, y,
random_state=42)
pipe = Pipeline(
[('encoder', make_column_transformer((OrdinalEncoder(), [1, 2]),
remainder='passthrough')),
# applies OrdinalEncoder using column transformer for 2nd and 3rd column
('rf', RandomForestClassifier(n_estimators=2,random_state=42))])
pipe.fit(X_train, y_train)
import joblib
joblib.dump(pipe, 'pipe.pkl')
loaded_pipe = joblib.load('pipe.pkl')
loaded_pipe.score(X_test, y_test)