保存的模型(随机森林)不能作为“新鲜拟合”模型工作 - 类别变量的问题

Posted

技术标签:

【中文标题】保存的模型(随机森林)不能作为“新鲜拟合”模型工作 - 类别变量的问题【英文标题】:Saved model (random forest) doesn't work as "fresh fitted" model - problems with category variables 【发布时间】:2020-09-13 01:54:53 【问题描述】:

我在 scikit-learn(随机森林)中建立了一个模型并保存了它。然后我再次加载这个模型并尝试将它应用到用于训练的同一数据集。我收到错误消息

“无法将字符串转换为浮点数”

因为我有几个类别变量。但是在我保存模型之前,我能够将这个模型应用到这个数据集而没有错误。问题似乎是关于这两个类别变量的信息在我保存模型时没有保存。事实上,我对这些变量使用了Labelencoder。有什么方法可以保存有关这些类别变量的信息,以便保存的模型与“新装”模型一样工作? 提前致谢!

【问题讨论】:

【参考方案1】:

这是 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)

【讨论】:

以上是关于保存的模型(随机森林)不能作为“新鲜拟合”模型工作 - 类别变量的问题的主要内容,如果未能解决你的问题,请参考以下文章

保存的随机森林模型在同一数据集上产生不同的结果

在火花簇scala中保存随机森林模型时出错

使用 python sklearn 增量训练随机森林模型

腌制随机森林模型的混淆矩阵

随机森林似乎不能处理超过 32 类因素。我该怎么做才能在训练我的模型时包含这些因素?

有没有办法在 Android 上使用随机森林模型进行预测?