ValueError:X每个样本有29个特征;应为84个

2024-04-26 08:02:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个脚本,使用贷款俱乐部API来预测贷款是“全额支付”还是“注销”。我使用jobsciam持久化工具来构建这个模型。我遇到了一个ValueError,因为持久化模型中的列数与新原始数据中的列数之间存在差异。ValueError是由于为类别变量创建虚拟变量而导致的。模型中使用的列数是84,在本例中,使用新数据的列数是29。在

在生成虚拟变量时,新数据的列数需要为84列,但我不确定如何继续,因为从API获取新数据时,只有分类变量“homeOwnership”、“addrState”和“purpose”的所有可能值的子集。在

这是我目前正在测试的代码,从类别变量转换为虚拟变量开始,在模型实现时停止。在

#......continued

df['mthsSinceLastDelinq'].notnull().astype('int')
df['mthsSinceLastRecord'].notnull().astype('int')
df['grade_num'] = df['grade'].map({'A':0,'B':1,'C':2,'D':3})
df['emp_length_num'] = df['empLength']
df = pd.get_dummies(df,columns=['homeOwnership','addrState','purpose'])
# df = pd.get_dummies(df,columns=['home_ownership','addr_state','verification_status','purpose'])

# step 3.5 transform data before making predictions

df.drop(['id','grade','empLength','isIncV'],axis=1,inplace=True)
dfbcd = df[df['grade_num'] != 0]
scaler = StandardScaler()
x_scbcd = scaler.fit_transform(dfbcd)

# step 4 predicting

lrbcd_test = load('lrbcd_test.joblib')
ypredbcdfinal = lrbcd_test.predict(x_scbcd)

下面是错误消息

^{pr2}$

Tags: 数据模型testapidf类别numgrade
2条回答

新数据应该与用于训练和持久化原始模型的数据具有相同的列。如果新的数据中分类变量的唯一值的数量较少,请在完成后手动为这些变量添加列警察局的傻瓜()并将所有数据点的值设置为零。在

模型只有在获得所需的列数时才能工作。如果警察局的傻瓜无法在新数据上创建所有这些列,您应该手动创建。在

编辑

如果要在警察局的傻瓜()步骤,可以使用以下方法。 假设dfünewdata是应用后的数据帧警察局的傻瓜()tot the new dataset and df\u olddata是您应用时得到的数据警察局的傻瓜()在旧的数据集(用于培训)上,您只需执行以下操作:

df_newdata = df_newdata.reindex(labels=df_olddata.columns,axis=1)

这将自动创建df_newdata中缺少的列(与df_olddata相比),并将所有行的这些列的值设置为NaN。所以现在,您的新dataframe具有与原始dataframe相同的exct列。在

希望这有帮助

您可以尝试在测试数据对象lrbcd_test上使用x_scbcd[StandardScaler object]的transform方法吗?这将创建测试数据的特征表示。在

ypredbcdfinal = lrbcd_test.predict(x_scbcd.transform(x_scbcd))

相关问题 更多 >