gpt4 book ai didi

python - 管道预测 X 的形状与拟合期间的形状不同

转载 作者:行者123 更新时间:2023-11-30 09:17:58 25 4
gpt4 key购买 nike

我遇到了这个错误,我理解其含义,但不知道如何处理它。

这就是我所做的:

class PreProcessing(BaseEstimator, TransformerMixin):
def __init__(self):
pass

def transform(self, df):

#Here i select the features and transform them for exemple:
age_band=0
if age<=10
age_band=1
else #... etc to 90
age_band=9
....
other feature engineering
....
encoder = ce.BinaryEncoder(cols=selectedCols)
encoder.fit(df)
df = encoder.transform(df)

return df.as_matrix()

def fit(self, df, y=None, **fit_params):

return self

pipe = make_pipeline(PreProcessing(),
SelectKBest(f_classif,k=23),
RandomForestClassifier())

param_grid = {"randomforestclassifier__n_estimators" : [100,400],
"randomforestclassifier__max_depth" : [None],
"randomforestclassifier__max_leaf_nodes": [2,3,5],
"randomforestclassifier__min_samples_leaf":[3,5,8],
"randomforestclassifier__class_weight":['balanced'],
"randomforestclassifier__n_jobs":[-1]
}

grid_search = GridSearchCV(pipe,param_grid,cv=5,scoring='recall',verbose=1,n_jobs=15)

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

grid_search.fit(X_train,y_train)
grid_search.predict(X_test)

filename = 'myModel.pk'
with open(filename, 'wb') as file:
pickle.dump(grid_search, file)

所以这里的一切都很有魅力。但是使用真实世界数据:(不是火车测试文件)

modelfile = 'MyModel.pk'
with open(modelfile,'rb') as f:
loaded_model = pickle.load(f)

print("The model has been loaded...doing predictions now...")
predictions = loaded_model.predict(df)

我收到错误:ValueError: X 的形状与拟合期间的形状不同。

我的理解是,并非所有模式都在我的“真实文件”中表示,因为想象在我的火车文件中,我有“夫妇”列,其值为“是,不,我不知道”,然后是 ce。 BinaryEncoder 将创建将所有模态存储为二进制所需的尽可能多的列。但在我的现实生活文件中,我必须做出预测,我只对这些列“夫妇”值“是,否”所以最后,X 的形状与拟合过程中的形状不同......所以我假设要做的唯一一件事就是在预处理中创建 cols 值为 0 的所有缺失模式...

我想我错过了一些东西。

注意:训练和测试文件来自某个数据源。我需要预测的数据来自其他来源,因此我首先将这些真实数据“转换”为相同的 X_train/Test 格式,然后执行 model.preedit(df)。因此,我确信在 BinaryEncoder 之前,如果我在运行时记录 df 的形状,则 Preprocessing.transform() 在 BinaryEncoder 执行之后具有相同数量的列 (17),但在 BinaryEncoder 执行之后model.predict(X_test) 显示 df 为 41 列,而 model.predict(realData) 仅显示 31 列。

最佳答案

这似乎是您的“功能选择/创建”过程的问题。每次将一组新输入传递到管道时,您都会重新安装 BinaryEncoder。这意味着只要指定列中有不同数量的唯一值,您的代码就会因此错误而中断。

我的猜测是,如果您将 BinaryEncoder 保存为 PreProcessing 实例的一部分,那么这不会成为问题假设训练数据具有该列可以呈现的所有可能值。

class PreProcessing(BaseEstimator, TransformerMixin):
def __init__(self):
self.encoder = ce.BinaryEncoder(cols=selectedCols)

def fit(self, df, **kwargs):
self.encoder.fit(df)

def transform(self, df):
# ...
# No fitting, just transform
df = self.encoder.transform(df)
return df

更好的是,您可以将 BinaryEncoder 插入管道中,并将其完全排除在预处理之外吗?

pipe = make_pipeline(PreProcessing(),
BinaryEncoder(cols=selectedCols),
SelectKBest(f_classif,k=23),
RandomForestClassifier())

关于python - 管道预测 X 的形状与拟合期间的形状不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50218408/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com