python - 如何对新实例进行分类预处理,使特征编码与Scikit-learn的模型一致?

标签 python machine-learning scikit-learn

我正在使用数据的多类分类创建模型,该模型具有 6 个特征。我正在使用 LabelEncoder 使用以下代码预处理数据。

#Encodes the data for each column.
def pre_process_data(self):
    self.encode_column('feedback_rating')
    self.encode_column('location')
    self.encode_column('condition_id')
    self.encode_column('auction_length')
    self.encode_column('model')
    self.encode_column('gb') 

#Gets the column using the column name, transforms the column data and resets
#the column
def encode_column(self, name):
    le = preprocessing.LabelEncoder()
    current_column = np.array(self.X_df[name]).tolist()
    self.X_df[name] = le.fit_transform(current_column)

当我想预测一个新实例时,我需要转换新实例的数据,以便特征与模型中的特征匹配相同的编码。有没有一种简单的方法可以实现这一目标?

此外,如果我想保留模型并检索它,是否有一种简单的方法来保存编码格式,以便使用它来转换检索到的模型上的新实例?

最佳答案

When I want to predict a new instance I need to transform the data of the new instance so that the features match the same encoding as those in the model. Is there a simple way of achieving this?

如果不完全确定你的分类“管道”是如何运作的,但你可以只对一些新数据使用适合的 LabelEncoder 方法 - le 将转换新数据,前提是标签是训练集中存在的标签。

from sklearn import preprocessing
le = preprocessing.LabelEncoder()

# training data
train_x = [0,1,2,6,'true','false']
le.fit_transform(train_x)
# array([0, 1, 1, 2, 4, 3])

# transform some new data
new_x = [0,0,0,2,2,2,'false']
le.transform(new_x)
# array([0, 0, 0, 1, 1, 1, 3])

# transform data with a new feature
bad_x = [0,2,6,'new_word']
le.transform(bad_x)
# ValueError: y contains new labels: ['0' 'new_word']

Also if I want to persist the model and retrieve it, then is there a simple way of saving the encoding format, in order to use it to transform new instances on the retrieved model?

您可以像这样保存模型/模型的一部分:

import cPickle as pickle
from sklearn.externals import joblib
from sklearn import preprocessing

le = preprocessing.LabelEncoder()
train_x = [0,1,2,6,'true','false']
le.fit_transform(train_x)

# Save your encoding
joblib.dump(le, '/path/to/save/model')
# OR
pickle.dump(le, open( '/path/to/model', "wb" ) )

# Load those encodings
le = joblib.load('/path/to/save/model') 
# OR
le = pickle.load( open( '/path/to/model', "rb" ) )

# Then use as normal
new_x = [0,0,0,2,2,2,'false']
le.transform(new_x)
# array([0, 0, 0, 1, 1, 1, 3])

关于python - 如何对新实例进行分类预处理,使特征编码与Scikit-learn的模型一致?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29171676/

相关文章:

python - Scrapy 代码无法接受 Python 脚本中的参数

python - 集成 MLFlow 的线性回归模型

c++ - LGPL 机器学习与随机森林 - C++

python-3.x - 具有自定义距离度量的“KD 树”

machine-learning - 在 iPython 控制台中保存脚本运行之间的参数

python - 使用 pandas 检测具有许多缺失值的数据的异常值

python - 在列表中搜索字符或字符串(如网站上的查找功能)

python - 如何优雅地将 Sklearn GridsearchCV 最佳参数传递给另一个模型?

python - 如何删除QTreeWidgetItem

python - 如何pickle sklearn Pipeline 中的各个步骤?