为了解决这个问题,我会创建自己的PipeLine。
请考虑这个简单的示例,您可以根据自己的要求对其进行自定义和添加:
import copy
import pickle
from sklearn.ensemble import RandomForestRegressor
from sklearn.preprocessing import LabelEncoder
import pandas as pd
import numpy as np
class MyPipeline:
def __init__(self, column='zipcode', n_estimators=10, random_state=0):
# add any parameters as required
# customize as required
assert isinstance(column, str)
self.column = column
self.label_enc = LabelEncoder()
self.model = RandomForestRegressor(n_estimators=n_estimators,
random_state=random_state,
n_jobs=1)
def preprocess(self, x):
processed_x = copy.deepcopy(x)
processed_x[self.column] = self.label_enc.fit_transform(processed_x[self.column])
return np.array(processed_x)
def fit(self, x, y):
# also customize as required
transformed_x = self.preprocess(x)
print("X After Transform: \n{}\n".format(transformed_x))
self.model.fit(transformed_x, y)
def predict(self, unseen_x):
# also customize as required
processed_x = copy.deepcopy(unseen_x)
processed_x[self.column] = self.label_enc.transform(processed_x[self.column])
print("Unseen Data After Transform: \n{}\n".format(np.array(processed_x)))
return self.model.predict(np.array(processed_x))
测试
x = pd.DataFrame(columns=['blabla','zipcode'],
data=[[1, 'zipecode1'], [2,'zipecode2'], [3,'zipecode3'],
[4, 'zipecode4'], [5, 'zipecode5'], [6, 'zipecode6'],
[7, 'zipecode7'], [8, 'zipecode8'], [9, 'zipecode9']])
y = [10,20,30,40,50,60,70,80,90]
mypipeline = MyPipeline()
mypipeline.fit(x,y)
# save it for future work
with open('mypipeline.dat', 'wb') as pickle_file:
pickle.dump(mypipeline, pickle_file)
# retrieve it
with open('mypipeline.dat', 'rb') as pickle_file:
mypipeline_ = pickle.load(pickle_file)
# Here I am passing same x just to make sure it's doing proper transformation
result = mypipeline_.predict(x)
# the result
print("Results: {}".format(result))
输出
X After Transform:
[[1 0]
[2 1]
[3 2]
[4 3]
[5 4]
[6 5]
[7 6]
[8 7]
[9 8]]
Unseen Data After Transform:
[[1 0]
[2 1]
[3 2]
[4 3]
[5 4]
[6 5]
[7 6]
[8 7]
[9 8]]
Results: [12. 18. 28. 37. 47. 56. 69. 79. 82.]